您的位置:首页 > 其它

VC操作Word书签模板

2016-08-19 16:14 309 查看
VC操作Word书签模板

一 制作模板
 

1 新建一个文档,设置文档内容。对于循环的部分,建议放到表格内,这样容易定位、选择、复制、粘贴。

2 将鼠标定位到要插入书签的位置,从菜单上,“插入”->“书签,弹出对话框,输入书签名,点击“添加”按钮。



插入以下书签:order_num,报告日期_,报表模板__,name,age,结论__

 其中,报表模板__,用于定位模板表格。可有可无,没有时,默认表格1。

完成后,所有书签的名称和位置如下图所示:



3 保存模板,比如“word书签模板.doc”

 

二 添加word 类型库

通过类向导MFC ClassWizard,从菜单上 View->ClassWizade,打开ClassWizade窗口,选择Add Class->From a type library...,,浏览找到office 2003安装路径下的msword.olb文件,例如:"C:\Program Files\Microsoft Office\OFFICE11\MSWORD.OLB",然后选择以下类,这些类形成文件 msword.h和msword.cpp,并自动加入到工程中。







其中必须的:

_Application,Documents,_Document ,Selection,

我这里用到的:

 Tables,Table,Rows,Row,Columns,Column,Cells,Cell,Bookmarks,Bookmark,Range,

也可能用到的:

 Borders,Border,Window,_ParagraphFormat,Shapes,

 PageSetup,Shape,InlineShapes,InlineShape,Fields,View,_Font

 

三 为了操作简单,基于msword.h 和  msword.cpp,再次封装成一个类对应wordWork.h 和 wordWork.cpp,并加入到工程中。其内容附加到后面附录部分。

另外,由于多个类都有table,row等等,为了区别起见,将类放到命名空间内加以区别,方法如下:

1 头文件msword.h中将类放到命名空间内

namespace ms_word//将整体放入命名空间

{

 class _Application : public COleDispatchDriver

 {

 public:

 _Application() {}  // Calls COleDispatchDriver default constructor

 .....

 };

 class Tables : public COleDispatchDriver

 {

 public:

 Tables() {}  // Calls COleDispatchDriver default constructor

 .....

 };

 ......

}//end namespace ms_word

2 实现文件msword.cpp内引入命名空间

#include "stdafx.h"

#include "msword.h"

using namespace ms_word;//引入命名空间

LPDISPATCH _Application::GetApplication()

{

 LPDISPATCH result;

 InvokeHelper(0x3e8, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);

 return result;

}

long Tables::GetCount()

{

 long result;

 InvokeHelper(0x2, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);

 return result;

}

........

3 在使用的文件内加入头文件,

#include "msword.h"

然后类名加入限定空间,即可加以区别

 ms_word::Tables m_tables;

四 编译执行
  在你的函数内调用这些方法,编译运行结果如下:

 

 

五 主要的代码如下:

1 添加word 类型库 MSWORD.OLB

  

2 在使用的程序中,加入以下语句

#include "wordWork.h"

 char ch[90];

#define say(x) AfxMessageBox(x)

===== 1 主操作代码 ===

void wordTxtBookmark(WordMain wdMain,CString BookMark="",CString strText="",bool addLine=false,bool mulitLine=false)

{

 if ( BookMark !="" )

 {

     if (  !wdMain.GotoBookmark(BookMark) )  return;//没有书签就返回,不要写

 }

 if ( strText !="" )

 {

  if (mulitLine)

  {//前提条件是,本书签上面有一空行,否则影响上面行的位置

        //正序,插入多行

   wdMain.MoveUp(1);//移到书签的上面一行

   wdMain.EndKey();//移动到上面行的行尾

   wdMain.Enter(1);//打回车,加一行,相当于把书签下移一行,以便后面查到书签时已经下移

  }

  wdMain.GetRange(0, 0, 0, 0);//不要选择任何字符,否则会吃掉第一个字符

  wdMain.SetTextHAlignment(WD_LEFT);

  //wdMain.SetTableBorderLine(WD_EDGE_BOTTOM, WD_LINESTYLE_SINGLE);

  wdMain.SetItemText( strText);

 }

 if (addLine)

 {//增加一个空白行,以便与上行分开

  wdMain.Enter(1);

 }

}

 

void wordPicText(WordMain wdMain,CString strPic,CString strText,bool addLine=true)

{

//picture

 BOOL bInsertPic;

 wdMain.Enter(1);//加一行

 wdMain.MoveUp(1);//再次回到上面,相当于插入一行,否则会向后错,吃掉后面的行

 wdMain.SetTextHAlignment(WD_CENTER);//居中

 {

  bInsertPic = wdMain.InsertPicture(strPic, 404.5, 248.3); 

 }

//text

 if (strText!="")

 {

  wdMain.Enter(1);

  wdMain.GetRange(0, 0, 0, 0);//不要选择任何字符,否则会吃掉第一个字符

  wdMain.SetTextHAlignment(WD_CENTER);//居中

  wdMain.SetItemText( strText);

 } 

//add line 

 if (addLine)

 {//增加一个空白行,以便与上行分开

  wdMain.Enter(1);

  wdMain.Enter(1);///与后面的隔开

 }

}

