zoukankan      html  css  js  c++  java
  • [转]VC++操作Word

    工具: vc++6.0

    关键字: c++ MFC

    要求:系统安装 MS OFFICE 2003

    过程:

    准备工作:

    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 安装的目录中的 MSWORD.OLB ,然后选中所有列出的类名,点 OK 完成。

    4. 最后,这里给出一个操作word的最简单的程序源码wordApp.rar(XP + VC6 + Word2010)

     

     

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

    CWordOffice.h 中的手动写入的代码如下(自动生成的没有加入): 
    
    
    #include "atlbase.h"
    #include "msword.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.cpp中的手写代码如下:
    
    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
                    vOptional,
                    vOptional,
                    vOptional,
                    vOptional,
                    vOptional
                    );
        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();
    }
    
    
    
    
    测试部分代码如下:
    
    需要在对话框中添加一个按钮,按钮的事件方法内添加如下代码:
    
    void CWordOperateDlg::OnButtonWord() 
    {
         AfxEnableControlContainer();   
         AfxOleInit();
         CWordOffice wd;
         wd.CreateDocuments();
         wd.OpenDocument("d:\\a.doc");
         wd.ShowApp(); //显示word
    }
    
    
    
  • 相关阅读:
    POJ 3630 Phone List | Trie 树
    POJ 3974 Palindrome | 马拉车模板
    POJ 3422 Kaka's Matrix Travels | 最小费用最大流
    POJ 2195 Going Home | 带权二分图匹配
    POJ 3068 "Shortest" pair of paths | 最小费用最大流
    POJ 3686 The Windy's | 最小费用最大流
    洛谷 最小费用最大流 模板 P3381
    POJ 2987 Firing | 最大权闭合团
    POJ 3469 Dual Core CPU | 最小割
    POJ 3281 Dining | 最大流
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/1871374.html
Copyright © 2011-2022 走看看