本来是不愿意写东西的我觉的把文档存到机器上时常会不小心弄坏所以干脆放到BLOG上,又可以方便自己以后查找,8错!如果可以顺带帮助到别人就更是我的荣幸了!
本文参考了很多大虾们的文档,如VCK上的杨老师、BLOG-Yingkou,并非有意剽窃!
废话少说,开始吧!
我的机器是IBM R51E,OS为XP Pro,编译器VC6.0,OFF2003。
Let's GO
Microsoft 的 Office 产品中,都提供了OLE Automation 自动化程序的接口。VC对WORD操作可以通过ODBC或OLE,现在我们主要采用OLE,OLE是对象链接。首先要VC->VIEW->CLASSVIEW->ADDCLASS->From a typelibrary导入OLB文件(在OFFICE安装目录中),我用的是OFF2003所以包含库MSWORD.OLB,因为采用了OLE技术,所以一般在Initinstance中要对OLE进行初始化初始化COM。方法一,找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用;方法二,在需要调用COM功能的地方 CoInitialize(NULL),调用完 CoUninitialize()。本人比较喜欢方法一,因为不用释放,像我这样的菜鸟经常内存泄露,所以基本上有懒的方法绝不用复杂的:(。
二层次关系 先看一下吧 我个人理解是大盆套小盆,比较粗浅。
Application(WORD 为例,只列出一部分)
Documents(所有的文档)
Document(一个文档)
......
Templates(所有模板)
Template(一个模板)
......
Windows(所有窗口)
Window
Selection
View
Selection(编辑对象)
Font
Style
Range
三实现技巧
在书写调用 Office 函数的过程中,最困难的是确定函数的参数,一般情况下,参数都是 VARIANT 类型的变量指针。那么到底具体我们应该怎么写那?推荐两个方法,其一是阅读有关 VBA 的书籍;其二,是使用 Office 中自带的“宏”功能。强烈推荐大家使用第二个方法,把你要完成的功能,在 Office 的操作环境中,用宏录制下来,然后观察分析录制后的函数和参数,就可以在 VC 中使用了。由于我在最近写了一个输出WORD的DLL,所以了解了一些,深刻的体会到了录制宏的好处,里面的函数参数多的烦死人了,就采用录制宏的办法,杨老师用MSGBOX查看的参数信息,非常巧妙。我发现在宏上右键有个快速参数有时候也可以查看到参数信息,也挺好用大家自己发挥吧!
ActiveDocument.SaveAs FileName:="Hello.doc", FileFormat:=wdFormatDocument _
, LockComments:=False, Password:="", AddToRecentFiles:=True, _
WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False
以上是在 Word 中录制的一个保存文件的宏,而在 VC 中对应的函数原型为
void _Document::SaveAs(VARIANT* FileName, VARIANT* FileFormat, VARIANT* LockComments,
VARIANT* Password, VARIANT* AddToRecentFiles, VARIANT* WritePassword,
VARIANT* ReadOnlyRecommended, VARIANT* EmbedTrueTypeFonts, VARIANT* SaveNativePictureFormat,
VARIANT* SaveFormsData, VARIANT* SaveAsAOCELetter)
分析对照后,我们就能看出,参数 FileName 是字符串 VARIANT(VT_BSTR),参数 LockComments 是布尔
VARIANT(VT_BOOL),等等。参数 FileFormat := wdFormatDocument 是什么类型那?
其实这是一个表示保存的时候指定文件类型的常量,而且显然是 DWORD 类型VARIANT(VT_I4)。
那么常量的数值又是多少那?很简单,写一个宏,调用函数 MsgBox 显示一下不就都知道啦?!
四 制作
我的这个DLL包含创建文档、贴图、文字输出、创建表格等等,还要根据用户一些参数来设置不同的信息条目。
_Application app; //文档类变量
Documents docs; //所有文档
_Document doc; //一个文档
Selection sel;
InlineShapes shapes;
/启动WORD
AfxOleInit();
if(!app.CreateDispatch(_T("Word.Application")))
{
AfxMessageBox("请先安装Word应用程序!");
return;
}
app.SetVisible(FALSE); //不可见
GetModulePath(path);
strcur.Format("%s",path); //当前程序所在路径
CString strtmp;
strtmp=strcur+"//PrWd.dot";
//创建文档
docs = app.GetDocuments(); //将Documents类对象m_Docs和Idispatch接口关联起来
CComVariant tpl(_T(strtmp/*"E://word//project//WordInput//Debug//PrWd.dot"*/)); //新建空文档
CComVariant Visble,DocType(0);
CComVariant NewTemplate(false);
docs.Add(&tpl,&NewTemplate,&DocType,&Visble);
app.SetVisible(TRUE); //可见
doc = app.GetActiveDocument();
sel = app.GetSelection();
待虚……
本文参考了很多大虾们的文档,如VCK上的杨老师、BLOG-Yingkou,并非有意剽窃!
废话少说,开始吧!
我的机器是IBM R51E,OS为XP Pro,编译器VC6.0,OFF2003。
Let's GO
Microsoft 的 Office 产品中,都提供了OLE Automation 自动化程序的接口。VC对WORD操作可以通过ODBC或OLE,现在我们主要采用OLE,OLE是对象链接。首先要VC->VIEW->CLASSVIEW->ADDCLASS->From a typelibrary导入OLB文件(在OFFICE安装目录中),我用的是OFF2003所以包含库MSWORD.OLB,因为采用了OLE技术,所以一般在Initinstance中要对OLE进行初始化初始化COM。方法一,找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用;方法二,在需要调用COM功能的地方 CoInitialize(NULL),调用完 CoUninitialize()。本人比较喜欢方法一,因为不用释放,像我这样的菜鸟经常内存泄露,所以基本上有懒的方法绝不用复杂的:(。
二层次关系 先看一下吧 我个人理解是大盆套小盆,比较粗浅。
Application(WORD 为例,只列出一部分)
Documents(所有的文档)
Document(一个文档)
......
Templates(所有模板)
Template(一个模板)
......
Windows(所有窗口)
Window
Selection
View
Selection(编辑对象)
Font
Style
Range
三实现技巧
在书写调用 Office 函数的过程中,最困难的是确定函数的参数,一般情况下,参数都是 VARIANT 类型的变量指针。那么到底具体我们应该怎么写那?推荐两个方法,其一是阅读有关 VBA 的书籍;其二,是使用 Office 中自带的“宏”功能。强烈推荐大家使用第二个方法,把你要完成的功能,在 Office 的操作环境中,用宏录制下来,然后观察分析录制后的函数和参数,就可以在 VC 中使用了。由于我在最近写了一个输出WORD的DLL,所以了解了一些,深刻的体会到了录制宏的好处,里面的函数参数多的烦死人了,就采用录制宏的办法,杨老师用MSGBOX查看的参数信息,非常巧妙。我发现在宏上右键有个快速参数有时候也可以查看到参数信息,也挺好用大家自己发挥吧!
ActiveDocument.SaveAs FileName:="Hello.doc", FileFormat:=wdFormatDocument _
, LockComments:=False, Password:="", AddToRecentFiles:=True, _
WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False
以上是在 Word 中录制的一个保存文件的宏,而在 VC 中对应的函数原型为
void _Document::SaveAs(VARIANT* FileName, VARIANT* FileFormat, VARIANT* LockComments,
VARIANT* Password, VARIANT* AddToRecentFiles, VARIANT* WritePassword,
VARIANT* ReadOnlyRecommended, VARIANT* EmbedTrueTypeFonts, VARIANT* SaveNativePictureFormat,
VARIANT* SaveFormsData, VARIANT* SaveAsAOCELetter)
分析对照后,我们就能看出,参数 FileName 是字符串 VARIANT(VT_BSTR),参数 LockComments 是布尔
VARIANT(VT_BOOL),等等。参数 FileFormat := wdFormatDocument 是什么类型那?
其实这是一个表示保存的时候指定文件类型的常量,而且显然是 DWORD 类型VARIANT(VT_I4)。
那么常量的数值又是多少那?很简单,写一个宏,调用函数 MsgBox 显示一下不就都知道啦?!
四 制作
我的这个DLL包含创建文档、贴图、文字输出、创建表格等等,还要根据用户一些参数来设置不同的信息条目。
_Application app; //文档类变量
Documents docs; //所有文档
_Document doc; //一个文档
Selection sel;
InlineShapes shapes;
/启动WORD
AfxOleInit();
if(!app.CreateDispatch(_T("Word.Application")))
{
AfxMessageBox("请先安装Word应用程序!");
return;
}
app.SetVisible(FALSE); //不可见
GetModulePath(path);
strcur.Format("%s",path); //当前程序所在路径
CString strtmp;
strtmp=strcur+"//PrWd.dot";
//创建文档
docs = app.GetDocuments(); //将Documents类对象m_Docs和Idispatch接口关联起来
CComVariant tpl(_T(strtmp/*"E://word//project//WordInput//Debug//PrWd.dot"*/)); //新建空文档
CComVariant Visble,DocType(0);
CComVariant NewTemplate(false);
docs.Add(&tpl,&NewTemplate,&DocType,&Visble);
app.SetVisible(TRUE); //可见
doc = app.GetActiveDocument();
sel = app.GetSelection();
待虚……