void SetNameCellValue(CString list[])

{

 COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

 

 WordMain wdMain;CString strGet;

 MyFont wdFont;

 MyPageSet wdPageSet;

 CString doc_template_name,t_mc,docname;

 docname.Format("c:\\i22i.doc");

 doc_template_name.Format("c:\\ii.doc" );

 wdMain.Open(doc_template_name);

 wdMain.PageSet(wdPageSet);

 

 // xlMain.SetVisible(TRUE);

 

 //(一) 这里设置表头的项目,比如报表日期

 //特别注意:为了容易起见,命名单元格的规则如下

 //1.1 开头处的命名单元格,以1个下划线结束,比如,报告日期_

 //1.2 中间循环命名单元格,就是正常的,与数据集的字段名一致为好

 //1.3 结尾处的命名单元格,以2个下划线结束,比如,合计__

 TRY

 {

  wordTxtBookmark( wdMain,"报告日期_","当天");

 }

 CATCH_ALL(e)

 {

  

 }

 END_CATCH_ALL

  

  

 VARIANT vtIndex;

 Bookmarks bookmarks;

 Bookmark bookmark;

// Range name_range;

 Rows wdRows;

 Row wdRow;

 Columns wdCols;

 Cells wdCells;

 Cell wdCell;

 Tables tables;

 Table operTable;

 Range tmpRange;

 Range srcRange,desRange;

 Columns columns;

 //(二) 根据数据源的个数,设置重复变化的数据行组,

 //1 声明与命名单元格相关的变量和数组

 int min_Row = 65536, min_Col = 65536, max_Row = 0;

 CString min_Name = "";

 bookmarks=wdMain.m_document.GetBookmarks();

 int nameCellCount = bookmarks.GetCount();//wdMain.m_document.GetBookmarks();//获得命名单元格的总数

 int* nameCellRow = new int[nameCellCount];//名称单元格所在的行

 int* nameCellColumn = new int[nameCellCount];//名称单元格所在的列

 CString * nameCellTag = new CString[nameCellCount];//某个命名单元格的常规地址 ,比如 $A$1 --> A

 CString * nameCellName = new CString[nameCellCount];//某个命名单元格的自定义名称,比如 工资

 

 CString strName ,str;

 int nameCellIdx = 0;

 

 //读取不为空的区域的信息,包括已经使用的行数、列数、起始行从1开始、起始列从1开始

 long lStartRow,  lStartCol,  lRowNum,  lColNum;

 

 int hang_shu = lRowNum;

 int lie_shu =lColNum;

 int used_first_col = lStartCol;

 int used_last_col = lStartCol+lColNum-1;

 int row1,col1,row2;

 //2 寻找所有命名的单元格,并找到行号最小者,以便在它之前插入循环行

 for (int k = 0; k < nameCellCount; k++)

 {

  vtIndex.vt = VT_I4;

  vtIndex.lVal = k+1;// 注意,从1开始,不是0

  bookmark=bookmarks.Item(&vtIndex);

  strName=bookmark.GetName();//.GetNameLocal();

  str = strName.Mid(strName.GetLength()-1,1);

  if (str == "_")

  {

   continue;//如果第一个字符为下划线,则认为是固定命名单元格,不是命名的循环单元格

  }

  TRY

  {

   

   tmpRange=bookmark.GetRange();

   //获得书签在表格中的行列号

   wdCells=tmpRange.GetCells();

   wdCell=wdCells.Item(1);

   

   row1=wdCell.GetRowIndex();

   col1=wdCell.GetColumnIndex();

   

   

   nameCellColumn[nameCellIdx] = col1;

   nameCellRow[nameCellIdx] = row1;

   nameCellName[nameCellIdx] = strName;

   

   nameCellTag[nameCellIdx] = " ";//strName.Mid(1,strName.Find("$",1)-1);//$A$1--> A

    

   if (min_Row > nameCellRow[nameCellIdx])

   {

    min_Row = nameCellRow[nameCellIdx];//最小的行号

    min_Col = nameCellColumn[nameCellIdx];

    min_Name = nameCellName[nameCellIdx];

    

   }

   if (max_Row < nameCellRow[nameCellIdx]) max_Row = nameCellRow[nameCellIdx]; ;//最大行号

   nameCellIdx++;//真实的循环的命名单元格序号

  }

  CATCH_ALL(e)

  {

   

  }

  END_CATCH_ALL

  

 }

 nameCellCount = nameCellIdx;//实际要处理的循环的命名单元格数目

 int loopRow = max_Row - min_Row + 1;//一次循环的函数

 //3 也可以使用 //foreach ( Word.Bookmark bk in wh.wordDoc.Bookmarks)MessageBox.Show(bk.Name);

 // 方法1 通常使用第一个表来作为模板表

 tables = wdMain.m_document.GetTables();

 operTable =tables.Item(1);

 // 方法2 使用一个书签来标志模板表

 TRY

 {//使用一个特殊的标签 table_bookmark_template_

   wdMain.GotoBookmark("报表模板__");//

   tables=wdMain.m_selection.GetTables();

  operTable = tables.Item(1);//tmpRange.Tables[1];//得到该书签所在的表,以它为报表的循环模板

 }

 CATCH_ALL(e)

 {

  

 }

 END_CATCH_ALL

 

 

 int template_start = 0;

 int template_end = 0;

 columns=operTable.GetColumns();

 int table_columns=columns.GetCount();//Columns.Count;//本表格的烈数

 

 wdCell= operTable.Cell(min_Row, 1);

 tmpRange = wdCell.GetRange();

 template_start =tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离

 

 wdCell= operTable.Cell(max_Row+1, 1);//Cell(max_Row, table_columns) 将少一列

 tmpRange = wdCell.GetRange();

 template_end =tmpRange.GetStart();//循环行组的最后行,最后一个单元格,到文档开头的距离

 wdCell= operTable.Cell(1, 1);

 tmpRange = wdCell.GetRange();

 srcRange = tmpRange;//operTable.Cell(1, 1).Range;

 desRange = tmpRange;//operTable.Cell(1, 1).Range;

 

 

 //3 也可以使用 foreach ( Excel.Name  nn in xlMain.m_application.ActiveWorkbook.Names)MessageBox.Show(nn.Name);

 int iidex=0;

 //4 根据数据集的实际数据行数,查找命名单元格,循环插入数据

 int cur_row = min_Row;

 for (int dt_row_idx = 0; dt_row_idx < 2; dt_row_idx++)//dt.Rows.Count

 {//循环实际的数据行数2,修改为实际的变量

  

  //4.1 找到行号最小的命名单元格,以它来定位

  wdMain.GotoBookmark(min_Name);//

  tmpRange=wdMain.m_selection.GetRange();

  //4.2 //插入行重复摸板行组的行,使得所有命名单元格都向后移,以便下次循环查找定位时使用

  for (int j = 0; j < loopRow; j++)

  {//插入需要重复循环的摸板行数loopRow

   // range2=name_range.GetEntireRow();

   // range2.Insert(COleVariant((long) 1),COleVariant((long) true));

  }

  //4.3 定位到摸板行组

  wdMain.GotoBookmark(min_Name);//

  tmpRange=wdMain.m_selection.GetRange();

  wdCells=tmpRange.GetCells();

  wdCell=wdCells.Item(1);

  row1=wdCell.GetRowIndex();

  //col1=cell.GetColumnIndex();

  row2 = row1 + loopRow - 1; //摸板行组的最后一行

  wdCell= operTable.Cell(row1, 1);

  tmpRange = wdCell.GetRange();

  template_start =tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离

  //template_end = operTable.Cell(row2, table_columns).Range.Start;//这样少一列

  wdCell= operTable.Cell(row2+1, 1);//到下一行,第一个单元格

  tmpRange = wdCell.GetRange();

  template_end =tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离

  //4.4 复制模板整体多行组,固定的摸板的格式和相关的文字说明,也可一个一个单元格复制

  srcRange.SetRange(template_start, template_end);//整体多行组复制摸板行组

  srcRange.Copy();

  

  //4.5 定位到新加入行的第一个单元格内

  //row1 = row1 - loopRow;//向上回退到新加入的行组

  //row2 = row2 - loopRow;

  

  //4.6 粘贴整体多行组,固定的摸板的格式和相关的文字说明

  //desRange = operTable.Rows[row1].Range;//整体多行组粘贴摸板行组

  wdRows = operTable.GetRows();//.Rows[row1].Range;//整体多行组粘贴摸板行组

  wdRow=wdRows.Item(row1);

  desRange = wdRow.GetRange();

  desRange.Paste();

  //方法2  一行一行复制粘贴,代码很少

 // for (int j = 0; j < loopRow; j++)

 // {//插入需要重复循环的行数loopRow的空行,一行一行的复制粘贴

 //  //复制模板行

 //  wdRows = operTable.GetRows();

 //  wdRow=wdRows.Item(cur_row + j + j);// 所以,粘贴几行,就要多加几行,j+j

 //  srcRange = wdRow.GetRange();

 //  srcRange.Copy();

 //  //粘贴到目标行

 //  wdRows = operTable.GetRows();

 //  wdRow=wdRows.Item(cur_row + j );//因为,新粘贴的行 在原来模板行的上面

 //  desRange = wdRow.GetRange();

 //  desRange.Paste();

 // }

 // cur_row += loopRow;

 

  //4.7 动态的数值加入

  for (int name_cell_idx = 0; name_cell_idx < nameCellCount; name_cell_idx++)

  {//循环命名单元格数量

   str.Format("%s%d", nameCellTag[name_cell_idx], nameCellRow[name_cell_idx]);//为了简单这里用其列名和行号作为内容

   if (nameCellName[name_cell_idx] == "order_num")

   {

    str.Format("%d", dt_row_idx + 1);

   }

   else

   {

    str=list[ iidex++];

    //str= dt.Rows[dt_row_idx][nameCellName[name_cell_idx]].ToString();

    //这里的数据,来自实际的数据集??????????????????????????????

    

   }

   wdCell=operTable.Cell(nameCellRow[name_cell_idx], nameCellColumn[name_cell_idx]);//.Range.Text = str;

   tmpRange=wdCell.GetRange();

   tmpRange.SetText(str);

  

   nameCellRow[name_cell_idx] += loopRow;//行号增加重复行的个数loopRow,准备下个循环,定位行使用

  }

  

 }

 // 5 删除重复的摸板行,不再需要

 wdMain.GotoBookmark(min_Name);//

 tmpRange=wdMain.m_selection.GetRange();

 

 wdCells=tmpRange.GetCells();

 wdCell=wdCells.Item(1);

 row1=wdCell.GetRowIndex();

 row2 = row1 + loopRow - 1; //摸板行组的最后一行

 //方法1  一行一行地删除

// for (int dd = 0; dd < loopRow; dd++)

// {

//  wdMain.DeleteRows();

// }

 

 //方法2  多行组一次删除

 wdCell= operTable.Cell(row1, 1);

 tmpRange = wdCell.GetRange();

 template_start =tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离

 //template_end = operTable.Cell(row2, table_columns).Range.Start;//这样少一列

 wdCell= operTable.Cell(row2+1, 1);//到下一行,第一个单元格

 tmpRange = wdCell.GetRange();

 template_end =tmpRange.GetStart();//循环行组的第一行,第一个单元格,到文档开头的距离

 

 srcRange.SetRange(template_start, template_end);//整体多行组复制摸板行组

 srcRange.Cut();

 //(三) 清除剪贴板,避免Excel关闭工作簿的时候出现提示

 //1 删除剪切板的内容,防止退出提示

 //xlMain.m_application.CutCopyMode = flase;//Excel.XlCutCopyMode.xlCut;//删除剪切板的内容,防止退出提示

 //2 直接用range("A1").copy就行,不必把剪贴板都清空,这会影响其他进程的工作的

 wdCell= operTable.Cell(1, 1);

 tmpRange = wdCell.GetRange();

 tmpRange.Copy();

 

 //(四) 结尾方面的工作

 TRY

 {

  wordTxtBookmark( wdMain,"结论__","成功完成");

 }

 CATCH_ALL(e)

 {

  

 }

 END_CATCH_ALL

  

  

  

 //(五) 另存文件

  

// CString  docname;

// docname.Format("%s\\%s.xls","c:","12");//g_save_path,end_serial);  //路径

 wdMain.SaveAs(docname);

 //(六) 释放

 bookmarks.ReleaseDispatch();

 bookmark.ReleaseDispatch();

 wdRows.ReleaseDispatch();

 wdRow.ReleaseDispatch();

 wdCols.ReleaseDispatch();

 wdCells.ReleaseDispatch();

 wdCell.ReleaseDispatch();

 tables.ReleaseDispatch();

 operTable.ReleaseDispatch();

 tmpRange.ReleaseDispatch();

 srcRange.ReleaseDispatch();

 desRange.ReleaseDispatch();

 columns.ReleaseDispatch();

 

 delete []nameCellRow;

 delete []nameCellColumn;

 delete []nameCellTag;

 delete []nameCellName;

 wdMain.Close();

// say("ok");

 return;

 }

 

