站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        VC寫word 用VC寫word文件方法

        VC寫word 用VC寫word文件方法,我們在工作中會遇到很多問題,像VC寫word這類問題應(yīng)該大家也都遇到過吧,今天這篇VC寫word 用VC寫word文件方法的文章,專門為你解答了這個問題,相信你看完后一定會收獲很多!

        問題:您能給我介紹點用Visual C++ 動態(tài)生成WORD文檔資料嗎?給個例子代碼什么的。解答:一:

        以下是創(chuàng)建這個MFC應(yīng)用程序的步驟:(1)使用AppWizard創(chuàng)建一個新的MFC AppWizard(EXE)工程,命名為"Embed_Word"(2)選擇單文檔視圖(SDI)結(jié)構(gòu),在第3步中需要選中Container,以提供容器支持。 其它都為默認。在ClassView中將產(chǎn)生如下類應(yīng)用類: CEmbed_WordApp in Embed_Word.h and Embed_Word.cpp框架類: CMainFrame in MainFrm.h and MainFrm.cpp文檔類: CEmbed_WordDoc in Embed_WordDoc.h and Embed_WordDoc.cpp視圖類: CEmbed_WordView in Embed_WordView.h and Embed_WordView.cpp容器類: CEmbed_WordCntrItem in CntrItem.h and CntrItem.cpp(3)在View菜單中,選ClassWizard,選Automation選項卡,選Add Class,選擇From a TypeLibrary, 在Office目錄中選中Microsoft Word 97/2000 類型庫Word8.olb或Word9.olb,會將把類型庫中的所有類添加到你的工程中。這時,ClassView中會多出幾十個類,可以通過這些類提供的接口來實現(xiàn)必要的功能。(4)在CCntrItem.h中添加獲取標準COM接口IDispach的函數(shù): LPDISPATCH GetIDispatch(); 其函數(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;}

        通過此函數(shù)來返回標準COM接口IDispatch。(5)在Embed_WordView.cpp中添加對"MSWord8.h"的引用:#include "MSWord8.h",如使用Word2000,則包含對"MSWord9.h"的引用。 然后在視類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();}

        如果仔細研究過這段代碼,會發(fā)現(xiàn)它同AppWizard自動生成的OnInsertObject()函數(shù)有著驚人的相似程度,看一下View類中的 OnInsertObject() 方法,對其中的注釋引起了我們的興趣,因為它和我們剛寫的方法有驚人的相似。事實上,我們剛才寫的只不過是OnInsertObject()的一個特例:OnInsertObject()允許用戶從可用的OLE對象列表中選擇其一插入到應(yīng)用程序中。因為在此我們只需對Word進行自動化,所以派生了這一行為。(6)為了在程序剛啟動時便將Word嵌入到程序中來,還需在視類的OnInitialUpdate()函數(shù)中添加代碼:

        voidCEmbed_WordView:nInitialUpdate(){CView:nInitialUpdate();EmbedAutomateWord();//將Word嵌入m_pSelection=NULL;}

        (7)為了使嵌入的工作區(qū)占滿整個客戶區(qū)可以通過修改OnDraw函數(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(顯示,修改,存盤,運行宏)(1)使用AppWizard創(chuàng)建一個新的MFC AppWizard(EXE)工程,命名為"office"(2)選擇單文檔視圖(SDI)結(jié)構(gòu),在第3步中需要選中Container,以提供容器支持,并且選中active document container 其它都為默認(3)在View菜單中,選ClassWizard,選Automation選項卡,選Add Class,選擇From a TypeLibrary, 在Office目錄中選中Microsoft Word 97/2000 類型庫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)//如果是打開文檔 { if(!pItem->CreateFromFile(sFilename,clsid))//打開已有文檔 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為一個以字符串表達的文件名如"c:\love1.doc" COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);} CATCH(CException,e) { } END_CATCH }bulid,clickinsertobject,andedit,andsave.mayberunmacro.

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 99久久免费只有精品国产| 91嫩草亚洲精品| 午夜精品美女写真福利| 亚洲欧美日韩精品专区| 中国精品videossex中国高清| 亚洲AV无码成人精品区蜜桃| 国产精品无码久久四虎| 久久精品一区二区国产| 久久精品蜜芽亚洲国产AV| 亚洲国产精品一区二区第一页免| 2020最新久久久视精品爱| 国内精品人妻无码久久久影院 | 国产精品亚洲mnbav网站| 东京热TOKYO综合久久精品| 亚洲av无码乱码国产精品| 日本Aⅴ大伊香蕉精品视频| 国产精品JIZZ在线观看老狼| 精品久久香蕉国产线看观看亚洲| 精品黑人一区二区三区| 亚洲国产精品福利片在线观看| 欧美 日韩 精品 另类视频| 精品国产福利盛宴在线观看| 99久久亚洲综合精品网站| 一级香蕉精品视频在线播放| 久久se精品一区精品二区| 国产精品臀控福利在线观看| 国产精品igao视频网| 国产精品免费高清在线观看| 四虎国产精品永久免费网址| 亚洲精品无码专区2| 自拍偷自拍亚洲精品情侣| 一本色道久久88—综合亚洲精品 | 久久精品国产亚洲av瑜伽| 精品国产亚洲男女在线线电影 | 久久91精品国产91久久小草 | 日韩福利视频精品专区| 欧美精品在线视频| 日韩精品欧美激情国产一区| 天天爽夜夜爽夜夜爽精品视频| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久96国产精品久久久|