admin 管理员组

文章数量: 887032


2023年12月22日发(作者:汇编语言 code 000)

环境:win7+vs2010+office2010/2013

1、 创建MFC工程,非Unicode。

2、 添加Word的类库

添加所有的接口,可以作为一个文件夹,以后再使用只要加入该文件夹就可以了。

由于函数命名冲突,需要在生成的头文件中做相应处理,即:

//#import "C:Program FilesMicrosoft " no_namespace

#import "C:Program FilesMicrosoft " no_namespace

raw_interfaces_only

rename("FindText", "_FindText")

rename("Rectangle", "_Rectangle")

rename("ExitWindows", "_ExitWindows")

对于不同版本的office,其默认的类型库位置如下表所示:

Office 版本

Office 2003

路径

C:Program FilesMicrosoft OfficeOffice11

Office 2007

Office 2010

Office 2013

C:Program FilesMicrosoft OfficeOffice12

C:Program FilesMicrosoft OfficeOffice14

C:Program FilesMicrosoft OfficeOffice15

特别的,word2013在vc2010下必须手动指定类型库文件位置。

3、在stdafx中添加调用的头文件

#include "Word2010/CApplication.h" // word程序对象

#include "Word2010/CDocuments.h" // 文档集对象

#include "Word2010/CDocument0.h" // 单个docx对象

#include "Word2010/CSelection.h"

最高

#include "Word2010/CCell.h"

#include "Word2010/CCells.h"

// 表格单元格

// 表格单元格集合

// 该对象代表窗口或窗格中的当前所选内容,使用率#include "Word2010/CRange.h" // 该对象代表文档中的一个连续范围

#include "Word2010/CTable0.h" // 单个表格

#include "Word2010/CTables0.h" // 表格集合

#include "Word2010/CFont0.h" // 字体

#include "Word2010/CParagraphs.h" // 段落集合

#include "Word2010/CParagraphFormat.h" // 段落样式

#include "Word2010/CParagraph.h" // 单个段落

#include "Word2010/CnlineShape.h" // Inline图形对象集合

#include "Word2010/CnlineShapes.h" // 单个Inline图像对象

#include "Word2010/CRow.h" // 单个行

#include "Word2010/CRows.h" // 行集合

#include "Word2010/CFields.h"

#include "Word2010/CPane0.h" // 页眉等设置

#include "Word2010/CWindow0.h"// 页眉等设置

#include "Word2010/CView0.h"// 页眉等设置

#include "Word2010/CPageSetup.h" // 页面设置

4、注销每个引入的头文件的import行

//#import "C:Program FilesMicrosoft " no_namespace

不过如果使用wdMove等参数的话,只需要在CApplication.h文件中改为:

//#import "C:Program FilesMicrosoft " no_namespace

#import "C:Program FilesMicrosoft " no_namespace

raw_interfaces_only

rename("FindText", "_FindText")

rename("Rectangle", "_Rectangle")

rename("ExitWindows", "_ExitWindows")

否则,如果没有上面一段,则报错提示为(即全部头文件都注销import的情况下):

但是上述的方法会带来一个问题,就是当word版本改变时会出现问题,解决办法就是上述报错的变量都用其数值代替就不会有问题了(写代码时可以加上用以查看wdMove等变量的值),如下面一些:

wdAlignParagraphLeft = 0

wdAlignParagraphCenter = 1

wdAlignParagraphRight = 2

wdAlignParagraphJustify = 3

wdParagraph = 4

wdMove = 0

wdStyleHeading1 = -2

wdStory = 6

页面纵向wdOrientPortrait=0

页面横向wdOrientLandscape=1

enum WdUnits

{

wdCharacter = 1, // 字母

wdWord = 2, // 单词

wdSentence = 3, // 句子

wdParagraph = 4, // 段落

wdLine = 5, // 行

wdStory = 6, // 所选区域

wdScreen = 7, // 当前屏幕

wdSection = 8, // 部分

wdColumn = 9, // 列

wdRow = 10, // 行

wdWindow = 11, // 窗口

wdCell = 12, // 单元格

wdCharacterFormatting = 13, // 字体格式

wdParagraphFormatting = 14, // 段落格式

wdTable = 15, // 表格

wdItem = 16 // 项目

};

具体可以参考手册或者通过VBA代码查看。

5、到文件中找到InitInstance函数

添加代码:

if ( !AfxOleInit() )

{

}

AfxMessageBox(_T("无法初始化COM的动态链接库!"));

return FALSE;

// 例如修改为公司或组织名

SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

这一步可以通过在创建MFC工程时,勾选“自动化”。

6、具体代码