====2==封装的word操作类=====

1

//文件名称:wordWork.h

#include

#include "msword.h"

//字体颜色

#define WD_BLACK       0

#define WD_RED         255

#define WD_BLUE        16711680

//对齐方式

#define WD_LEFT        0

#define WD_CENTER      1

#define WD_RIGHT       2

#define WD_JUSTIFY     3

#define WD_DISTRIBUTE  4

//边框方位

#define WD_DIAGONAL_DOWN         -7

#define WD_DIAGONAL_UP           -8

#define WD_EDGE_BOTTOM              -3

#define WD_EDGE_LEFT             -2

#define WD_EDGE_RIGHT            -4

#define WD_EDGE_TOP              -1

#define WD_INSIDE_HORIZONTAL     -5

#define WD_INSIDE_VERTICAL       -6

//边框类型

#define WD_LINESTYLE_NONE        0

#define WD_LINESTYLE_SINGLE      1

#define WD_LINESTYLE_DOT         2

typedef struct MyFont

{

 //字体名

 CString strName;

 //字体大小

 float fSize;

 //字体颜色

 long lColor;

 //粗体

 BOOL bBold;

 //斜体

 BOOL bItalic;

 //下划线

 BOOL bUnderLine;

    MyFont(){fSize = 12; lColor = WD_BLACK; bBold = FALSE; bItalic = FALSE; bUnderLine = FALSE;}

}MYFONT;

