文章出處

問題:您能給我介紹點用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();   其函數實現如下:      
 

  1. LPDISPATCH   CEmbed_WordCntrItem::GetIDispatch()     
  2.       
  3. {     
  4.       
  5. ASSERT_VALID(this);     
  6.       
  7. ASSERT(m_lpObject   !=   NULL);     
  8.       
  9. LPUNKNOWN   lpUnk   =   m_lpObject;     
  10.       
  11. Run();     
  12.       
  13. LPOLELINK   lpOleLink   =   NULL;     
  14.       
  15. if(m_lpObject->QueryInterface(IID_IOleLink,(LPVOID   FAR*)&lpOleLink)==   NOERROR)     
  16.       
  17. {     
  18.       
  19. ASSERT(lpOleLink   !=   NULL);     
  20.       
  21. lpUnk   =   NULL;     
  22.       
  23. if(lpOleLink->GetBoundSource(&lpUnk)   !=   NOERROR)     
  24.       
  25. {     
  26.       
  27. TRACE0("Warning:   Link   is   not   connected!\n");     
  28.       
  29. lpOleLink->Release();     
  30.       
  31. }     
  32.       
  33. ASSERT(lpUnk   !=   NULL);     
  34.       
  35. }     
  36.       
  37. LPDISPATCH   lpDispatch   =   NULL;     
  38.       
  39. if(lpUnk->QueryInterface(IID_IDispatch,(LPVOID   FAR*)&lpDispatch)   !=   NOERROR)     
  40.       
  41. {     
  42.       
  43. TRACE0("Waring:   does   not   support   IDispatch!\n");     
  44.       
  45. return   NULL;     
  46.       
  47. }     
  48.       
  49. ASSERT(lpDispatch   !=   NULL);     
  50.       
  51. return   lpDispatch;     
  52.       
  53. }    

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

  1. void   CEmbed_WordView::EmbedAutomateWord()     
  2.       
  3. {     
  4.       
  5. BeginWaitCursor();     
  6.       
  7. CEmbed_WordCntrItem*   pItem   =   NULL;     
  8.       
  9. TRY     
  10.       
  11. {     
  12.       
  13. CEmbed_WordDoc*   pDoc   =   GetDocument();     
  14.       
  15. ASSERT_VALID(pDoc);     
  16.       
  17. pItem   =   new   CEmbed_WordCntrItem(pDoc);     
  18.       
  19. ASSERT_VALID(pItem);     
  20.       
  21. GetClientRect(&pItem->rect);     
  22.       
  23. CLSID   clsid;     
  24.       
  25. if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)))     
  26.       
  27. AfxThrowMemoryException();     
  28.       
  29. if(!pItem->CreateNewItem(clsid))     
  30.       
  31. AfxThrowMemoryException();     
  32.       
  33. ASSERT_VALID(pItem);     
  34.       
  35. pItem->DoVerb(OLEIVERB_SHOW,   this);     
  36.       
  37. m_pSelection   =   pItem;     
  38.       
  39. pDoc->UpdateAllViews(NULL);     
  40.       
  41. LPDISPATCH   lpDisp;     
  42.       
  43. lpDisp   =   pItem->GetIDispatch();     
  44.       
  45. }     
  46.       
  47. CATCH(CException,   e)     
  48.       
  49. {     
  50.       
  51. if   (pItem   !=   NULL)     
  52.       
  53. {     
  54.       
  55. ASSERT_VALID(pItem);     
  56.       
  57. pItem->Delete();     
  58.       
  59. }     
  60.       
  61. AfxMessageBox(IDP_FAILED_TO_CREATE);     
  62.       
  63. }     
  64.       
  65. END_CATCH     
  66.       
  67. EndWaitCursor();     
  68.       
  69. }    

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

  1. void   CEmbed_WordView:nInitialUpdate()     
  2.       
  3. {     
  4.       
  5. CView:nInitialUpdate();     
  6.       
  7. EmbedAutomateWord();   //將Word嵌入     
  8.       
  9. m_pSelection   =   NULL;     
  10.       
  11. }    

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

  1. void   CEmbed_WordView:nDraw(CDC*   pDC)     
  2.       
  3. {     
  4.       
  5. CEmbed_WordDoc*   pDoc   =   GetDocument();     
  6.       
  7. ASSERT_VALID(pDoc);     
  8.       
  9. if   (m_pSelection   ==   NULL)     
  10.       
  11. {     
  12.       
  13. POSITION   pos   =   pDoc->GetStartPosition();     
  14.       
  15. m_pSelection   =   (CEmbed_WordCntrItem*)pDoc->GetNextClientItem(pos);     
  16.       
  17. }     
  18.       
  19. if   (m_pSelection   !=   NULL)     
  20.       
  21. {     
  22.       
  23. CRect   rect;     
  24.       
  25. GetClientRect(&m_pSelection->rect);     
  26.       
  27. m_pSelection->OnGetItemPosition(rect);     
  28.       
  29. m_pSelection->Draw(pDC,rect);     
  30.       
  31. }     
  32.       
  33. }   

二:
在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()

