VC寫(xiě)word 用VC寫(xiě)word文件方法,我們?cè)诠ぷ髦袝?huì)遇到很多問(wèn)題,像VC寫(xiě)word這類(lèi)問(wèn)題應(yīng)該大家也都遇到過(guò)吧,今天這篇VC寫(xiě)word 用VC寫(xiě)word文件方法的文章,專(zhuān)門(mén)為你解答了這個(gè)問(wèn)題,相信你看完后一定會(huì)收獲很多!
問(wèn)題:您能給我介紹點(diǎn)用Visual C++ 動(dòng)態(tài)生成WORD文檔資料嗎?給個(gè)例子代碼什么的。解答:一:
以下是創(chuàng)建這個(gè)MFC應(yīng)用程序的步驟:(1)使用AppWizard創(chuàng)建一個(gè)新的MFC AppWizard(EXE)工程,命名為"Embed_Word"(2)選擇單文檔視圖(SDI)結(jié)構(gòu),在第3步中需要選中Container,以提供容器支持。 其它都為默認(rèn)。在ClassView中將產(chǎn)生如下類(lèi)應(yīng)用類(lèi): CEmbed_WordApp in Embed_Word.h and Embed_Word.cpp框架類(lèi): CMainFrame in MainFrm.h and MainFrm.cpp文檔類(lèi): CEmbed_WordDoc in Embed_WordDoc.h and Embed_WordDoc.cpp視圖類(lèi): CEmbed_WordView in Embed_WordView.h and Embed_WordView.cpp容器類(lèi): CEmbed_WordCntrItem in CntrItem.h and CntrItem.cpp(3)在View菜單中,選ClassWizard,選Automation選項(xiàng)卡,選Add Class,選擇From a TypeLibrary, 在Office目錄中選中Microsoft Word 97/2000 類(lèi)型庫(kù)Word8.olb或Word9.olb,會(huì)將把類(lèi)型庫(kù)中的所有類(lèi)添加到你的工程中。這時(shí),ClassView中會(huì)多出幾十個(gè)類(lèi),可以通過(guò)這些類(lèi)提供的接口來(lái)實(shí)現(xiàn)必要的功能。(4)在CCntrItem.h中添加獲取標(biāo)準(zhǔn)COM接口IDispach的函數(shù): LPDISPATCH GetIDispatch(); 其函數(shù)實(shí)現(xiàn)如下:
LPDISPATCHCEmbed_WordCntrItem::GetIDispatch(){ASSERT_VALID(this);ASSERT(m_lpObject!=NULL);LPUNKNOWNlpUnk=m_lpObject;Run();LPOLELINKlpOleLink=NULL;if(m_lpObject->QueryInterface(IID_IOleLink,(LPVOIDFAR*)&lpOleLink)==NOERROR){ASSERT(lpOleLink!=NULL);lpUnk=NULL;if(lpOleLink->GetBoundSource(&lpUnk)!=NOERROR){TRACE0("Warning:Linkisnotconnected!n");lpOleLink->Release();}ASSERT(lpUnk!=NULL);}LPDISPATCHlpDispatch=NULL;if(lpUnk->QueryInterface(IID_IDispatch,(LPVOIDFAR*)&lpDispatch)!=NOERROR){TRACE0("Waring:doesnotsupportIDispatch!n");returnNULL;}ASSERT(lpDispatch!=NULL);returnlpDispatch;}
通過(guò)此函數(shù)來(lái)返回標(biāo)準(zhǔn)COM接口IDispatch。(5)在Embed_WordView.cpp中添加對(duì)"MSWord8.h"的引用:#include "MSWord8.h",如使用Word2000,則包含對(duì)"MSWord9.h"的引用。 然后在視類(lèi)CEmbed_WordView中添加函數(shù)EmbedAutomateExcel()
voidCEmbed_WordView::EmbedAutomateWord(){BeginWaitCursor();CEmbed_WordCntrItem*pItem=NULL;TRY{CEmbed_WordDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);pItem=newCEmbed_WordCntrItem(pDoc);ASSERT_VALID(pItem);GetClientRect(&pItem->rect);CLSIDclsid;if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)))AfxThrowMemoryException();if(!pItem->CreateNewItem(clsid))AfxThrowMemoryException();ASSERT_VALID(pItem);pItem->DoVerb(OLEIVERB_SHOW,this);m_pSelection=pItem;pDoc->UpdateAllViews(NULL);LPDISPATCHlpDisp;lpDisp=pItem->GetIDispatch();}CATCH(CException,e){if(pItem!=NULL){ASSERT_VALID(pItem);pItem->Delete();}AfxMessageBox(IDP_FAILED_TO_CREATE);}END_CATCHEndWaitCursor();}
如果仔細(xì)研究過(guò)這段代碼,會(huì)發(fā)現(xiàn)它同AppWizard自動(dòng)生成的OnInsertObject()函數(shù)有著驚人的相似程度,看一下View類(lèi)中的 OnInsertObject() 方法,對(duì)其中的注釋引起了我們的興趣,因?yàn)樗臀覀儎倢?xiě)的方法有驚人的相似。事實(shí)上,我們剛才寫(xiě)的只不過(guò)是OnInsertObject()的一個(gè)特例:OnInsertObject()允許用戶(hù)從可用的OLE對(duì)象列表中選擇其一插入到應(yīng)用程序中。因?yàn)樵诖宋覀冎恍鑼?duì)Word進(jìn)行自動(dòng)化,所以派生了這一行為。(6)為了在程序剛啟動(dòng)時(shí)便將Word嵌入到程序中來(lái),還需在視類(lèi)的OnInitialUpdate()函數(shù)中添加代碼:
voidCEmbed_WordView:nInitialUpdate(){CView:nInitialUpdate();EmbedAutomateWord();//將Word嵌入m_pSelection=NULL;}
(7)為了使嵌入的工作區(qū)占滿(mǎn)整個(gè)客戶(hù)區(qū)可以通過(guò)修改OnDraw函數(shù)來(lái)實(shí)現(xiàn):
voidCEmbed_WordView:nDraw(CDC*pDC){CEmbed_WordDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(m_pSelection==NULL){POSITIONpos=pDoc->GetStartPosition();m_pSelection=(CEmbed_WordCntrItem*)pDoc->GetNextClientItem(pos);}if(m_pSelection!=NULL){CRectrect;GetClientRect(&m_pSelection->rect);m_pSelection->OnGetItemPosition(rect);m_pSelection->Draw(pDC,rect);}}
二:在VC中調(diào)用WORD(顯示,修改,存盤(pán),運(yùn)行宏)(1)使用AppWizard創(chuàng)建一個(gè)新的MFC AppWizard(EXE)工程,命名為"office"(2)選擇單文檔視圖(SDI)結(jié)構(gòu),在第3步中需要選中Container,以提供容器支持,并且選中active document container 其它都為默認(rèn)(3)在View菜單中,選ClassWizard,選Automation選項(xiàng)卡,選Add Class,選擇From a TypeLibrary, 在Office目錄中選中Microsoft Word 97/2000 類(lèi)型庫(kù)Word8.olb或Word9.olb,選中application,document,_document。單擊ok(4)給COfficeCntrItem添加一Public方法。LPDISPATCH GetIDispatch()其源碼如下:
ASSERT_VALID(this); ASSERT(m_lpObject!=NULL); LPUNKNOWNlpUnk=m_lpObject; Run(); LPOLELINKlpOleLink=NULL; if(m_lpObject->QueryInterface(IID_IOleLink,(LPVOIDFAR*)&lpOleLink)==NOERROR) { ASSERT(lpOleLink!=NULL); lpUnk=NULL; if(lpOleLink->GetBoundSource(&lpUnk)!=NOERROR) { TRACE0("Warning:Linkisnotconnected!n"); lpOleLink->Release(); returnNULL; } ASSERT(lpUnk!=NULL); } LPDISPATCHlpDispatch=NULL; if(lpUnk->QueryInterface(IID_IDispatch,(LPVOIDFAR*)&lpDispatch)!=NOERROR) { TRACE0("Warning:doesnotsupportIDispatch!n"); returnNULL;} ASSERT(lpDispatch!=NULL); returnlpDispatch;
(5)。在officeView.h添加#include "msword8.h" //如果是Word2000則為#include "msword9.h"(6)。修改void COfficeView:nInsertObject(),源碼如下:
BeginWaitCursor();COfficeCntrItem*pItem=NULL; TRY { //Createnewitemconnectedtothisdocument. COfficeDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); pItem=newCOfficeCntrItem(pDoc); ASSERT_VALID(pItem);//Initializetheitemfromthedialogdata. /*if(!dlg.CreateItem(pItem)) AfxThrowMemoryException();//anyexceptionwilldo ASSERT_VALID(pItem);*/ CLSIDclsid;// if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid))) AfxThrowMemoryException();if(bOpenStatus)//如果是打開(kāi)文檔 { if(!pItem->CreateFromFile(sFilename,clsid))//打開(kāi)已有文檔 AfxThrowMemoryException(); } else//否則新建文檔 { if(!pItem->CreateNewItem(clsid))//新建文檔 AfxThrowMemoryException(); } ASSERT_VALID(pItem);pItem->Activate(OLEIVERB_SHOW,this);ASSERT_VALID(pItem); m_pSelection=pItem;//setselectiontolastinserteditem pDoc->UpdateAllViews(NULL); //Asanarbitraryuserinterfacedesign,thissetstheselection //tothelastiteminserted.//TODO:reimplementselectionasappropriateforyourapplicationm_pSelection=pItem;//setselectiontolastinserteditem pDoc->UpdateAllViews(NULL); } CATCH(CException,e) { if(pItem!=NULL) { ASSERT_VALID(pItem); pItem->Delete(); } AfxMessageBox(IDP_FAILED_TO_CREATE); } END_CATCHEndWaitCursor();(7)重載ID—FILE—SAVE,voidCOfficeView:nFileSave() { //TODO:Addyourcommandhandlercodehere TRY{ LPDISPATCHlpDisp;lpDisp=m_pSelection->GetIDispatch();Documentsdocs;_Applicationapp;_Documentmydoc; Documentsmy;mydoc.AttachDispatch(lpDisp,TRUE); app=mydoc.GetApplication(); /*app.Run("Macro3");*/ mydoc.Activate(); BOOLpassword=mydoc.GetHasPassword(); mydoc.SetPassword("love"); password=mydoc.GetHasPassword(); COleVariantvFalse((short)FALSE); mydoc.SaveAs(COleVariant(filename),vFalse,vFalse,COleVariant(""),vFalse,//filename為一個(gè)以字符串表達(dá)的文件名如"c:\love1.doc" COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);} CATCH(CException,e) { } END_CATCH }bulid,clickinsertobject,andedit,andsave.mayberunmacro.