officeba > 单独文章


用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();   其函数实现以下:      
 

  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. 

声明:欢迎各大网站转载本站文章,还请保留一条能直接指向本站的超级链接,谢谢!

时间:2012-06-13 10:43:56,点击:65824


【OfficeBa论坛】:阅读本文时遇到了什么问题,可以到论坛进行交流!Excel专家邮件:342327115@qq.com(大家在Excel使用中遇到什么问题,可以咨询此邮箱)。

【声明】:以上文章或资料除注明为Office自创或编辑整理外,均为各方收集或网友推荐所得。其中摘录的内容以共享、研究为目的,不存在任何商业考虑。如有任何异议,请与本站联系,本站确认后将立即撤下。谢谢您的支持与理解!


相关评论

我要评论

评论内容