您的位置:首页 > 编程语言 > C语言/C++

vc++操作word

2008-06-16 10:55 357 查看
最近根据项目需要,需要我去用 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




}



其他方法就不一一帖出测试方法了。可以自己根据方法说明做测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: