VC++操作word

最近根据项目需要,需要我去用 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

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值