小鱼儿C++处女作(vc word 操作封装)
本人先声明这个程序是参考了 汪自军封装类 来写的。
如果程序对你有所帮助,我将感到很荣幸。。
期末到了 希望大家都不要挂科哦,反正我只有英语考了,貌似及格没有压力啊。。。。
程序代码:
#ifndef CMYWORD_H #define CMYWORD_H #include "msword.h" #include <ATLBASE.H> //段落对齐的属性 enum Alignment{wdAlignParagraphCenter=1,wdAlignParagraphRight,wdAlignParagraphJustify}; //保存Word类型 /* wdFormatDocument 标准的doc文档 wdFormatWebArchiv 单个文件网页 wdFormatHTML 网页 wdFormatFilteredHTML 去掉一些微软信息的网页 wdFormatTemplate 模版 */ enum SaveType{ wdFormatDocument=0, wdFormatWebArchive=9, wdFormatHTML=8, wdFormatFilteredHTML=10, wdFormatTemplate=1 }; class CmyWord { //一些对象申明 public: _Application app;//创建word Documents docs;//word文档集合 _Document doc;//一个word文件 _Font font;//字体对象 Selection sel;//选择编辑对象 没有对象的时候就是插入点 Table tab;//表格对象 Range range; public: CmyWord();//构造函数 virtual ~CmyWord();//析构函数 void ShowApp(BOOL flag); void AppClose(); BOOL InitCOM();//对COM进行初始化 BOOL CreateAPP();//创建一个word程序 BOOL CreateDocument();//创建word文档 BOOL Create();//创建一个word程序和Word文档 BOOL Open(CString FileName,BOOL ReadOnly = FALSE,BOOL AddToRecentFiles = FALSE);//打开一个word文档; BOOL Close(BOOL SaveChange=FALSE);//关闭一个word文档 BOOL Save();//保存文档 BOOL SaveAs(CString FileName,int SaveType=0);//保存类型 //////////////////////////文件写操作操作///////////////////////////////////////////// void WriteText(CString Text);//写入文本 void NewLine(int nCount=1);//回车换N行 void WriteTextNewLineText(CString Text,int nCount=1);//回测换N行写入文字 ////////////////////////////////////////////////////////////////////////// //////////////////////////字体设置//////////////////////////////////////// void SetFont(CString FontName,int FontSize=9,long FontColor=0,long FontBackColor=0); void SetFont(BOOL Blod,BOOL Italic=FALSE,BOOL UnderLine=FALSE); void SetTableFont(int Row,int Column,CString FontName,int FontSize=9,long FontColor=0,long FontBackColor=0); //void SetTableFont();//统一对表格的文字做出处理. /////////////////////////表格操作///////////////////////////////////// void CreateTable(int Row,int Column); void WriteCellText(int Row,int Column,CString Text); /////////////////////////////设置对齐属性/////////////////////////////////////// void SetParaphformat(int Alignment); /////////////////////////////一些常用操作/////////////////////////////////////// //查找字符串 然后全部替换 void FindWord(CString FindW,CString RelWord); //获取Word 纯文本内容 void GetWordText(CString &Text); //Word 打印 void PrintWord(); }; #endif
程序代码:
#include "StdAfx.h" #include "CmyWord.h" //声明 vOpt 最好用这下面这个 因为我自己喜欢用 CComVariant vOpt;出写 可能在一些特殊环境会出现错误 //COleVariant vOpt(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); //--------------------------------------------------------------------------------------------------------- // 小鱼儿 Word 封装类初步完成 2012 1,4 2:04 // //1 我只学习封装了一些Word中比较使用的东西,后续还会继续改进,看哪些需要的东西要进来。来方便我们的工作学习 //2 这个我第一次用c++ 来写程序, 也是我c++入门的程序吧。有什么指点请加我QQ879801208 无聊勿加 //3 程序代码可能没有全部测试 如果有问题 谢谢指正。 //4 如果有高手想指点我一下 我是非常高兴的。。。。 //--------------------------------------------------------------------------------------------------------- CmyWord::CmyWord() { InitCOM(); } CmyWord::~CmyWord() { //释放资源最好从 小到大的顺序来释放。这个和c里面一些释放资源的道理是一样的 //和c+= 先析构儿子 再析构父亲是一样的。 CoUninitialize(); font.ReleaseDispatch(); range.ReleaseDispatch(); tab.ReleaseDispatch(); doc.ReleaseDispatch(); docs.ReleaseDispatch(); app.ReleaseDispatch(); sel.ReleaseDispatch(); } BOOL CmyWord::InitCOM() { if(CoInitialize(NULL)!=S_OK) { AfxMessageBox("初始化com库失败"); return 0; } else { return TRUE; } } BOOL CmyWord::CreateAPP() { if(!app.CreateDispatch("Word.Application")) { AfxMessageBox("你没有安装OFFICE"); return FALSE; } else { app.SetVisible(TRUE); return TRUE; } } //我的类默认是打开的,而Word 中默认看不见的。 void CmyWord::ShowApp(BOOL flag) { if(!app.m_lpDispatch) { AfxMessageBox("你还没有获得Word对象"); return; } else { app.SetVisible(flag); } } BOOL CmyWord::CreateDocument() { if(!app.m_lpDispatch) { AfxMessageBox("Application为空,Documents创建失败!", MB_OK|MB_ICONWARNING); return FALSE; } else { docs=app.GetDocuments(); if(docs.m_lpDispatch==NULL) { AfxMessageBox("创建DOCUMENTS 失败"); return FALSE; } else { CComVariant Template(_T(""));//创建一个空的模版 CComVariant NewTemplate(false); CComVariant DocumentType(0); CComVariant Visible;//不处理 用默认值 doc = docs.Add(&Template,&NewTemplate,&DocumentType,&Visible); if(!doc.m_lpDispatch) { AfxMessageBox("创建word失败"); return FALSE; } else { sel = app.GetSelection();//获得当前Word操作。开始认为是在doc获得selection。仔细想一下确实应该是Word的接口点 if(!sel.m_lpDispatch) { AfxMessageBox("selection 获取失败"); return FALSE; } else { return TRUE; } } } } } BOOL CmyWord ::Create() { if(CreateAPP()) { if(CreateDocument()) { return TRUE; } else return FALSE; } else return FALSE; } BOOL CmyWord::Open(CString FileName,BOOL ReadOnly /* = FALSE */,BOOL AddToRecentFiles /* = FALSE */) { CComVariant Read(ReadOnly); CComVariant AddToR(AddToRecentFiles); CComVariant Name(FileName); COleVariant vTrue((short)TRUE), vFalse((short)FALSE); COleVariant varstrNull(""); COleVariant varZero((short)0); COleVariant varTrue(short(1),VT_BOOL); COleVariant varFalse(short(0),VT_BOOL); COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR); if(!app.m_lpDispatch) { if(CreateAPP()==FALSE) { return FALSE; } } if(!docs.m_lpDispatch) { docs=app.GetDocuments(); if(!docs.m_lpDispatch) { AfxMessageBox("DocuMent 对象创建失败"); return FALSE; } } CComVariant format(0);//打开方式 0 为doc的打开方式 doc=docs.Open(&Name,varFalse,&Read,&AddToR,vOpt,vOpt, vFalse,vOpt,vOpt,&format,vOpt,vTrue,vOpt,vOpt,vOpt,vOpt); if(!doc.m_lpDispatch) { AfxMessageBox("文件打开失败"); return FALSE; } else { sel=app.GetSelection(); if(!sel.m_lpDispatch) { AfxMessageBox("打开失败"); return FALSE; } return TRUE; } } BOOL CmyWord::Save() { if(!doc.m_lpDispatch) { AfxMessageBox("Documents 对象都没有建立 保存失败"); return FALSE; } else { doc.Save(); return TRUE; } } BOOL CmyWord::SaveAs(CString FileName,int SaveType/* =0 */) { CComVariant vTrue(TRUE); CComVariant vFalse(FALSE); CComVariant vOpt; CComVariant cFileName(FileName); CComVariant FileFormat(SaveType); doc=app.GetActiveDocument(); if(!doc.m_lpDispatch) { AfxMessageBox("Document 对象没有建立 另存为失败"); return FALSE; } else { //最好按照宏来写 不然可能出现问题、 毕竟这个是微软写的 /*ActiveDocument.SaveAs FileName:="xiaoyuer.doc", FileFormat:= _ wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _ True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _ False, SaveNativePictureFormat:=False, SaveFormsData:=False, _ SaveAsAOCELetter:=False*/ doc.SaveAs(&cFileName,&FileFormat,&vFalse,COleVariant(""),&vTrue, COleVariant(""),&vFalse,&vFalse,&vFalse,&vFalse,&vFalse,&vOpt,&vOpt,&vOpt,&vOpt,&vOpt); } return TRUE; } BOOL CmyWord::Close(BOOL SaveChange/* =FALSE */) { CComVariant vTrue(TRUE); CComVariant vFalse(FALSE); CComVariant vOpt; CComVariant cSavechage(SaveChange); if(!doc.m_lpDispatch) { AfxMessageBox("_Document 对象获取失败,关闭操作失败"); return FALSE; } else { if(TRUE==SaveChange) { Save(); } //下面第一个参数填vTrue 会出现错误,可能是后面的参数也要对应的变化 //但vba 没有给对应参数 我就用这种方法来保存 doc.Close(&vFalse,&vOpt,&vOpt); } return TRUE; } void CmyWord::WriteText(CString Text) { sel.TypeText(Text); } void CmyWord::NewLine(int nCount/* =1 */) { if(nCount<=0) { nCount = 0; } else { for(int i=0;i<nCount;i++) { sel.TypeParagraph();//新建一段 } } } void CmyWord::WriteTextNewLineText(CString Text,int nCount/* =1 */) { NewLine(nCount); WriteText(Text); } void CmyWord::SetFont(BOOL Blod,BOOL Italic/* =FALSE */,BOOL UnderLine/* =FALSE */) { if(!sel.m_lpDispatch) { AfxMessageBox("编辑对象失败,导致字体不能设置"); return; } else { sel.SetText("F"); font=sel.GetFont();//获得字体编辑对象; font.SetBold(Blod); font.SetItalic(Italic); font.SetUnderline(UnderLine); sel.SetFont(font); } } void CmyWord::SetFont(CString FontName,int FontSize/* =9 */,long FontColor/* =0 */,long FontBackColor/* =0 */) { if(!sel.m_lpDispatch) { AfxMessageBox("Select 为空,字体设置失败!"); return; } //这里只是为了获得一个对象,因为没有对象你哪里来的设置呢. //因为是用GetFont来获取的对象的。 //所以用SetText来获得字体属性 sel.SetText("a"); font=sel.GetFont();//获取字体对象 font.SetSize(20); font.SetName(FontName); font.SetColor(FontColor); sel.SetFont(font);//选择对象 } void CmyWord::SetTableFont(int Row,int Column,CString FontName,int FontSize/* =9 */,long FontColor/* =0 */,long FontBackColor/* =0 */) { Cell c=tab.Cell(Row,Column); c.Select(); _Font ft=sel.GetFont(); ft.SetName(FontName); ft.SetSize(FontSize); ft.SetColor(FontColor); Range r=sel.GetRange(); r.SetHighlightColorIndex(FontBackColor); } void CmyWord::CreateTable(int Row,int Column) { doc=app.GetActiveDocument(); Tables tbs=doc.GetTables(); CComVariant Vopt; if(!tbs.m_lpDispatch) { AfxMessageBox("创建表格对象失败"); return; } else { tbs.Add(sel.GetRange(),Row,Column,&Vopt,&Vopt); tab=tbs.Item(1);//如果有多个表格可以通过这个来找到表格对象。 } } void CmyWord::WriteCellText(int Row,int Column,CString Text) { Cell c=tab.Cell(Row,Column); c.Select();//选择表格中的单元格 sel.TypeText(Text); } void CmyWord::SetParaphformat(int Alignment) { _ParagraphFormat p=sel.GetParagraphFormat(); p.SetAlignment(Alignment); sel.SetParagraphFormat(p); } void CmyWord::FindWord(CString FindW,CString RelWord) { sel=app.GetSelection(); Find myFind=sel.GetFind(); if(!myFind.m_lpDispatch) { AfxMessageBox("获取Find 对象失败"); return; } else { //下面三行是按照vba 写的 myFind.ClearFormatting(); Replacement repla=myFind.GetReplacement(); repla.ClearFormatting(); COleVariant Text(FindW); COleVariant re(RelWord); COleVariant vTrue((short)TRUE), vFalse((short)FALSE); COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR); CComVariant v(1); CComVariant v2(2); CComVariant v3(_T("")); //下面的Replace 对应的替换的范围是哪里. // 1 代表一个 2 代表整个文档 //myFind.Execute(Text,vFalse,vFalse,vFalse,vFalse,vFalse,vTrue,&v,vFalse,re,&v2,vOpt,vOpt,vOpt,vOpt); myFind.Execute(Text,vFalse,vFalse,vFalse,vFalse,vFalse, vTrue,&v,vFalse,&re,&v2,vOpt,vOpt,vOpt,vOpt); } } void CmyWord::GetWordText(CString &Text) { //CComVariant vOpt; COleVariant vOpt(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); doc=app.GetActiveDocument();//获得当前激活文档 就是当前正在编辑文档 if(!doc.m_lpDispatch) { AfxMessageBox("获取激活文档对象失败"); return; } else { range=doc.Range(vOpt,vOpt); Text=range.GetText(); AfxMessageBox(Text); } } //打印代码我直接Cppy 别人的 因为我没有打印机所以不好做测试 //这里只是为了方便大家 void CmyWord::PrintWord() { doc = app.GetActiveDocument(); if(!doc.m_lpDispatch) { AfxMessageBox("获取激活文档对象失败"); return; } else { COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); doc.PrintOut(covFalse, // Background. covOptional, // Append. covOptional, // Range. covOptional, // OutputFileName. covOptional, // From. covOptional, // To. covOptional, // Item. COleVariant((long)1), // Copies. covOptional, // Pages. covOptional, // PageType. covOptional, // PrintToFile. covOptional, // Collate. covOptional, // ActivePrinterMacGX. covOptional, // ManualDuplexPrint. covOptional, // PrintZoomColumn New with Word 2002 covOptional, // PrintZoomRow ditto covOptional, // PrintZoomPaperWidth ditto covOptional); // PrintZoomPaperHeight ditto*/ } } void CmyWord::AppClose() { COleVariant vOpt(( long )DISP_E_PARAMNOTFOUND, VT_ERROR); if(!app.m_lpDispatch) { AfxMessageBox("获取Word 对象失败,关闭操作失败"); return; } else { app.Quit(vOpt,vOpt,vOpt); //这里释放资源好像不是很好,所以我就在析构函数去处理了。 } }
我的工程 是vc6 控制台 支持MFC
http://
word操作封装类.zip
[ 本帖最后由 小鱼儿c 于 2012-1-4 02:38 编辑 ]