typedef struct MyPageSet

{

 //页边距,单位为厘米

 //上

 float fTopMargin;

 //下

 float fBottomMargin;

 //左

 float fLeftMargin;

 //右

 float fRightMargin;

 MyPageSet() {fTopMargin = fBottomMargin = (float)67.0; fLeftMargin = fRightMargin = (float)57.0;}

}MYPAGESET;

class WordMain

{

private:

public:

 _Application m_application;

 Documents m_documents;

 _Document m_document;

 Window m_window;

 View m_view;

 Selection m_selection;

 Tables m_tables;

public:

 //构造函数

 WordMain();

    //析构函数

 ~WordMain();

 //关闭Word应用程序

 void Close();

 //保存

 void Save();

 //另存为strFileName包含路径名和文件名

 BOOL SaveAs(const CString &strFileName);

 //打开

 BOOL Open();

 //打开已存在fileName.doc或.dot文件

 BOOL Open(const CString &strFileName);

 //根据模板Template.dot新建

 BOOL New(const CString &strTemplateName);

 //插入表格

 void InsertTable(long lRow, long lCol);

 //选择区域(光标上下左右移动数量)

 void GetRange(long lLeft = 0, long lUp = 0, long lRight = 0, long lDown = 0);

 //全选

 void GetWholeStory();

