vc++操作word

来源:互联网 发布:软件解决方案工程师 编辑:程序博客网 时间:2024/05/02 17:49
最近根据项目需要,需要我去用 vc++6.0 作一个 ActiveX web 组件。自己从来没有接触过这方面的编程,这次是头一遭!所以咱就做了,不过倒很出乎我的意料,比我想象的要快很多就完成了。现将 vc++6.0 操作 word 部分的关键代码部分帖出来,共享给大家。

因为我在开发的时候遇到了很多问题,并且网上的资料很少,基本都是最基本的操作。所以帖出来,希望能让大家在开发的过程少走些弯路!

工具: vc++6.0

关键字: c++ MFC

要求:系统安装 MS OFFICE 2000

过程:

准备工作:

1.       创建一个 MFC(EXE) 工程: MFC AppWizard exe ),工程为对话框形式(测试用)。

2.       CLASS VIEW 页面创建一个类:类名为: CWordOffice ,类的类型为: Class type Generic Class

3.       在工具栏中找到 view -> class wizard -> Automation -> add class -> from a tye library ,然后选中 offfice 安装的目录中的 MSWORD9.OLB ,然后选中所有列出的类名,点 OK 完成。

准备工作完成,下面贴出相关部分的代码:

CWordOffice.h 中的手动写入的代码如下(自动生成的没有加入):

 
#include "atlbase.h"#include "msword9.h"class CWordOffice {private:    _Application m_wdApp;    Documents m_wdDocs;    _Document m_wdDoc;    Selection m_wdSel;    Range     m_wdRange;    InlineShapes m_wdInlineShapes;     InlineShape m_wdInlineShape;public:    CWordOffice();    virtual ~CWordOffice();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);    //将本地的文件全部内容写入到当前文档的光标处。        //**********************图片插入操作*****************************************    void InsertShapes(CString fileName);//在当前光标的位置插入图片        //**********************超链接插入操作*****************************************    void InsertHyperlink(CString fileLink);//超级链接地址,可以是相对路径。};
 

CWordOffice.c中的手写代码如下:

CWordOffice::CWordOffice(){}CWordOffice::~CWordOffice(){    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_wdInlineShape.ReleaseDispatch();    m_wdInlineShapes.ReleaseDispatch();    //m_wdTb.ReleaseDispatch();    m_wdRange.ReleaseDispatch();    m_wdSel.ReleaseDispatch();    //m_wdFt.ReleaseDispatch();    m_wdDoc.ReleaseDispatch();    m_wdDocs.ReleaseDispatch();    m_wdApp.ReleaseDispatch();}//操作BOOL CWordOffice::CreateApp(){    if (FALSE == m_wdApp.CreateDispatch("Word.Application"))    {        AfxMessageBox("Application创建失败,请确保安装了word 2000或以上版本!", MB_OK|MB_ICONWARNING);        return FALSE;    }    return TRUE;}BOOL CWordOffice::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 CWordOffice::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 CWordOffice::Create(){    if (FALSE == CreateDocuments())     {        return FALSE;    }    return CreateDocument();}void CWordOffice::ShowApp(){    m_wdApp.SetVisible(TRUE);}void CWordOffice::HideApp(){    m_wdApp.SetVisible(FALSE);}BOOL CWordOffice::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 CWordOffice::Open(CString fileName){    if (FALSE == CreateDocuments())     {        return FALSE;    }    return OpenDocument(fileName);}BOOL CWordOffice::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 CWordOffice::SaveDocument(){    if (!m_wdDoc.m_lpDispatch)     {        AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);        return FALSE;    }    m_wdDoc.Save();    return TRUE;}BOOL CWordOffice::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                );    return    TRUE;}BOOL CWordOffice::CloseDocument(){    COleVariant vTrue((short)TRUE),                    vFalse((short)FALSE),                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);    m_wdDoc.Close(vFalse,    // SaveChanges.             vTrue,            // OriginalFormat.             vFalse            // RouteDocument.             );    m_wdDoc.AttachDispatch(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;    }    //得到全部DOC的Range变量    m_wdRange = m_wdDoc.Range(vOptional,vOptional);    if(!m_wdRange.m_lpDispatch)    {        AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);        return FALSE;    }    return TRUE;}void CWordOffice::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_wdInlineShape.ReleaseDispatch();    m_wdInlineShapes.ReleaseDispatch();    //m_wdTb.ReleaseDispatch();    m_wdRange.ReleaseDispatch();    m_wdSel.ReleaseDispatch();    //m_wdFt.ReleaseDispatch();    m_wdDoc.ReleaseDispatch();    m_wdDocs.ReleaseDispatch();    m_wdApp.ReleaseDispatch();}void CWordOffice::WriteText(CString szText){    m_wdSel.TypeText(szText);}void CWordOffice::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 CWordOffice::WriteEndLine(CString szText){    m_wdRange.InsertAfter(szText);}void CWordOffice::WholeStory(){    m_wdRange.WholeStory();}void CWordOffice::Copy(){    m_wdRange.CopyAsPicture();}void CWordOffice::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 CWordOffice::InsertShapes(CString fileName){    COleVariant vTrue((short)TRUE),                    vFalse((short)FALSE),                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);    m_wdInlineShapes=m_wdSel.GetInlineShapes();    m_wdInlineShape=m_wdInlineShapes.AddPicture(fileName,vFalse,vTrue,vOptional);}void CWordOffice::InsertHyperlink(CString fileLink){    COleVariant     vAddress(_T(fileLink)),vSubAddress(_T(""));    Range aRange = m_wdSel.GetRange();    Hyperlinks vHyperlinks(aRange.GetHyperlinks());    vHyperlinks.Add(                    aRange,            //Object,必需。转换为超链接的文本或图形。                    vAddress,         //Variant 类型,可选。指定的链接的地址。此地址可以是电子邮件地址、Internet 地址或文件名。请注意,Microsoft Word 不检查该地址的正确性。                    vSubAddress,     //Variant 类型,可选。目标文件内的位置名,如书签、已命名的区域或幻灯片编号。                    vAddress,         //Variant 类型,可选。当鼠标指针放在指定的超链接上时显示的可用作“屏幕提示”的文本。默认值为 Address。                    vAddress,         //Variant 类型,可选。指定的超链接的显示文本。此参数的值将取代由 Anchor 指定的文本或图形。                    vSubAddress        //Variant 类型,可选。要在其中打开指定的超链接的框架或窗口的名字。                    );     vHyperlinks.ReleaseDispatch();}

上边的代码是主要的核心代码,有些代码没有进行优化,请各位批判的看!测试部分代码如下:

需要在对话框中添加一个按钮,按钮的事件方法内添加如下代码:

COfficeProjectDlg::OnButton1(){AfxEnableControlContainer();          AfxOleInit();       CWordOffice wd;       wd.CreateDocuments();wd.OpenDocument("d:""a.doc");wd.ShowApp(); //显示word}

其他方法就不一一帖出测试方法了。可以自己根据方法说明做测试。

原创粉丝点击