c++封装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: //115.com/file/e6gkjtpk#
word操作封装类.zip

你可能感兴趣的:(word)