【MFC/C++操作word】Word篇

MFC操作Word

一.初始化操作

1.导入类库

下面的操作基于Word2003

点击查看->建立类向导-> Add Class...\From a type Library...-> C:\Program Files\Microsoft Office\Office\MSWORD9.OLB,接下来就可以看到导入的类msword.h, msword.cpp。

2.初始化COM

找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用,如:

if (!AfxOleInit())

{

AfxMessageBox("注册COM出错!");

return FALSE;

}

二.我自己写的Word操作类

你写的时候可以直接使用这个类,在它的基础上修改一下。我参考自http://www.cnitblog.com/lifw/articles/vcpp_officeword.html,对其进行了改编:

WordOperate.h

#include "msword.h"

#define wdCharacter 1
#define wdLine 5
#define wdCell 12
#define wdExtend 1
#define wdMove 0
using namespace myword;
#include "atlbase.h"

class CWordOperate
{
public:
    CWordOperate();
    virtual ~CWordOperate();
private:
    _Application m_wdApp;
    Documents m_wdDocs;
    _Document m_wdDoc;
    Selection m_wdSel;
    Range     m_wdRange;

public:
    //操作
    //**********************创建新文档*******************************************
    BOOL CreateApp();                    //创建一个新的WORD应用程序
    BOOL CreateDocuments();                //创建一个新的Word文档集合
    BOOL CreateDocument();                //创建一个新的Word文档
    BOOL Create();                        //创建新的WORD应用程序并创建一个新的文档
    void ShowApp();                        //显示WORD文档
    void HideApp();                        //隐藏word文档

    //**********************打开文档*********************************************
    BOOL OpenDocument(CString fileName);//打开已经存在的文档。
    BOOL Open(CString fileName);        //创建新的WORD应用程序并打开一个已经存在的文档。
    BOOL SetActiveDocument(short i);    //设置当前激活的文档。

    //**********************保存文档*********************************************
    BOOL SaveDocument();                //文档是以打开形式,保存。
    BOOL SaveDocumentAs(CString fileName);//文档以创建形式,保存。
    BOOL CloseDocument();
    void CloseApp(); 

    //**********************文本书写操作*****************************************
    void WriteText(CString szText);        //当前光标处写文本
    void WriteNewLineText(CString szText, int nLineCount = 1); //换N行写字
    void WriteEndLine(CString szText);    //文档结尾处写文本
    void WholeStory();                    //全选文档内容
    void Copy();                        //复制文本内容到剪贴板
    void InsertFile(CString fileName);    //将本地的文件全部内容写入到当前文档的光标处。
    //----------------------add by zxx--------------------------------------
    //***********************光标操作********************************************
    //上下按行选择
    void SelectMoveDown(short lineCount, short unit);//有选择操作的移动
    void NoneSelectMoveDown(short lineCount, short unit);//仅仅移动光标,不选中
    void SelectMoveUp(short lineCount, short unit);//有选择操作的移动
    void NoneSelectMoveUp(short lineCount, short unit);//仅仅移动光标,不选中
    //左右按列选择
    void SelectMoveLeft(short charCount, short unit);//有选择操作的移动
    void NoneSelectMoveLeft(short charCount, short unit);//
    void SelectMoveRight(short charCount, short unit);//有选择操作的移动
    void NoneSelectMoveRight(short charCount, short unit);//

    void MoveToFirst();
    void MoveToNextPage();
    void TypeParagraph();
    void PasteAndFormat();
    void Paste();
    void TypeBackspace(int count);
};

WordOperate.cpp

CWordOperate::CWordOperate()
{

}

CWordOperate::~CWordOperate()
{

}

//操作
BOOL CWordOperate::CreateApp()
{
    COleException pe;
    if (!m_wdApp.CreateDispatch(_T("Word.Application"), &pe))
    {
        AfxMessageBox("Application创建失败,请确保安装了word 2000或以上版本!", MB_OK|MB_ICONWARNING);
        pe.ReportError();
        throw &pe;
        return FALSE;
    }
    return TRUE;
}