添加按钮,在按钮中实现:

void CVCForWordDlg::OnBnClickedButton1()

{

CString wordVersion = _Version(); // 获得当前word的版本,比如{

}

else

{

_Visible(FALSE); // 设置文档开始不可见

AfxMessageBox(_T("本机没有安装word产品!"));

return;

// TODO: 在此添加控件通知处理程序代码

COleVariant covZero((short)0),

// 定义word变量

CApplication wordApp; // wordApp

CDocuments docxs; // docxs

CDocument0 docx, docx_active; // docx

if ( !Dispatch(_T("ation")) ) // 实例化wordApp,必须有初始covTrue((short)TRUE),

covFalse((short)FALSE),

covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),

covDocxType((short)0);

word2010为14.0,2013为15.0

// ****************** 添加一个document ******************

// 得到docxs

docxs = _Documents(); // 或者下面一段

// =====================================

//LPDISPATCH disp = _Documents();

//if ( NULL == disp )

// return;// FALSE;

//Dispatch(disp);

//if ( NULL == docxs.m_lpDispatch )

// return;// FALSE;

// =====================================

// 添加一个docx

docx = (covOptional, covOptional, covOptional, covOptional); // 未用模板时,或者下面段两种

// =====================================

// 2,未用模板

//Dispatch((covOptional, covOptional, covOptional,

covOptional));

// ****************** 设置页边距 ******************

// 放在创建文档后,需要CPageSetup.h

docx_active = _ActiveDocument();

CPageSetup oPageSetup = docx__PageSetup();

// 设置为页面方向和页边距

// 3,使用模板

//CComVariant tpl(_T("")), Visble, DocxType(0), NewTemplate(false);

//docx = (&tpl,&NewTemplate,&DocxType,&Visble);

// =====================================

if ( NULL == docx.m_lpDispatch )

return;

if ( _Orientation() == 0 ) // 若为纵向则设置为横向,纵向wdOrientPortrait=0,横向wdOrientLandscape=1

{

_Orientation(1); // 横向

// 设置上下左右变距,单位缇,以下参数设置的页边距是“适中”

_TopMargin( (float) 72); // 适中时72=2.54cm,默认时90=3.17cm;10≈0.35cm

_BottomMargin( (float) 72); // 适中时72=2.54cm,默认时90=3.17cm;10≈0.35cm

_LeftMargin( (float) 54); // 适中时54=1.9cm,默认时72=2.54cm

_RightMargin( (float) 54); // 适中时54=1.9cm,默认时72=2.54cm

}

//else

//{

//

//

//

_Orientation(0);

// 设置上下左右变距,单位缇,以下参数设置的页边距是“适中”

_TopMargin( (float) 72); // 适中时72=2.54cm,默认或普通时// 设置为纵向

72=2.54cm;10≈0.35cm

// _BottomMargin( (float) 72); // 适中时72=2.54cm,默认或普通时72=2.54cm;10≈0.35cm

// _LeftMargin( (float) 54); // 适中时54=1.9cm,默认或普通时90=3.17cm

// _RightMargin( (float) 54); // 适中时54=1.9cm,默认或普通时90=3.17cm

// 声明一个CSelection对象,并实例化

//}

CSelection wordSelection = _Selection();

// ****************** 设置文档内容 ******************

xt(_T("虚拟试验仿真报表"));

y(COleVariant((short)5), COleVariant((short)1)); // wdLine=5,返回当前行首,并选择当前行

_Style( COleVariant((short)-2) );// 设置为“标题1“样式,wdStyleHeading1=-2

// 设置选择区域字体,一定要放在样式后,否则格式会被样式的覆盖

CFont0 font = _Font();

_Name(_T("微软雅黑"));

_Size(16); // 必须选择该行才可以修改,即必须有HomeKey那行

// 获得当前段落,并设置对齐方式

CParagraph lastPara = GetCurParagraph(docx);

_Alignment(1); // wdAlignParagraphLeft=0,

wdAlignParagraphCenter=1,wdAlignParagraphRight=2

// 结束当前段落编辑,移动光标到段落后

(COleVariant((short)4), COleVariant((short)0)); //

wdParagraph=4,wdMove=0

ragraph(); // 新起一段

COleVariant covTime(_T("yyyy-MM-dd:dddd")); // 时间格式可调整

DateTime(covTime, covFalse, covOptional, covOptional,

covOptional); // 插入当前时间

(COleVariant((short)4), COleVariant((short)0)); // 结束当前段落编辑,wdParagraph=4,wdMove=0

// 生成表格

MakeRTITable( docx, wordSelection );

// 以下为为不同段落设置不同字体和对齐方式示例

