VC操作Word书签模板

(2015-05-15 13:52:00)

转载
标签:

vc操作word

书签模板

分类: 代码天地

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
 {
  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;

vc word bookmark相关推荐

  1. C#调用word打印

    开发指南:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 1. ...

  2. Word报告自动生成(例如 导出数据库结构)

    将很早之前写的一个小组件重新整理优化一下,做成一个通用的功能.适用于导出数据库的结构(表.字段等)到Word或将体检数据自动生成Word版的体检报告等.代码:Github 一.主要需要完成功能: 1. ...

  3. word中在指定位置插入图片

    当然得在word中建立一些书签了,作用就是定位.再就是要有Microsoft Word 11.0 Object引用 这是段是精华 //添加应用 using Word=Microsoft.Office. ...

  4. C#中操作Word(8)—— 向Word中插入图表的三种方法(一)

    一. 前言 本文主要介绍向word中插入图表的方法.方法共有三种,每一种都有自己的适用范围和利弊.介绍之前,我们准备实验用的文档,做一个如下图所示的word模板,我们要做的的是在这个名叫chart的书 ...

  5. 通过调用Word模板(Doc、dot)直接打印 z

    通过替换模板中的指定 书签 来进行内容的替换.整合,然后直接发送到打印打印,也可以导出.即把打印出的语句换成保存函数. public static class myPrintByOffice      ...

  6. Web应用Word编辑

    本例采用的做法是:在后台调用服务器上一个已做好的word模板(含书签),使用word自带的功能对模板的内容进行编辑,完成后将改新的word保存在服务器上(比如MyNew1.doc),客户端再使用一个o ...

  7. c# 在 word指定位置插入文字和图片(替换 书签)

    使用  Microsoft.Office.Interop.Word  进行插入, word 文件中 插入 "书签" . 在com组件中引用  Microsoft.Word.xxx. ...

  8. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  9. java使用freemarker模版导出分页word

    1.模版的制作 (1).先用word制作好模版的样式,我的模版样式如下图 (2).将制作好的word模版另存为word 2003 XML文件,具体内容如下 <?xml version=" ...

  10. JAVA根据ftl模板生成需要的多表格word文档

    效果如下图: 第一步:编辑模板 第二步:另存为xml格式 第三步:改为ftl模板格式,并编辑ftl模板 <?xml version="1.0" encoding=" ...

最新文章

  1. .vue文件_在idea中创建vue文件
  2. Android应用程序键盘(Keyboard)消息处理机制分析(20)
  3. 20155227 2016-2017-2 《Java程序设计》第九周学习总结
  4. mysql 统计条目_mysql 统计表中条目数量的几种方法
  5. 最大后验概率估计算法
  6. WebStorm V2017.1版用于Angular2开发的环境设置
  7. OpenCASCADE:IGES 翻译器的介绍
  8. Android菜鸟的成长笔记(13)——异步任务(Async Task)
  9. 云计算论文集, Spark, 数据描述语言, 运维工具集
  10. VirtualBox虚拟机菜单选项隐藏后重现
  11. java中的wn是什么意思_wnJava--做简捷的互动社区网站
  12. 工作169:删除操作
  13. 驱动程序操作IO口API函数
  14. android 计时器工具类,Android中通用定时器--好用的工具
  15. php选择nginx还是apache,浅谈apache和nginx的rewrite的区别
  16. 14 递归 匿名函数 内置函数
  17. 洛谷P1880 石子合并(区间DP)(环形DP)
  18. scoope导入数据_scoop导入数据从mysql到hive
  19. 宝塔控制面板忘记密码怎么找回?
  20. 数据库创建索引的规则

热门文章

  1. 同步多个 git 远程仓库
  2. 项目管理所有计算公式
  3. 各主板黑苹果dsdt补丁_苹果系统发展简史
  4. php 5.0入门系列教程 pdf,thinkphp5.0基础视频教程
  5. I2S—音频播放与录音输入
  6. python取值范围_python 数据库取值范围
  7. 51CTO下载-千万级大型系统集成项目
  8. 基于云计算的毕业设计题目
  9. 远程桌面蓝屏解决办法
  10. html 调用桌面exe程序,如何使用HTML、CSS和JavaScript轻松构建桌面应用程序