 //文件路径strFn是否存在,bDir判定是否包含文件名

 BOOL IsFileExist(const CString &strFn, BOOL bDir);

 //向行首移动光标

 void HomeKey();

 //向行尾移动光标

 void EndKey();

 //向上移动光标

 void MoveUp(long lCount);

 //向下移动光标

 void MoveLeft(long lCount);

 //向左移动光标

 void MoveRight(long lCount);

 //向右移动光标

 void MoveDown(long lCount);

 //BackSpace键删除选中区域,lCount为退格数

 void BackSpace(long lCount);

 //Delete键删除选中区域

 void Delete();

 //输入文本

 void SetItemText(const CString &strText);

 //Enter键:lCount=回车次数

 void Enter(long lCount);

 //字体设置

 void SetFont(const MYFONT &myFont);

 //文本对齐方式(即水平对齐方式)

 void SetTextHAlignment(long lHAlignment);

 //表格内文本垂直对齐方式

 void SetCellVAlignment(long lVAlignment);

 //插入书签

 void InsertBookmark(const CString &strName);

 //书签定位

 BOOL GotoBookmark(const CString &strBookmarkName);

 //得到所有的书签名集合

 void nameBookmarks(WordMain wdMain,CString &strSet);

 //插入图片

 BOOL InsertPicture(const CString &strFileName, float lWidth, float lHeight);

 //对文档中的第lIndex个表格写数据,表格的行列为lRow、lCol

 void SetTableText(long lIndex, long lRow, long lCol, const CString &strText);

 //获得文档中表格数量

 long GetTablesCount();

 //选中文档中指定的第lIndex个表格

 void SelectTable(long lIndex);

 //获得光标所在当前页码

 long GetPage();

 //指定的第lIndex个表格设置标题行换页后重复显示

 void SetHeadingFormat(long lIndex, BOOL bShow = FALSE);

 //获得表格列数,第lIndex个表格

 long GetTableColumCount(long lIndex);

 //获得表格行数,第lIndex个表格

 long GetTableRowCount(long lIndex);

    void SetTableColumnWidth(float fNewValue);

 void SetTableBorderLine(long lPosition, long lBorderLineStyle = WD_LINESTYLE_SINGLE);

 void PageSet(const MYPAGESET &pageSet);  

 void SetTableHAlignment(long lVAlignment);

 void UpdateDomain();

 void Copy();

 void Cut();

 void Paste();

 void DeleteRows();

 void InsertRowsAbove(long lRowCount);

 BOOL ShowBookMark(BOOL bShow = FALSE);

};

2

//文件名称:wordWork.cpp

#include "stdafx.h"

#include "wordWork.h"

#include

WordMain::WordMain()

{

}

WordMain::~WordMain()

{

}

void WordMain::Close()

{

    m_selection.ReleaseDispatch();

 m_window.ReleaseDispatch();

 m_document.ReleaseDispatch();

 m_documents.ReleaseDispatch();

 m_document.Close(&vtMissing, &vtMissing, &vtMissing);

 m_application.Quit(&vtMissing, &vtMissing, &vtMissing);

 m_application.ReleaseDispatch();

// CoUninitialize();

}

BOOL WordMain::Open()