ragraph(); // 新起一段

xt(_T("end of the story!"));

y(COleVariant((short)5), COleVariant((short)1)); // wdLine=5,返回当前行首,并选择当前行

/*CFont0 */font = _Font();

_Size(20); // 必须选择该行才可以修改,即必须有HomeKey那行

/*CParagraph */lastPara = GetCurParagraph(docx);

_Alignment(3); // 右对齐

(COleVariant((short)4), COleVariant((short)0)); // 结束当前段落编辑,wdParagraph=4,wdMove=0

ragraph(); // 新起一段

xt(_T("Thanks for reading!"));

y(COleVariant((short)5), COleVariant((short)1)); // wdLine=5,返回当前行首,并选择当前行

/*CFont0 */font = _Font();

_Size(10); // 必须选择该行才可以修改,即必须有HomeKey那行

_Name(_T("Times New Roman"));

/*CParagraph */lastPara = GetCurParagraph(docx);

_Alignment(1); // 居中对齐

(COleVariant((short)4), COleVariant((short)0)); // 结束当前段落编辑,wdParagraph=4,wdMove=0

// 插入分页符,用于换页

Break(covOptional);

// 插入公式,操作域

CFields fields = _Fields();

COleVariant ofont = _variant_t(_T("Times New Roman"));

COleVariant text = _variant_t(_T("EQ a ar co2 vs3 hs3(Axy,Bxy,A,B)")); //

注意要两个,一个转义后不对!!!

( _Range(), covOptional, text, covFalse );

y(COleVariant((short)5), COleVariant((short)1)); // wdLine=5,返回当前行首,并选择当前行

lastPara = GetCurParagraph(docx);

_Alignment(0); // 左对齐

(COleVariant((short)4), COleVariant((short)0)); // 结束当前段落编辑,wdParagraph=4,wdMove=0

// ****************** 插入图片示例 ******************

// 需要CWindow0.h, CPane0.h, CView0.h

ragraph(); // 另起一段

CString strPicture = strAppPath + _T("截图.jpg");

CnlineShapes nLineShapes = _InlineShapes();

CnlineShape nLineshape = ture(strPicture, covFalse, covTrue,

// 获取应用当前Debug路径

char fileName[MAX_PATH];

GetModuleFileName(NULL, fileName, MAX_PATH);

char dir[260];

char dirver[100];

_splitpath(fileName, dirver, dir, NULL, NULL);

CString strAppPath = dirver;

strAppPath += dir;

//CString strAppPath = _T("D:");

covOptional);

_Alignment(1); // wdAlignParagraphLeft=0, wdAlignParagraphCenter=1,

// ****************** 设置页眉页脚 ******************

CWindow0 oWind = _ActiveWindow();

CPane0 oPane = _ActivePane(); // 一定将CPane改为CPane0或其他

CView0 oView = _View();

// =============== 设置页眉 ===============

_SeekView(9); // wdSeekCurrentPageHeader=9

// 设置选择区域字体 /*CFont0 */font = _Font();

_Name(_T("华文楷体"));

_Size(16);

/*CParagraphFormat */lastPara = _ParagraphFormat(); // 默认为居wdAlignParagraphRight=2

// =============== 设置页脚,包括页码 ===============

_SeekView(10); // wdSeekCurrentPageFooter=10

// 设置选择区域字体,一定要放在 xt(_T("网络大学"));

/*CFont0 */font = _Font();

样式后,否则格式会被样式的覆盖

_Alignment(1); // wdAlignParagraphLeft=0, wdAlignParagraphCenter=1,

_Name(_T("华文楷体"));

_Size(16);

/*CParagraphFormat */lastPara = _ParagraphFormat(); // 默认为居wdAlignParagraphRight=2

// 添加页码

xt(_T("第页 共页"));

ft( COleVariant((short)1), COleVariant((short)4), &covZero );

/*CFields */fields = _Fields();

( _Range(), COleVariant((short)33), COleVariant("PAGE

// 增加页码域,当前页码 "), &covTrue );

ght( COleVariant((short)1), COleVariant((short)3), &covZero);

( _Range(), COleVariant((short)26),

// 增加页码域,总页数 COleVariant("NUMPAGES "), &covTrue );

// 保存成果

CString strSavePath = strAppPath;

strSavePath += _T("报表.docx");

// Word程序可见,显示报表

//_Visible(TRUE);

_SeekView(0); // 关闭页眉页脚,wdSeekMainDocument=0,回到主控文(COleVariant(strSavePath), covOptional, covOptional, covOptional,

covOptional,

covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,

covOptional, covOptional, covOptional, covOptional,covOptional);

}

表格插入函数MakeRTITable(CDocument0& oDoc, CSelection& selection):

}

MessageBox(_T("生成成功!"));

// 退出word应用

(covFalse, covOptional, covOptional);

(covOptional, covOptional, covOptional);

eDispatch();

void CVCForWordDlg::MakeRTITable(CDocument0& oDoc, CSelection& selection)

{

// Add table

CTables0 wordTables = _Tables();

CRange wordRange = _Range();

COleVariant covTrue((short)TRUE), covFalse((short)FALSE),

// Add table title

ragraph(); // 新起一段

xt(RTITableTitle);

CParagraph lastPara = GetCurParagraph(oDoc);

//_Alignment(wdAlignParagraphCenter); // 下面表格内容也受此控制

//(COleVariant((short)wdParagraph), COleVariant((short)wdMove));

_Alignment(1); // 下面表格内容也受此控制

(COleVariant((short)4), COleVariant((short)0));

int nRowSize = 10;

nRowSize = nRowSize == 0 ? 2 : nRowSize;

// new paragraph

ragraph(); // 新起一段

// 表格至少两行

covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

CTable0 wordTable = (wordRange, nRowSize , RTITableColumnSize,

covTrue, covFalse); // 添加表格

// Make header

CCell cell;

for ( int i=1; i

{

wordRange = _Range();

}

cell = (1, i); // 表格第一行第i列单元格

();

xt(RTITableFieldArray[i-1]);

//(COleVariant((short)wdStory), COleVariant((short)wdMove)); // 结束表格编辑

for ( int i=1; i

{

}

//(COleVariant((short)wdStory), COleVariant((short)wdMove)); // 结束表cell = (2, i); // 表格第一行第i列单元格

();

xt(_T("111.0"));

(COleVariant((short)6), COleVariant((short)0)); // 结束表格编辑

格编辑

// 合并单元格,需要注意的是,合并整行前不能有单元格的合并,否则无法获取表格(COleVariant((short)6), COleVariant((short)0)); // 结束表格编辑

的行信息

CRows rows;

rows = _Rows();

CRow row;

row = (3); // 指向第三行

// 获取表格的行

wordRange = _Range();

CCells cells;

cells = _Cells(); // 得到该行所有单元格

(); // 合并第三行为一列

cell = ( 4, 1 );

( ( 5, 1 ) ); //合并第一列中的第四行与第五行

// 光标的移动方式.通过Selection类对象的方法对光标进行上下,左右等移动,实现对光标的定位功能

ght( COleVariant((short)1), COleVariant((short)1),

COleVariant((short)0) ); // 向右移动鼠标到下一个字符

wn( COleVariant((short)5), covOptional, covOptional ); // 向下移动鼠标到下一行

}

自定义函数GetCurParagraph(CDocument0& curDoc):

CParagraph CVCForWordDlg::GetCurParagraph(CDocument0& curDoc)

{

}

7、生成文档结果

CParagraphs paragraphs = _Paragraphs();

CParagraph lastPara = _Last();

return lastPara;

COleVariant vUnit((short)RTITableColumnSize);

COleVariant vCount((short)3);

( &vUnit, &vCount ); // 移动3行

(); // 合并第三行为一列

COleVariant vEnd((short)5);

( &vEnd, &covOptional ); // 将光标移动到行尾

// 光标移动方式为行

8、说明

(1)关于设置页边距时的参数说明

以缇为单位,一个与屏幕无关的单位,用来保证屏幕应用程序对屏幕元素的定位和比例在所有的显示系统上的一致性。一缇等价于 1/20 个打印机的磅。一逻辑英寸大约有 1440 缇,一逻辑厘米约 567 缇(打印时的一英寸或一厘米所对应的屏幕上的长度)。

但实际word文档中显示和打印效果来看,56.7缇=2cm,10缇=0.35cm。

(2)加载CPane.h文件前,将CPane改为CPane0,否则会出现重定义,还有一个afxpane.h中有CPane类

(3)生成的word文档,如果页码显示和公式显示为代码形式,一个可以直接全选右键“切换域代码”,对于页码则选中页脚同样操作即可;另一个可以设置word文档的格式,在文件——选项——高级中去掉“显示域代码而非域值”前面的勾即可。

(4)设置页边距和页面方向的时候,还是在创建文档后设置,否则在后面设置时可以会有一些问题。

(5)通过域代码来写简单公式,域代码格式可以参考网页:

/s/blog_

其他相关内容,百度或谷歌,网上挺多的。

(6)本文档代码例子下载链接:

/share/link?shareid=508404&uk=2936052968


本文标签: 设置 代码 文档