1、在VC中新建一控制台程序,选支持MFC
2、项目 - 类向导 - 添加类(右侧小箭头) - 类型库中的MFC类
3、选择文件 C:\Program Files\Microsoft Office\Office14\MSWORD.OLB
4、添加 _Application、Documents、_Document、Range
5、在程序中引用刚才生成的头文件
#include "CApplication.h"
#include "CDocument0.h"
#include "CDocuments.h"
#include "CRange.h"
6、此时编译会报错:
error C2786: “BOOL (HDC,int,int,int,int)”: __uuidof 的操作数无效
解决方法:
A:
修改上面四个文件中的
#import "C:\\Program Files\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace
为:
#import "C:\\Program Files\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace raw_interfaces_only \
rename("FindText","_FindText") \
rename("Rectangle","_Rectangle") \
rename("ExitWindows","_ExitWindows")
B:
直接将上面四个文件中的
#import "C:\\Program Files\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace
这一行删除
再次编译,错误消失
7、测试程序
void testWordInterface()
{
CString csFilePath = L"C:\\Users\\vm\\Desktop\\aaa.doc";
CoInitialize(NULL);//初始化COM,与最后一行CoUninitialize对应
CApplication app;
CDocuments docs;
CDocument0 doc;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);
if(!app.CreateDispatch(_T("word.application"))) //启动WORD
{
_tprintf(_T("OFFICE has not installed.\n"));
return;
}
_tprintf(_T("WORD is running.\n"));
app.put_Visible(FALSE); //设置WORD可见
docs = app.get_Documents();
doc = docs.Open(COleVariant(csFilePath),varFalse,varTrue,varFalse,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional);
CString csName = doc.get_Name();
_tprintf(csName);
_tprintf(_T("WORD will exit."));
doc.Close(varFalse, covOptional, covOptional);
doc.ReleaseDispatch();
docs.ReleaseDispatch();
//调用Quit退出WORD应用程序。不调用的话WORD还在运行
app.Quit(new CComVariant(FALSE),new CComVariant(),new CComVariant());
app.ReleaseDispatch(); //释放对象指针。切记,必须调用
CoUninitialize();//对应CoInitialize
}
//例子1
void CMyWordDlg::OnBnClickedButton1()
{
CoInitialize(NULL);//初始化COM,与最后一行CoUninitialize对应
//CPageSetup pagesetup=doc.get_PageSetup();//页面设置相关,没用到
CApplication app;
if(!app.CreateDispatch(_T("word.application"))) //启动WORD
{
AfxMessageBox(_T("居然你连OFFICE都没有安装吗?"));
return;
}
AfxMessageBox(_T("WORD 已经运行启动啦,你可以用Ctrl+Alt+Del查看"));
app.put_Visible(TRUE); //设置WORD可见。
CDocuments docs = app.get_Documents();
docs.Add(new CComVariant(_T("")),new CComVariant(FALSE),new CComVariant(0),new CComVariant());//创建新文档
AfxMessageBox(_T("下面,程序要向WORD发送字符啦"));
CSelection sel=app.get_Selection();//Selection表示输入点,即光标闪烁的那个地方
CFont0 font =sel.get_Font();
font.put_Name(_T("宋体"));//设置字体
font.put_Size(14);
font.put_Color(WdColor::wdColorGreen);
font.put_Bold(1);
sel.TypeText(_T("HELLO\r\n大家好呀"));//调用函数Selection::TypeText 向WORD发送字符
font.ReleaseDispatch();//【注】【意】所有东西用完之后一定要ReleaseDispatch,否则报错;不过最好像例子2中,在最后集中ReleaseDispatch
//插入表格
CDocument0 doc = app.get_ActiveDocument();//活动文档
CTables0 tables = doc.get_Tables();
tables.Add(sel.get_Range(), 7,11, new CComVariant(),new CComVariant());//插入表
CTable0 table=tables.Item(1);
CBorders borders=table.get_Borders();//设置表格边框
borders.put_InsideLineStyle(WdLineStyle::wdLineStyleSingle);
borders.put_OutsideLineStyle(WdLineStyle::wdLineStyleDouble);
//borders.put_OutsideLineWidth(WdLineWidth::wdLineWidth075pt);
borders.ReleaseDispatch();
sel.TypeText(_T("test1"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test2"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test3"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test4"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test5"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test6"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test7"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test8"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test9"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test10"));
sel.MoveRight(COleVariant((short)1),COleVariant(short(1)),COleVariant(short(0)));
sel.TypeText(_T("Test11"));
int i=0,j=0;
for(i=2;i<7;i+=2)
{
CCell c1=table.Cell(i,1);
CCell c2=table.Cell(i+1,1);
c1.Merge(c2);//合并单元格
c1.ReleaseDispatch();
c2.ReleaseDispatch();
}
CCell c;
CString strName[3];
strName[0] = "yingkou";
strName[1] ="zyq654321";
strName[2] ="iwaswzq";
for(j=0,i=0;i<3;++i,j+=2)
{
c=table.Cell(j+2,1);
c.Select();
CCells cs=sel.get_Cells();
cs.put_VerticalAlignment(WdVerticalAlignment::wdAlignVerticalCenter);
sel.TypeText(strName[i]);
sel.MoveDown(COleVariant((short)5),COleVariant(short(1)),COleVariant(short(0)));
cs.ReleaseDispatch();
c.ReleaseDispatch();
}
c=table.Cell(7, 2);
c.Select();
CString strData[6];
strData[0]="111";
strData[1]="222";
strData[2]="333";
for(i=0,j=0;i<6;++i,++j)
{
if(i%2==0)
j=0;
sel.TypeText(strData[j]);
sel.MoveUp(COleVariant((short)5),COleVariant(short(1)),COleVariant(short(0)));
}
c.ReleaseDispatch();
c=table.Cell(7, 2);
c.Select();//选中最后一行
sel.MoveDown(COleVariant((short)5),COleVariant(short(1)),COleVariant(short(0)));//下移,输入点到页末
c.ReleaseDispatch();
CComVariant pageBreak = CComVariant(WdBreakType::wdPageBreak);
sel.InsertBreak(&pageBreak);//插入分页符
sel.TypeText(_T("this is the 2nd page!\r\n"));
//设置页眉页脚
CWindow0 win = doc.get_ActiveWindow();//窗口Window对象
CPane pane = win.get_ActivePane();//当前活动Pane窗格对象
CView0 view = pane.get_View();//View视图对象
view.put_Type(WdViewType::wdPrintView);//设置视图类型:打印、打印预览、阅读...
view.put_SeekView(WdSeekView::wdSeekCurrentPageHeader);//页眉视图
CHeaderFooter headerfooter = sel.get_HeaderFooter();
//headerfooter.put_LinkToPrevious(FALSE);//取消“与上一节相同”
sel.TypeText(_T("this is header"));
view.put_SeekView(WdSeekView::wdSeekCurrentPageFooter);//页脚视图
sel.TypeText(_T("this is footer\r\nand here is 2nd line"));
sel.TypeText(_T("第 "));
CRange range = sel.get_Range();
CFields fields = range.get_Fields();
CField field = fields.Add(range, COleVariant((short)WdFieldType::wdFieldPage),COleVariant(short(0)),COleVariant(short(0)));//页码
sel.TypeText(_T("页 共 "));
range = sel.get_Range();
fields = range.get_Fields();
field = fields.Add(range, COleVariant((short)WdFieldType::wdFieldNumPages),COleVariant(short(0)),COleVariant(short(0)));//页数
sel.TypeText(_T(" 页"));
//下面是设置页码格式
view.put_SeekView(WdSeekView::wdSeekMainDocument);//返回文字视图
//插入图片,先以嵌入型图像插入,再转成浮移图像,可以移动位置,也可不转
//据说不先按嵌入型插入的话,都会插在第一页
range = sel.get_Range();
COleVariant vRange;
vRange.vt=VT_DISPATCH;
vRange.pdispVal = range.m_lpDispatch;
vRange.pdispVal->AddRef();
CnlineShapes inlineshapes = doc.get_InlineShapes();
CnlineShape inlineshape = inlineshapes.AddPicture(_T("C:\\Documents and Settings\\Administrator\\桌面\\未命名.bmp"), COleVariant((long)0), COleVariant((long)1),&vRange);
inlineshape.put_ScaleWidth(50);
inlineshape.put_ScaleHeight(50);
//CShape shape = inlineshape.ConvertToShape();
//shape.put_Width(165);
//shape.put_Height(165);
//shape.put_Top(200);
//shape.put_Left(100);
//shape.ConvertToInlineShape();
//shape.ReleaseDispatch();
vRange.Detach();
sel.TypeText(_T("oh, i see the image"));
inlineshape.ReleaseDispatch();
inlineshapes.ReleaseDispatch();
//pagenumers.ReleaseDispatch();
field.ReleaseDispatch();
fields.ReleaseDispatch();
range.ReleaseDispatch();
headerfooter.ReleaseDispatch();
view.ReleaseDispatch();
pane.ReleaseDispatch();
win.ReleaseDispatch();
//保存文件
CString FileName(_T("C:\\Documents and Settings\\Administrator\\桌面\\doc.doc")); //文件名
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);
doc.SaveAs(COleVariant(FileName), varZero, varFalse,
COleVariant(_T("")), varTrue, COleVariant(_T("")),
varFalse, varFalse, varFalse, varFalse, varFalse,
covOptional,covOptional,covOptional,covOptional,
covOptional);
AfxMessageBox(_T("WORD准备要退出啦"));
table.ReleaseDispatch();
tables.ReleaseDispatch();
doc.ReleaseDispatch();
sel.ReleaseDispatch();
docs.ReleaseDispatch();
//调用Quit退出WORD应用程序。当然不调用也可以,那样的话WORD还在运行着那
app.Quit(new CComVariant(FALSE),new CComVariant(),new CComVariant());
app.ReleaseDispatch(); //释放对象指针。切记,必须调用
AfxMessageBox(_T("Step1执行完成。接着请学习Setp2"));
CoUninitialize();//对应CoInitialize
}