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

}

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

posted on 2011-05-24 19:53  °ι 、曲 终  阅读(503)  评论(0编辑  收藏  举报