{

 if (FAILED(CoInitialize(NULL)))

 {

  AfxMessageBox("初始化COM支持库失败!");

  return FALSE;

 }

 if(m_application.m_lpDispatch == NULL)

 {

  if (!m_application.CreateDispatch("Word.Application", NULL))

  {

   AfxMessageBox("Word初始化时出错,没有安装Word或安装不正确!", MB_OK | MB_ICONERROR);

   return FALSE;

  }

 }

    LPDISPATCH lpDisp = m_application.GetDocuments();

 m_documents.AttachDispatch(lpDisp);

 COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

 lpDisp = m_documents.Add(&covOptional, &vtMissing, &vtMissing, &vtMissing);

    m_document.AttachDispatch(lpDisp);

 lpDisp = m_application.GetActiveWindow();

    m_window.AttachDispatch(lpDisp);

 lpDisp = m_window.GetSelection();

 m_selection.AttachDispatch(lpDisp);

 return TRUE;

}

BOOL WordMain::Open(const CString &strFileName)

{

 if (FAILED(CoInitialize(NULL)))

 {

  AfxMessageBox("初始化COM支持库失败!");

  return FALSE;

 }

 if(m_application.m_lpDispatch == NULL)

 {

  if (!m_application.CreateDispatch("Word.Application", NULL))

  {

   AfxMessageBox("Word初始化时出错,没有安装Word或安装不正确!", MB_OK | MB_ICONERROR);

   return FALSE;

  }

 }

 LPDISPATCH lpDisp = m_application.GetDocuments();

 m_documents.AttachDispatch(lpDisp);

 lpDisp = m_documents.Open(&(_variant_t)strFileName, &vtMissing, &vtMissing, &vtMissing,

  &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing,

  &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing);

    m_document.AttachDispatch(lpDisp);

 lpDisp = m_application.GetActiveWindow();

    m_window.AttachDispatch(lpDisp);

 lpDisp = m_window.GetSelection();

 m_selection.AttachDispatch(lpDisp);

 return TRUE;

}

BOOL WordMain::New(const CString &strTemplateName)

{

 if (FAILED(CoInitialize(NULL)))

 {

  AfxMessageBox("初始化COM支持库失败!");

  return FALSE;

 }

 if(m_application.m_lpDispatch == NULL)

 {

  if (!m_application.CreateDispatch("Word.Application", NULL))

  {

   AfxMessageBox("Word初始化时出错,没有安装Word或安装不正确!", MB_OK | MB_ICONERROR);

   return FALSE;

  }

 }

 LPDISPATCH lpDisp = m_application.GetDocuments();

 m_documents.AttachDispatch(lpDisp);

    lpDisp = m_documents.Add(&(_variant_t)strTemplateName, &vtMissing, &vtMissing, &vtMissing);

    m_document.AttachDispatch(lpDisp); 

 lpDisp = m_application.GetActiveWindow();

    m_window.AttachDispatch(lpDisp);

 lpDisp = m_window.GetSelection();

 m_selection.AttachDispatch(lpDisp);

 return TRUE;

}

BOOL WordMain::SaveAs(const CString &strFileName)

{

    if (IsFileExist(strFileName, FALSE))

 {

  CString str, str1;

  long i = strFileName.ReverseFind('\\');

  assert(i != -1);

  long j = strFileName.ReverseFind('.');

  assert(j != -1);

  str = strFileName.Mid(i + 1, j - i - 1);

  str1 = strFileName.Mid(i + 1);

  HWND hWnd = ::FindWindow(0, str + " - Microsoft Word");

  HWND hWnd1 = ::FindWindow(0, str1 + " - Microsoft Word");

  if (hWnd != NULL || hWnd1 != NULL)

  {   

   return FALSE;

 

  }

  while(!DeleteFile(strFileName))

  {

      Sleep(1);

  }

 }

 m_document.SaveAs(&_variant_t(strFileName), &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing,

  &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing, &vtMissing);

 return TRUE;

}

void WordMain::Save()

{

    m_document.Save();

}

BOOL WordMain::IsFileExist(const CString &strFn, BOOL bDir)

{

    HANDLE handle;

 LPWIN32_FIND_DATA lpFindFileData = new WIN32_FIND_DATA;

 BOOL bFound = FALSE;

 if (lpFindFileData)

 {

  handle = FindFirstFile(strFn, lpFindFileData);

  bFound = (handle != INVALID_HANDLE_VALUE);

  if(bFound)

  {

   if(bDir)

   {

    bFound = lpFindFileData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;

   }

   FindClose(handle);

  }

  delete lpFindFileData;

 }

 return bFound;

}

void WordMain::InsertTable(long lRow, long lCol)

{

 m_tables = m_document.GetTables();

 m_tables.Add(m_selection.GetRange(), lRow, lCol, &vtMissing, &vtMissing);//m_selection.GetRange()为光标位置

 m_selection.SetStyle(&_variant_t("网格型"));

}

void WordMain::GetRange(long lLeft, long lUp, long lRight, long lDown)

