• 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
  • 相关阅读:
    bzoj3507: [Cqoi2014]通配符匹配
    bzoj2120: 数颜色
    bzoj2038: [2009国家集训队]小Z的袜子(hose)
    laravel表单图片上传
    laravel使用$errors提取错误信息
    laravel中的old()函数
    laravel的函数asset()、url()
    laravel表单提交
    laravel中if
    laravel的foreach
  • 原文地址:https://www.cnblogs.com/ArRan/p/2714888.html
Copyright © 2020-2023  润新知