其源碼如下:
 

  1.     ASSERT_VALID(this);         
  2. ASSERT(m_lpObject   !=   NULL);           
  3. LPUNKNOWN   lpUnk   =   m_lpObject;           
  4. Run();           
  5. LPOLELINK   lpOleLink   =   NULL;         
  6. if   (m_lpObject->QueryInterface(IID_IOleLink,   (LPVOID   FAR*)&lpOleLink)   ==   NOERROR)           
  7. {           
  8.     ASSERT(lpOleLink   !=   NULL);           
  9.     lpUnk   =   NULL;                   
  10.     if   (lpOleLink->GetBoundSource(&lpUnk)   !=   NOERROR)             
  11.     {             
  12.       TRACE0("Warning:   Link   is   not   connected!\n");             
  13.       lpOleLink->Release();             
  14.       return   NULL;             
  15.     }           
  16.     ASSERT(lpUnk   !=   NULL);           
  17. }             
  18. LPDISPATCH   lpDispatch   =   NULL;         
  19. if   (lpUnk->QueryInterface(IID_IDispatch,   (LPVOID   FAR*)&lpDispatch)!=NOERROR)           
  20. {       
  21.         TRACE0("Warning:   does   not   support   IDispatch!\n");           
  22.     return   NULL;       
  23.         
  24. }       
  25. ASSERT(lpDispatch   !=   NULL);         
  26. return   lpDispatch;      

(5)。在officeView.h添加#include   "msword8.h"   //如果是Word2000則為#include   "msword9.h"

(6)。修改void   COfficeView:nInsertObject(),源碼如下:
 

  1. BeginWaitCursor();     
  2.       
  3.   COfficeCntrItem*   pItem   =   NULL;     
  4.   TRY     
  5.   {     
  6.       //   Create   new   item   connected   to   this   document.     
  7.       COfficeDoc*   pDoc   =   GetDocument();     
  8.       ASSERT_VALID(pDoc);     
  9.       pItem   =   new   COfficeCntrItem(pDoc);     
  10.       ASSERT_VALID(pItem);     
  11.       
  12.       //   Initialize   the   item   from   the   dialog   data.     
  13.   /*   if   (!dlg.CreateItem(pItem))     
  14.         AfxThrowMemoryException();     //   any   exception   will   do     
  15.       ASSERT_VALID(pItem);*/     
  16.         CLSID   clsid;   //     
  17.       if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)))       
  18.         AfxThrowMemoryException();       
  19.           
  20.   if(bOpenStatus) //如果是打開文檔     
  21.   {     
  22.   if(!pItem->CreateFromFile   (sFilename,clsid))   //打開已有文檔     
  23.   AfxThrowMemoryException();       
  24.   }     
  25.   else //否則新建文檔     
  26.   {     
  27.   if(!pItem->CreateNewItem(clsid))   //新建文檔     
  28.   AfxThrowMemoryException();       
  29.   }       
  30.   ASSERT_VALID(pItem);       
  31.           
  32.       pItem->Activate   (OLEIVERB_SHOW,this);     
  33.           
  34.       
  35.       
  36.       ASSERT_VALID(pItem);     
  37.                     m_pSelection   =   pItem;       //   set   selection   to   last   inserted   item     
  38.       pDoc->UpdateAllViews(NULL);     
  39.       //   As   an   arbitrary   user   interface   design,   this   sets   the   selection     
  40.       //     to   the   last   item   inserted.     
  41.       
  42.       //   TODO:   reimplement   selection   as   appropriate   for   your   application     
  43.       
  44.       m_pSelection   =   pItem;       //   set   selection   to   last   inserted   item     
  45.       pDoc->UpdateAllViews(NULL);     
  46.   }     
  47.   CATCH(CException,   e)     
  48.   {     
  49.       if   (pItem   !=   NULL)     
  50.       {     
  51.         ASSERT_VALID(pItem);     
  52.         pItem->Delete();     
  53.       }     
  54.       AfxMessageBox(IDP_FAILED_TO_CREATE);     
  55.   }     
  56.   END_CATCH     
  57.       
  58.   EndWaitCursor();     
  59.       
  60.   (7)重載ID—FILE—SAVE,     
  61.       
  62.   void   COfficeView:nFileSave()       
  63.   {     
  64.   //   TODO:   Add   your   command   handler   code   here     
  65.       TRY{     
  66.             LPDISPATCH   lpDisp;       
  67.           
  68.       lpDisp   =   m_pSelection->GetIDispatch();       
  69.       
  70.           Documents   docs;     
  71.           
  72.       _Application   app;       
  73.           
  74.       _Document   mydoc;     
  75.       Documents   my;     
  76.       
  77.       mydoc.AttachDispatch   (lpDisp,TRUE);     
  78.       app=mydoc.GetApplication   ();     
  79.           /*       app.Run   ("Macro3");*/     
  80.             mydoc.Activate   ();     
  81.       BOOL   password=mydoc.GetHasPassword   ();     
  82.       mydoc.SetPassword   ("love");     
  83.       password=mydoc.GetHasPassword   ();         
  84.       COleVariant   vFalse((short)FALSE);     
  85.       mydoc.SaveAs   (COleVariant(filename),vFalse,vFalse,   COleVariant(""),vFalse,   //filename為一個以字符串表達的文件名   如"c:\\love1.doc"     
  86.         COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);     
  87.           
  88.   }     
  89.   CATCH(CException,   e)     
  90.   {     
  91.                   }     
  92.   END_CATCH     
  93.   }     
  94.       
  95.   bulid,click   insert   object,and   edit   ,and   save.maybe   run   macro. 

就愛閱讀www.92to.com網友整理共享,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20161206/65579.html

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()