BOOL CWordOperate::CreateDocuments()
{
    if (FALSE == CreateApp())
    {
        return FALSE;
    }
    m_wdDocs.AttachDispatch(m_wdApp.GetDocuments());
    if (!m_wdDocs.m_lpDispatch)
    {
        AfxMessageBox("Documents创建失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    return TRUE;
}

BOOL CWordOperate::CreateDocument()
{
    if (!m_wdDocs.m_lpDispatch)
    {
        AfxMessageBox("Documents为空!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }

    COleVariant varTrue(short(1),VT_BOOL),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    CComVariant Template(_T(""));    //没有使用WORD的文档模板
    CComVariant NewTemplate(false),DocumentType(0),Visible;

    m_wdDocs.Add(&Template,&NewTemplate,&DocumentType,&Visible);    

    //得到document变量
    m_wdDoc = m_wdApp.GetActiveDocument();
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    //得到selection变量
    m_wdSel = m_wdApp.GetSelection();
    if (!m_wdSel.m_lpDispatch)
    {
        AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    //得到Range变量
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    if(!m_wdRange.m_lpDispatch)
    {
        AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }

    return TRUE;
}

BOOL CWordOperate::Create()
{
    if (FALSE == CreateDocuments())
    {
        return FALSE;
    }
    return CreateDocument();
}

void CWordOperate::ShowApp()
{
    m_wdApp.SetVisible(TRUE);
}

void CWordOperate::HideApp()
{
    m_wdApp.SetVisible(FALSE);
}

BOOL CWordOperate::OpenDocument(CString fileName)
{
    if (!m_wdDocs.m_lpDispatch)
    {
        AfxMessageBox("Documents为空!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }

    COleVariant vTrue((short)TRUE),
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
                vZ((short)0);
    COleVariant     vFileName(_T(fileName));

    //得到document变量
    m_wdDoc.AttachDispatch(m_wdDocs.Open(
                                vFileName,        // FileName
                                vTrue,            // Confirm Conversion.
                                vFalse,            // ReadOnly.
                                vFalse,            // AddToRecentFiles.
                                vOptional,        // PasswordDocument.
                                vOptional,        // PasswordTemplate.
                                vOptional,        // Revert.
                                vOptional,        // WritePasswordDocument.
                                vOptional,        // WritePasswordTemplate.
                                vOptional,        // Format. // Last argument for Word 97
                                vOptional,        // Encoding // New for Word 2000/2002
                                vOptional,        // Visible
                                //如下4个是word2003需要的参数。本版本是word2000。
                                vOptional,    // OpenAndRepair
                                vZ,            // DocumentDirection wdDocumentDirection LeftToRight
                                vOptional,    // NoEncodingDialog
                                vOptional

                                )                // Close Open parameters
                            );                    // Close AttachDispatch

    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    //得到selection变量
    m_wdSel = m_wdApp.GetSelection();
    if (!m_wdSel.m_lpDispatch)
    {
        AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    //得到全部DOC的Range变量
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    if(!m_wdRange.m_lpDispatch)
    {
        AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    return TRUE;
}

BOOL CWordOperate::Open(CString fileName)
{
    if (FALSE == CreateDocuments())
    {
        return FALSE;
    }
    //HideApp();
    return OpenDocument(fileName);
}

BOOL CWordOperate::SetActiveDocument(short i)
{
    COleVariant     vIndex(_T(i)),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    m_wdDoc.AttachDispatch(m_wdDocs.Item(vIndex));
    m_wdDoc.Activate();
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    //得到selection变量
    m_wdSel = m_wdApp.GetSelection();
    if (!m_wdSel.m_lpDispatch)
    {
        AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    //得到全部DOC的Range变量
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    if(!m_wdRange.m_lpDispatch)
    {
        AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    HideApp();
    return TRUE;
}

BOOL CWordOperate::SaveDocument()
{
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    m_wdDoc.Save();
    return TRUE;
}

BOOL CWordOperate::SaveDocumentAs(CString fileName)
{
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    COleVariant vTrue((short)TRUE),
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    COleVariant vFileName(_T(fileName));

    m_wdDoc.SaveAs(
                vFileName,    //VARIANT* FileName
                vOptional,    //VARIANT* FileFormat
                vOptional,    //VARIANT* LockComments
                vOptional,    //VARIANT* Password
                vOptional,    //VARIANT* AddToRecentFiles
                vOptional,    //VARIANT* WritePassword
                vOptional,    //VARIANT* ReadOnlyRecommended
                vOptional,    //VARIANT* EmbedTrueTypeFonts
                vOptional,    //VARIANT* SaveNativePictureFormat
                vOptional,    //VARIANT* SaveFormsData
                vOptional,    //VARIANT* SaveAsAOCELetter
                vOptional,    //VARIANT* ReadOnlyRecommended
                vOptional,    //VARIANT* EmbedTrueTypeFonts
                vOptional,    //VARIANT* SaveNativePictureFormat
                vOptional,    //VARIANT* SaveFormsData
                vOptional    //VARIANT* SaveAsAOCELetter
                );
    return    TRUE;
}

BOOL CWordOperate::CloseDocument()
{
    COleVariant vTrue((short)TRUE),
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    m_wdDoc.Close(vFalse,    // SaveChanges.
             vTrue,            // OriginalFormat.
             vFalse            // RouteDocument.
             );
    //AfxMessageBox("c1");
    m_wdDoc.AttachDispatch(m_wdApp.GetActiveDocument());
    if (!m_wdDoc.m_lpDispatch)
    {
        AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
//    AfxMessageBox("c2");
    //得到selection变量
    m_wdSel = m_wdApp.GetSelection();
    if (!m_wdSel.m_lpDispatch)
    {
        AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
//    AfxMessageBox("c3");
    //得到全部DOC的Range变量
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    if(!m_wdRange.m_lpDispatch)
    {
        AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
//    AfxMessageBox("c4");
    return TRUE;
}

void CWordOperate::CloseApp()
{
    COleVariant vTrue((short)TRUE),
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    m_wdDoc.Save();
    m_wdApp.Quit(vFalse,    // SaveChanges.
             vTrue,            // OriginalFormat.
             vFalse            // RouteDocument.
             );
    //释放内存申请资源

    m_wdRange.ReleaseDispatch();
    m_wdSel.ReleaseDispatch();
    m_wdDoc.ReleaseDispatch();
    m_wdDocs.ReleaseDispatch();
    m_wdApp.ReleaseDispatch();
}

void CWordOperate::WriteText(CString szText)
{
    m_wdSel.TypeText(szText);
}

void CWordOperate::WriteNewLineText(CString szText, int nLineCount /**//* = 1 */)
{
    int i;
    if (nLineCount <= 0)
    {
        nLineCount = 0;
    }
    for (i = 0; i < nLineCount; i++)
    {
        m_wdSel.TypeParagraph();
    }
    WriteText(szText);
}

void CWordOperate::WriteEndLine(CString szText)
{
    m_wdRange.InsertAfter(szText);
}

void CWordOperate::WholeStory()
{
    m_wdRange.WholeStory();
}

void CWordOperate::Copy()
{
    m_wdSel.Copy();
    //m_wdSel.CopyFormat();
}

void CWordOperate::TypeParagraph()
{
    m_wdSel.TypeParagraph();
}

void CWordOperate::PasteAndFormat()
{
    m_wdSel.PasteAndFormat(0);
}

void CWordOperate::Paste()
{
    m_wdSel.Paste();
    //m_wdSel.PasteFormat();
}

void CWordOperate::TypeBackspace(int count)
{
     for(int i = 0; i < count; i++)
     m_wdSel.TypeBackspace();
}
void CWordOperate::InsertFile(CString fileName)
{
    COleVariant     vFileName(fileName),
                 vTrue((short)TRUE),
                 vFalse((short)FALSE),
                 vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
                 vNull(_T(""));
    /**//*
    void InsertFile(LPCTSTR FileName, VARIANT* Range, VARIANT* ConfirmConversions, VARIANT* Link, VARIANT* Attachment);
    */
    m_wdSel.InsertFile(
                    fileName,
                    vNull,
                    vFalse,
                    vFalse,
                    vFalse
                    );
}

void CWordOperate::SelectMoveDown(short lineCount, short unit)//有选择操作的移动
{
    m_wdSel.MoveDown(COleVariant(unit), COleVariant((short)lineCount),COleVariant((short)wdExtend));
}

void CWordOperate::NoneSelectMoveDown(short lineCount, short unit)//仅仅移动光标,不选中
{
    m_wdSel.MoveDown(COleVariant(unit), COleVariant((short)lineCount),COleVariant((short)wdMove));
}

void CWordOperate::SelectMoveUp(short lineCount, short unit)//有选择操作的移动
{
    m_wdSel.MoveUp(COleVariant(unit), COleVariant((short)lineCount),COleVariant((short)wdExtend));
}

void CWordOperate::NoneSelectMoveUp(short lineCount, short unit)//仅仅移动光标,不选中
{
    m_wdSel.MoveUp(COleVariant(unit), COleVariant((short)lineCount),COleVariant((short)wdMove));
}

void CWordOperate::SelectMoveLeft(short charCount, short unit)//有选择操作的移动
{
    m_wdSel.MoveLeft(COleVariant(unit), COleVariant((short)charCount),COleVariant((short)wdExtend));
}

void CWordOperate::NoneSelectMoveLeft(short charCount, short unit)//
{
    m_wdSel.MoveLeft(COleVariant(unit), COleVariant((short)charCount),COleVariant((short)wdMove));
}
void CWordOperate::SelectMoveRight(short charCount, short unit)//有选择操作的移动
{
    m_wdSel.MoveRight(COleVariant(unit), COleVariant((short)charCount),COleVariant((short)wdExtend));
}
void CWordOperate::NoneSelectMoveRight(short charCount, short unit)//
{
    m_wdSel.MoveRight(COleVariant(unit), COleVariant((short)charCount),COleVariant((short)wdMove));
}
void CWordOperate::MoveToFirst()
{
    m_wdSel.GoTo(COleVariant((short)1), COleVariant((short)2), COleVariant((short)0), COleVariant("1"));
}

void CWordOperate::MoveToNextPage()
{
    m_wdSel.GoTo(COleVariant((short)1), COleVariant((short)2), COleVariant((short)1), COleVariant(""));
}

三.可能遇到的问题

1.问题:CreateDispatch 没有注册类别

解答:使用静态编译即可

时间: 2024-10-10 17:04:27

【MFC/C++操作word】Word篇的相关文章

C#操作Office.word(二)

在上一篇文章"C#操作Office.word(一)"中我们讲述了如何使用VS2010引用COM中Miscrosoft Word 14.0 Object Library实现创建文档,而这篇文章将讲述如何添加表格和图片,因为我在C#联系数据库做销售系统中需要打印表单,,我想以图表形式显示在word中,同时生成相应的饼状图或柱状图,所以才有查阅了相关资料,完成文章,供大家分享.其中使用openFileDialog控件也是希望大家学习了解下. 一. 界面设置 在界面上增加一个按钮,点击这个按钮

章鱼哥—VB.NET Office操作之Word(二)

这篇文章在 章鱼哥-VB.NET Office操作之Word(一) 的基础上,给类添加了光标操作的内容,包括获取word 文档中光标的位置,将光标跳至指定行,上下左右移动光标等操作.该文中给定的方法直接复制到上篇文中的类中即可.不懂得可以联系我.下篇文章将给出这个类具体实现的代码,所有代码都经过笔者的测试,可直接使用. '********************************************************************* '作者:章鱼哥,QQ:3107073

Java操作Microsoft Word之jacob

转自: 现在我们一起来看看,用Java如何操作Microsoft Word. jacob,官网是http://danadler.com/jacob 这是一个开源的工具.最新版本1.7 官方的解释是:The JACOB Project: A JAva-COM Bridge 这是官方对下载文件的说明: jacob.jar: a JAR file for the java classes which you must add to your CLASSPATH. The package names r

章鱼哥出品—VB.NET Office操作之Word(四)

本文是在 章鱼哥出品-VB.NET Office操作之Word(二)中添加内容的具体实现,读者可以借鉴看下,注意本文应该与三结合在一起使用,是在三的基础上添加了几种功能的实现. 实现窗体: 代码实现:代码直接复制到上文的窗体类中 '********************************************************************* '作者:章鱼哥,QQ:3107073263 群:309816713     '如有疑问或好的建议请联系我,大家一起进步   '*

Office操作:Word一分钟制作表格

表格在我们的日常工作中是必不可少的,Word对表格的制作提供了很好的支持,那么如何在Word上快速建立一个合适的表格呢?表格制作又需要涉及到哪些技巧呢?这里和大家一同了解表格制作的步骤.只需要通过简单的几个步骤即可实现表格的插入操作: 表格制作的方法: 第一种方法适合制作最简单的表格: 首先打开word文档,直接点击"插入"菜单下方的"表格".第一个插入表格,鼠标放下去自然就会出现表格,按需要选择行列的数量便可以得到自己想要的表格了. Office操作:Word一分

Git操作(提高篇)

Git操作(提高篇) 分支管理 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了.如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险.有了分支,就不用怕了.创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次

MFC文件操作、序列化机制

一 MFC的文件操作 1 相关类 CFile类-封装了文件句柄以及操作文件的API函数. CFileFind类-封装了文件搜索功能. 2CFile类的使用 2.1 文件读写 2.1.1 创建或者打开文件 CFile::Create 2.1.2 文件读写 CFile::Read/Write 2.1.3 关闭文件 CFile::Close 注意:1 文件读写需要异常处理 2 注意文件的指针位置 2.2 文件属性的获取和设置 2.2.1 CFile::GetStatus 2.2.2 CFile::Se

Git操作(基础篇)

Git操作(基础篇) Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git的读音为/g?t/.Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件. Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以"克隆"这个原始版

NHibernate 之数据操作 (第五篇)

NHibernate 之数据操作 (第五篇) 数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT 通过调用ISession.Save()方法,然后同步同步到数据库. Program.cs class Program { static void Main(string[] args) { ISessionFactory sessionFactory =

MFC图片操作

根据MFC要操作图片的来源,可分为以下两类: 一.非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) 二.动态载入图片(即只需要在程序中指定图片的路径即可载入) 一.非动态显示图片 1.传送位图函数 CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap NewBitmap, * pOldBitmap; NewBitmap.LoadBitmap(IDB_BITMAP1);//从资源中导入位图 BITMAP bmpInfo;//声明BITMAP