站長資訊網
        最全最豐富的資訊網站

        VC寫word 用VC寫word文件方法

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

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

        以下是創建這個MFC應用程序的步驟:(1)使用AppWizard創建一個新的MFC AppWizard(EXE)工程,命名為"Embed_Word"(2)選擇單文檔視圖(SDI)結構,在第3步中需要選中Container,以提供容器支持。 其它都為默認。在ClassView中將產生如下類應用類: 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中會多出幾十個類,可以通過這些類提供的接口來實現必要的功能。(4)在CCntrItem.h中添加獲取標準COM接口IDispach的函數: LPDISPATCH GetIDispatch(); 其函數實現如下:

        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;}

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

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

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

        (7)為了使嵌入的工作區占滿整個客戶區可以通過修改OnDraw函數來實現:

        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中調用WORD(顯示,修改,存盤,運行宏)(1)使用AppWizard創建一個新的MFC AppWizard(EXE)工程,命名為"office"(2)選擇單文檔視圖(SDI)結構,在第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)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产成人精品免费大全| 亚洲精品电影网| 国产精品亚洲аv无码播放| 欧美精品亚洲精品日韩专区va| 色哟哟国产精品免费观看| 欧美日激情日韩精品| 宅男在线国产精品无码| 精品人妻少妇嫩草AV无码专区| 久久精品国产亚洲AV电影| 亚洲А∨精品天堂在线| 99热这里只有精品国产66| 人人妻人人澡人人爽人人精品| 精品a在线观看| 中文字幕成人精品久久不卡| 99久久国语露脸精品国产| 欧美精品高清在线xxxx| 精品乱子伦一区二区三区高清免费播放| 久久精品国产影库免费看| 国产精品久久久久久搜索| 99国产欧美久久久精品蜜芽| 久久久久女人精品毛片| 久久精品亚洲中文字幕无码麻豆| 久久国产免费观看精品3| 四虎影视国产精品永久在线| 久久精品国产亚洲7777| 国产精品无码久久久久久| 99精品视频在线观看婷| 亚洲精品国产日韩无码AV永久免费网| 精品久久久久久久无码| 久久久久无码精品| 国产精品久久久久乳精品爆| 久久99精品国产自在现线小黄鸭 | 国产精品久久久久久福利漫画| 亚洲AV无码国产精品色午友在线| 久久性精品| 午夜一级日韩精品制服诱惑我们这边| 精品国产成人在线| 久久久久亚洲精品中文字幕| 无码AV动漫精品一区二区免费 | 中文字幕乱码中文乱码51精品| 亚洲精品乱码久久久久久中文字幕|