c++封装Word (比较全了)

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

  

原文链接: https://www.cnblogs.com/c-study/archive/2012/01/04/2311772.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    c++封装Word (比较全了)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/39681

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午4:21
下一篇 2023年2月8日 下午4:22

相关推荐