{

 long Extend = 1;//选中标志

 m_selection.MoveLeft(&vtMissing, &_variant_t(lLeft), &_variant_t(Extend));

 m_selection.MoveUp(&vtMissing, &_variant_t(lUp), &_variant_t(Extend));

 m_selection.MoveRight(&vtMissing, &_variant_t(lRight), &_variant_t(Extend));

 m_selection.MoveDown(&vtMissing, &_variant_t(lDown), &_variant_t(Extend));

}

void WordMain::GetWholeStory()

{

    m_selection.WholeStory();

}

void WordMain::HomeKey()

{

 m_selection.HomeKey(&vtMissing,  &vtMissing);

}

void WordMain::EndKey()

{

 m_selection.EndKey(&vtMissing,  &vtMissing);

}

void WordMain::MoveUp(long lCount)

{

 m_selection.MoveUp(&vtMissing, &_variant_t(lCount), &vtMissing);

}

void WordMain::MoveLeft(long lCount)

{

 m_selection.MoveLeft(&vtMissing, &_variant_t(lCount), &vtMissing);

}

void WordMain::MoveRight(long lCount)

{

 m_selection.MoveRight(&vtMissing, &_variant_t(lCount), &vtMissing);

}

void WordMain::MoveDown(long lCount)

{

 m_selection.MoveDown(&vtMissing, &_variant_t(lCount), &vtMissing);

}

void WordMain::BackSpace(long lCount)

