您的位置: 首页 > Word技巧 >

用VC写word文件方法

时间:2013-12-14 整理:docExcel.net

问题:您能给我介绍点用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. 
CAJ转换成Word方法大全 2种方法教你怎么将CAJ转W 问题:CAJ转换成Word方法大全 2种方法教你怎么将CAJ转W
回答:...日常办公中除了一些常用到得doc、xls、ppt、docx、xlsx、pptx文件外,我们还会遇到各种各样格式的文件。比如CAJ文件。CAJ全称China Academic Journals,中国学术期刊全文数据库中文件的一种格式,我们可以用CAJViewer浏览器来阅读。CAJView...
四种拯救Excel表格损坏的方法 问题:四种拯救Excel表格损坏的方法
回答:...方法:采取直接修复 最新版本的Excel具有直接修复受损文件的功能,大家可以利用Excel新增的“打开并修复”命令,来直接检查并修复Excel文件中的错误,只要单击该命令,Excel就会打开一个修复对话框,单击该对话框中的...
常见的几种减少Word容量方法 问题:常见的几种减少Word容量方法
回答:只要我们使用“文件”菜单下的“另存为”命令,Word则会重新将信息进行整理存盘,这样会使得文件的容量大大减少。 利用Word生成的文档,每页在20KB左右,但看到用记事本生成的文档,相同的内容只有1KB左右,能...
在Word2007中打开OpenDocument文本文件方法 问题:在Word2007中打开OpenDocument文本文件方法
回答:...o;Office 按钮”,然后单击“打开”。 2、在“文件类型”列表中,单击“OpenDocument 文本”。 3、单击要打开的文件,然后单击“打开”。 注释:在 Word 2007 中打开 OpenDocument 文本文件时,其格式可能不...
Word2003基础知识:保存网页HTML文件方法 问题:Word2003基础知识:保存网页HTML文件方法
回答: Word2003基本操作中的保存,不仅可以将编辑后的文件保存为常用的“.Doc”格式,而且还可以将文件保存为网页“Html”格式。当然保存“Html”网页格式可以让浏览更加方便,而且在计算机没装Office的时候,也可...
Word2003文档打不开的几种常见解决方法 问题:Word2003文档打不开的几种常见解决方法
回答:...常运行。 依此操作,问题解决!!! 首先找到下面这个文件夹: C:Documents and SettingsAdministratorApplication DataMicrosoftTemplates 会看到“Normal.dot” 这个文件,这是公用模板文件,应该是损坏了,直接将其删除,排除故障。 如果...
相关知识:

下面内容对您也许有用

      话题:如何用VC生成word文件?知道
      答:用word的ole接口
      话题:VC6.0怎么打开Word文件?知道
      问:我下载了WPS2013。但是找不到MSWORD9.OLB。到网上下载的Microsoft Office 2003
      答:MSWORD9.OLB好像是officw2000的文件吧。Microsoft Office 2003使用的是这个文件:“MSWORD.OLB”。如果你的是默认的安装目录,那么,在加载库文件的时候,定位到
      话题:如何用VC+实现从对话框生成word文档
      答:调用ms模仿word的各种操作,生成相应格式的word文件,你可以到csdn网上搜索一些例子。总之用vc+是比较麻烦的,相关数据格式转换比较繁琐。不过对开发工具 如何用VC生成word文件? 想把VC每次生成的word文件保存为
      话题:添加文件到工程出错?是Vc 和word的冲突吗?知道
      问:请问这是怎么回事 该怎么办呢?我是按照你说的 添加.rc文件到工程的 谢谢啊
      答:可能是vc6.0的问题,你在菜单“Build”有个Clean,然后重新编译下。 VC工程添加文件出错? VCWORD中插入图表问题?
      话题:关于用vc写文件的问题
      问:程序要实现的功能是这样的:在D盘创建一个dxf格式文件(CAD中转文件,ASCII码)
      答:你先说你写的时候代码出现了什么错误啊.大体框架对着,然后就看你写的时候哪里出问题了 vc+写文件大多用哪个的 我用VC写了一个程序,现在要创建
      话题:我的程序复制粘贴到word,文本文件中,为什么都是乱码?我用的
      问:英文不是乱码。一切正常。后面的汉字都是乱码。
      答:编码问题。试试先贴到txt文档里面,然后看看编码是不是utf8,是的话再考到word
      话题:怎么用VC读取Word文本框中的内容?知道
      怎么用VC读取Word文本框中的内容?vc6测试成功,写的有点乱你自己好好看看吧._Application app;
      话题:一个经典的hello word的VC+程序包含几个文件
      答:其实如果完全纯手工来写,一个hello.cpp文件就足够了。如果用VC的向导来创建一个hello world程序,会有如下文件:hello.cpp hello.dsp hello.dsw hello.ncb VC+2008 如何创建hello word程序 一般想试调些VC+的小程序用什么
      话题:如何用vc 2010打开指定的word文档
      问:请教,如何在vc程序中开始不显示地更改某个word文件的内容,而后调用word予以
      答:C#中有微软提供的操作word的类库,我曾经使用过 C++中应该也有的吧,如果没有官方的,或者找第三方的 如果是OPEN XML 格式的 WORD 文档,看看给有类库,没有 在Word 2010中怎样打开文本文件 Word2010无法打开Word2003的文档
      话题:请高手帮忙解决一下,如何在VC中读取word文件的内容并进行处理
      问:我目前要解决的就是在VC中打开一个word文件,读取并分析其中的内容(包括文本和
      答:vc6测试成功,写的有点乱你自己好好看看吧._Application app;Documents docs;Document doc;Tables WordTables;Table WordTable;Cell WordCell;Range WordRange; 怎样用vc+读取word文档中的内容 怎么用VC读取Word文本框中的内容
最新评论