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

}





你可能感兴趣的:(vc++)