{

 for (short i = 0; i

 {

  m_selection.TypeBackspace();

 }

}

void WordMain::Delete()

{

    m_selection.Delete(&vtMissing, &vtMissing);

}

void WordMain::SetItemText(const CString &strText)

{

    m_selection.TypeText(strText);

}

void WordMain::Enter(long lCount)

{

 for (short i = 0; i

 {

        m_selection.TypeParagraph();

 }

}

void WordMain::SetFont(const MYFONT &myFont)

{

 _Font font = m_selection.GetFont();

 font.SetName(myFont.strName);

 font.SetColor(myFont.lColor);

 font.SetSize(myFont.fSize);

 font.SetBold(myFont.bBold);

 font.SetItalic(myFont.bItalic);

 font.SetUnderline(myFont.bUnderLine);

 font.ReleaseDispatch();

}

void WordMain::SetTextHAlignment(long lHAlignment)

{

 _ParagraphFormat paraFormat = m_selection.GetParagraphFormat();

 paraFormat.SetAlignment(lHAlignment);

    paraFormat.ReleaseDispatch();

}

void WordMain::SetCellVAlignment(long lVAlignment)

{

    Cells cells = m_selection.GetCells();

 cells.SetVerticalAlignment(lVAlignment);

    cells.ReleaseDispatch();

}

void WordMain::InsertBookmark(const CString &strName)

{

    Bookmarks bookmarks = m_document.GetBookmarks();

 bookmarks.Add(strName, &_variant_t(m_selection.GetRange()));

 bookmarks.ReleaseDispatch();

}

BOOL WordMain::GotoBookmark(const CString &strBookmarkName)

{

    Bookmarks bookmarks = m_document.GetBookmarks();

 if (!bookmarks.Exists(strBookmarkName))

 {

  return FALSE;

 }

 short GoToBookmark = -1;

    m_selection.GoTo(&_variant_t(GoToBookmark), &vtMissing, &vtMissing, &_variant_t(strBookmarkName));

 bookmarks.ReleaseDispatch();

 return TRUE;

}

void WordMain::nameBookmarks(WordMain wdMain,CString &strSet)

{

 Bookmarks bookmarks=wdMain.m_document.GetBookmarks();

 Bookmark bookmark;

 int bksCount=bookmarks.GetCount();

 CString str;

 str="";

 VARIANT vtIndex;
for (int k=0;k < bksCount;k++)

 {

  vtIndex.vt = VT_I4;

  vtIndex.lVal = k+1;// 注意,从1开始,不是0

  bookmark=bookmarks.Item(&vtIndex);

  str=bookmark.GetName()+"|";

  strSet +=str ;

 

 }//for (for k=0;k

 bookmarks.ReleaseDispatch();

 bookmark.ReleaseDispatch();

}

BOOL WordMain::InsertPicture(const CString &strFileName, float lWidth, float lHeight)

{

    if (!IsFileExist(strFileName, FALSE))

 {

  AfxMessageBox(strFileName+ " 要插入的图片不存在!");

  return FALSE;

 }

    //Shapes shapes = m_document.GetShapes();

    InlineShapes inlineShapes = m_selection.GetInlineShapes();

 inlineShapes.AddPicture(strFileName, &vtMissing, &vtMissing, &vtMissing);

 GetRange(1, 0, 0, 0);

 inlineShapes = m_selection.GetInlineShapes();

 InlineShape inlineShape = inlineShapes.Item(1);

 inlineShape.SetWidth(lWidth);

 inlineShape.SetHeight(lHeight);

 MoveRight(1);

 inlineShape.ReleaseDispatch();

 inlineShapes.ReleaseDispatch();

 return TRUE;

}

void WordMain::SetTableText(long lIndex, long lRow, long lCol, const CString &strText)

{

    Tables tables = m_document.GetTables();

 if (lIndex > tables.GetCount())

 {

  AfxMessageBox("试图将数据写入不存在的表格!");

  return;

 }

 Table table = tables.Item(lIndex);

 Cell cell =  table.Cell(lRow, lCol);

 cell.Select();

 m_selection.SetText(strText);

 cell.ReleaseDispatch();  

 table.ReleaseDispatch();

 tables.ReleaseDispatch();

}

long WordMain::GetTablesCount()

{

    Tables tables = m_document.GetTables();

 long lTalbesCount = tables.GetCount();

 tables.ReleaseDispatch();

 return lTalbesCount;

}

void WordMain::SelectTable(long lIndex)

{

    Tables tables = m_document.GetTables();

 Table table = tables.Item(lIndex);

    table.Select();

 table.ReleaseDispatch();

 tables.ReleaseDispatch();

}

long WordMain::GetPage()

{

    VARIANT vt = m_selection.GetInformation(1);

 return vt.lVal;

}

void WordMain::SetHeadingFormat(long lIndex, BOOL bShow)

{

 if (bShow)

 {

  Tables tables = m_document.GetTables();

  Table table = tables.Item(lIndex);

  Cell cell = table.Cell(1, GetTableColumCount(lIndex));

  Row row = cell.GetRow();       

  row.SetHeadingFormat(9999998);

  row.ReleaseDispatch();

  cell.ReleaseDispatch();

        table.ReleaseDispatch();

  tables.ReleaseDispatch();

 }

}

long WordMain::GetTableColumCount(long lIndex)

{

 Tables tables = m_document.GetTables();

 Table table = tables.Item(lIndex);

 Columns columns = table.GetColumns();

 long lColumsCount = columns.GetCount();

 columns.ReleaseDispatch();

 table.ReleaseDispatch();

 tables.ReleaseDispatch();

 return lColumsCount;

}

long WordMain::GetTableRowCount(long lIndex)

{

 Tables tables = m_document.GetTables();

 Table table = tables.Item(lIndex);

 Rows rows = table.GetRows();

 long lRowCount = rows.GetCount();

 rows.ReleaseDispatch();

 table.ReleaseDispatch();

 tables.ReleaseDispatch();

 return lRowCount;

}

void WordMain::SetTableColumnWidth(float fNewValue)



 Columns columns = m_selection.GetColumns();

 columns.SetPreferredWidthType(3);

 columns.SetPreferredWidth(fNewValue);

 columns.ReleaseDispatch();

}

 

void WordMain::SetTableBorderLine(long lPosition, long lBorderLineStyle)

{

 Borders borders = m_selection.GetBorders();

 Border border = borders.Item(lPosition);

 border.SetLineStyle(lBorderLineStyle);

 border.ReleaseDispatch();

 borders.ReleaseDispatch();

}

void WordMain::PageSet(const MYPAGESET &pageSet)

{

    PageSetup pgSetup = m_document.GetPageSetup();

 pgSetup.SetTopMargin(pageSet.fTopMargin);

 pgSetup.SetBottomMargin(pageSet.fBottomMargin);

 pgSetup.SetLeftMargin(pageSet.fLeftMargin);

 pgSetup.SetRightMargin(pageSet.fRightMargin);

    pgSetup.ReleaseDispatch();

}

void WordMain::SetTableHAlignment(long lVAlignment)

{

 Tables tables = m_selection.GetTables();

 Table table = tables.Item(1);

 Rows rows = table.GetRows();

 rows.SetAlignment(lVAlignment);

 rows.ReleaseDispatch();

 table.ReleaseDispatch();

 tables.ReleaseDispatch();

}

void WordMain::UpdateDomain()

{

    m_selection.WholeStory();

 Fields fields = m_selection.GetFields();

 fields.Update();

}

void WordMain::Cut()

{

    m_selection.Cut();

}

void WordMain::Copy()

{

    m_selection.Copy();

}

void WordMain::Paste()

{

    m_selection.Paste();

}

void WordMain::DeleteRows()

{

 Rows rows = m_selection.GetRows();

 rows.Delete();

    rows.ReleaseDispatch();

}

void WordMain::InsertRowsAbove(long lRowCount)

{

 m_selection.InsertRowsAbove(&_variant_t(long(lRowCount)));

}

BOOL WordMain::ShowBookMark(BOOL bShow)

{

 m_view = m_window.GetView();

    m_view.SetShowBookmarks (bShow);

    m_view.ReleaseDispatch();

 return TRUE;

}

原文:http://blog.sina.com.cn/s/blog_45eaa01a0102vsqx.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: