MFC操作Word

更新时间:2024-07-10 09:52:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

【MFC/C++操作word】Word篇

分类: MFC操作office2013-01-25 21:30 4372人阅读 评论(10) 收藏 举

MFC操作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 中的手动写入的代码如下(自动生成的没有加入):

1.导入类库

下面的操作基于Word2003

点击查看->建立类向导-> Add Class...\\From a type Library...-> C:\\Program Files\\Microsoft Office\\Office\\MSWORD9.OLB,接下来就可以看到导入的类msword.h, msword.cpp。 2.初始化COM

找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用,如: if (!AfxOleInit()) {

AfxMessageBox(\注册COM出错!\ return FALSE; }

二.我自己写的Word操作类

你写的时候可以直接使用这个类,在它的基础上修改一下。我参考自http://www.cnitblog.com/lifw/articles/vcpp_officeword.html,对其进行了改编:

WordOperate.h #include \

#define wdCharacter 1 #define wdLine 5 #define wdCell 12 #define wdExtend 1 #define wdMove 0 using namespace myword; #include \

class CWordOperate { public:

CWordOperate();

virtual ~CWordOperate();

private: _Application m_wdApp; Documents m_wdDocs; _Document m_wdDoc; Selection m_wdSel; Range m_wdRange;

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); //将本地的文件全部内容写入到当前文档的光标处。

//----------------------add by zxx--------------------------------------

//***********************光标操作********************************************

//上下按行选择

void SelectMoveDown(short lineCount, short unit);//有选择

操作的移动

void NoneSelectMoveDown(short lineCount, short unit);//仅

仅移动光标,不选中

void SelectMoveUp(short lineCount, short unit);//有选择操

作的移动

void NoneSelectMoveUp(short lineCount, short unit);//仅仅

移动光标,不选中

//左右按列选择

void SelectMoveLeft(short charCount, short unit);//有选择操

作的移动

void NoneSelectMoveLeft(short charCount, short unit);// void SelectMoveRight(short charCount, short unit);//有选择

操作的移动

void MoveToFirst(); void MoveToNextPage(); void TypeParagraph(); void PasteAndFormat(); void Paste();

void NoneSelectMoveRight(short charCount, short unit);//

};

void TypeBackspace(int count);

WordOperate.cpp

CWordOperate::CWordOperate() { }

CWordOperate::~CWordOperate() { } //操作

BOOL CWordOperate::CreateApp() {

COleException pe;

if (!m_wdApp.CreateDispatch(_T(\

&pe)) {

AfxMessageBox(\创建失败,请确保安装了word 2000或以上版本!\

pe.ReportError(); throw &pe;

return FALSE; }

return TRUE; }

BOOL CWordOperate::CreateDocuments()

{

if (FALSE == CreateApp()) {

return FALSE; }

m_wdDocs.AttachDispatch(m_wdApp.GetDocuments()); if (!m_wdDocs.m_lpDispatch) {

AfxMessageBox(\创建失败!\MB_OK|MB_ICONWARNING); return FALSE; }

return TRUE; }

BOOL CWordOperate::CreateDocument()

{

if (!m_wdDocs.m_lpDispatch) {

AfxMessageBox(\为空!\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(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

//得到selection变量

m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

//得到Range变量

m_wdRange = m_wdDoc.Range(vOptional,vOptional); if(!m_wdRange.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

return TRUE; }

BOOL CWordOperate::Create() {

if (FALSE == CreateDocuments()) {

return FALSE; }

return CreateDocument(); }

void CWordOperate::ShowApp() {

m_wdApp.SetVisible(TRUE); }

void CWordOperate::HideApp()

{

m_wdApp.SetVisible(FALSE); }

BOOL CWordOperate::OpenDocument(CString fileName) {

if (!m_wdDocs.m_lpDispatch) {

AfxMessageBox(\为空!\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(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

// // //得到selection变量

m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

//得到全部DOC的Range变量

m_wdRange = m_wdDoc.Range(vOptional,vOptional); if(!m_wdRange.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

return TRUE; }

BOOL CWordOperate::Open(CString fileName) {

if (FALSE == CreateDocuments()) {

return FALSE; }

//HideApp();

return OpenDocument(fileName); }

BOOL CWordOperate::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(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

//得到selection变量

m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

//得到全部DOC的Range变量

m_wdRange = m_wdDoc.Range(vOptional,vOptional); if(!m_wdRange.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

HideApp(); return TRUE; }

BOOL CWordOperate::SaveDocument() {

if (!m_wdDoc.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

m_wdDoc.Save(); return TRUE; }

BOOL CWordOperate::SaveDocumentAs(CString fileName) {

if (!m_wdDoc.m_lpDispatch) {

AfxMessageBox(\获取失败!\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, //VARIANT*

ReadOnlyRecommended

vOptional, //VARIANT* EmbedTrueTypeFonts

vOptional, //VARIANT* SaveNativePictureFormat

vOptional, //VARIANT* SaveFormsData vOptional //VARIANT* SaveAsAOCELetter ); return TRUE; }

BOOL CWordOperate::CloseDocument() {

COleVariant vTrue((short)TRUE), vFalse((short)FALSE),

vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

m_wdDoc.Close(vFalse, // SaveChanges. vTrue, // OriginalFormat.

vFalse // RouteDocument. );

//AfxMessageBox(\

m_wdDoc.AttachDispatch(m_wdApp.GetActiveDocument()); if (!m_wdDoc.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

// AfxMessageBox(\ //得到selection变量

m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

// AfxMessageBox(\

//得到全部DOC的Range变量

m_wdRange = m_wdDoc.Range(vOptional,vOptional); if(!m_wdRange.m_lpDispatch) {

AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }

// AfxMessageBox(\ return TRUE; }

void CWordOperate::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_wdRange.ReleaseDispatch(); m_wdSel.ReleaseDispatch();

m_wdDoc.ReleaseDispatch(); m_wdDocs.ReleaseDispatch(); m_wdApp.ReleaseDispatch(); }

void CWordOperate::WriteText(CString szText) {

m_wdSel.TypeText(szText); }

void CWordOperate::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 CWordOperate::WriteEndLine(CString szText) {

m_wdRange.InsertAfter(szText); }

void CWordOperate::WholeStory()

{

m_wdRange.WholeStory(); }

void CWordOperate::Copy() {

m_wdSel.Copy(); }

void CWordOperate::TypeParagraph() {

m_wdSel.TypeParagraph(); }

//m_wdSel.CopyFormat();

void CWordOperate::PasteAndFormat() { }

void CWordOperate::Paste() { }

void CWordOperate::TypeBackspace(int count) {

  for(int i = 0; i < count; i++)   m_wdSel.TypeBackspace(); m_wdSel.Paste(); //m_wdSel.PasteFormat(); m_wdSel.PasteAndFormat(0);

}

三.可能遇到的问题

1.问题:CreateDispatch 没有注册类别 解答:使用静态编译即可。

测试部分代码如下:

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

COfficeProjectDlg::OnButton1() {

AfxEnableControlContainer();

AfxOleInit();

CWordOffice wd;

wd.CreateDocuments();

wd.OpenDocument(\

wd.ShowApp(); //显示word

}

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

本文来源:https://www.bwwdw.com/article/3qt.html

Top