問題:您能給我介紹點用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(); 其函數實現如下:
- LPDISPATCH CEmbed_WordCntrItem::GetIDispatch()
- {
- ASSERT_VALID(this);
- ASSERT(m_lpObject != NULL);
- LPUNKNOWN lpUnk = m_lpObject;
- Run();
- LPOLELINK lpOleLink = NULL;
- if(m_lpObject->QueryInterface(IID_IOleLink,(LPVOID FAR*)&lpOleLink)== NOERROR)
- {
- ASSERT(lpOleLink != NULL);
- lpUnk = NULL;
- if(lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
- {
- TRACE0("Warning: Link is not connected!\n");
- lpOleLink->Release();
- }
- ASSERT(lpUnk != NULL);
- }
- LPDISPATCH lpDispatch = NULL;
- if(lpUnk->QueryInterface(IID_IDispatch,(LPVOID FAR*)&lpDispatch) != NOERROR)
- {
- TRACE0("Waring: does not support IDispatch!\n");
- return NULL;
- }
- ASSERT(lpDispatch != NULL);
- return lpDispatch;
- }
通過此函數來返回標準COM接口IDispatch。
(5)在Embed_WordView.cpp中添加對"MSWord8.h"的引用:#include "MSWord8.h",如使用Word2000,則包含對"MSWord9.h"的引用。 然后在視類CEmbed_WordView中添加函數EmbedAutomateExcel()
- void CEmbed_WordView::EmbedAutomateWord()
- {
- BeginWaitCursor();
- CEmbed_WordCntrItem* pItem = NULL;
- TRY
- {
- CEmbed_WordDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- pItem = new CEmbed_WordCntrItem(pDoc);
- ASSERT_VALID(pItem);
- GetClientRect(&pItem->rect);
- CLSID clsid;
- 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);
- LPDISPATCH lpDisp;
- lpDisp = pItem->GetIDispatch();
- }
- CATCH(CException, e)
- {
- if (pItem != NULL)
- {
- ASSERT_VALID(pItem);
- pItem->Delete();
- }
- AfxMessageBox(IDP_FAILED_TO_CREATE);
- }
- END_CATCH
- EndWaitCursor();
- }
如果仔細研究過這段代碼,會發現它同AppWizard自動生成的OnInsertObject()函數有著驚人的相似程度,看一下View類中的 OnInsertObject() 方法,對其中的注釋引起了我們的興趣,因為它和我們剛寫的方法有驚人的相似。事實上,我們剛才寫的只不過是OnInsertObject()的一個特例:OnInsertObject()允許用戶從可用的OLE對象列表中選擇其一插入到應用程序中。因為在此我們只需對Word進行自動化,所以派生了這一行為。
(6)為了在程序剛啟動時便將Word嵌入到程序中來,還需在視類的OnInitialUpdate()函數中添加代碼:
- void CEmbed_WordView:nInitialUpdate()
- {
- CView:nInitialUpdate();
- EmbedAutomateWord(); //將Word嵌入
- m_pSelection = NULL;
- }
(7)為了使嵌入的工作區占滿整個客戶區可以通過修改OnDraw函數來實現:
- void CEmbed_WordView:nDraw(CDC* pDC)
- {
- CEmbed_WordDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if (m_pSelection == NULL)
- {
- POSITION pos = pDoc->GetStartPosition();
- m_pSelection = (CEmbed_WordCntrItem*)pDoc->GetNextClientItem(pos);
- }
- if (m_pSelection != NULL)
- {
- CRect rect;
- 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);
- LPUNKNOWN lpUnk = m_lpObject;
- Run();
- LPOLELINK lpOleLink = NULL;
- if (m_lpObject->QueryInterface(IID_IOleLink, (LPVOID FAR*)&lpOleLink) == NOERROR)
- {
- ASSERT(lpOleLink != NULL);
- lpUnk = NULL;
- if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
- {
- TRACE0("Warning: Link is not connected!\n");
- lpOleLink->Release();
- return NULL;
- }
- ASSERT(lpUnk != NULL);
- }
- LPDISPATCH lpDispatch = NULL;
- if (lpUnk->QueryInterface(IID_IDispatch, (LPVOID FAR*)&lpDispatch)!=NOERROR)
- {
- TRACE0("Warning: does not support IDispatch!\n");
- return NULL;
- }
- ASSERT(lpDispatch != NULL);
- return lpDispatch;
(5)。在officeView.h添加#include "msword8.h" //如果是Word2000則為#include "msword9.h"
(6)。修改void COfficeView:nInsertObject(),源碼如下:
- BeginWaitCursor();
- COfficeCntrItem* pItem = NULL;
- TRY
- {
- // Create new item connected to this document.
- COfficeDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- pItem = new COfficeCntrItem(pDoc);
- ASSERT_VALID(pItem);
- // Initialize the item from the dialog data.
- /* if (!dlg.CreateItem(pItem))
- AfxThrowMemoryException(); // any exception will do
- ASSERT_VALID(pItem);*/
- CLSID clsid; //
- 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; // set selection to last inserted item
- pDoc->UpdateAllViews(NULL);
- // As an arbitrary user interface design, this sets the selection
- // to the last item inserted.
- // TODO: reimplement selection as appropriate for your application
- m_pSelection = pItem; // set selection to last inserted item
- pDoc->UpdateAllViews(NULL);
- }
- CATCH(CException, e)
- {
- if (pItem != NULL)
- {
- ASSERT_VALID(pItem);
- pItem->Delete();
- }
- AfxMessageBox(IDP_FAILED_TO_CREATE);
- }
- END_CATCH
- EndWaitCursor();
- (7)重載ID—FILE—SAVE,
- void COfficeView:nFileSave()
- {
- // TODO: Add your command handler code here
- TRY{
- LPDISPATCH lpDisp;
- lpDisp = m_pSelection->GetIDispatch();
- Documents docs;
- _Application app;
- _Document mydoc;
- Documents my;
- mydoc.AttachDispatch (lpDisp,TRUE);
- app=mydoc.GetApplication ();
- /* app.Run ("Macro3");*/
- mydoc.Activate ();
- BOOL password=mydoc.GetHasPassword ();
- mydoc.SetPassword ("love");
- password=mydoc.GetHasPassword ();
- COleVariant vFalse((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,click insert object,and edit ,and save.maybe run macro.
就愛閱讀www.92to.com網友整理共享,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20161206/65579.html
文章列表