利用QT生成Word文档_第1页
利用QT生成Word文档_第2页
利用QT生成Word文档_第3页
利用QT生成Word文档_第4页
利用QT生成Word文档_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、前段时间因一个项目的需要,需要用Qt生成Word报告,网上查阅并借鉴了相关资料终于解决了基本的问题。本文档中主要是基本数据的填充、数据表格和图片几种类型,所以是用word模板(.dot)和书签进行操作。(网上看有种方法是利用宏来进行操作,表示不是很懂,哈哈)。一、主要方法1、根据报告要求,设计word模板,定义好需要插入数据的标签,调好其他固定内容的格式。(以保证数据插入后文档内容排列有序)2、编写word操作接口类,主要包括:打开、关闭、保存、插入文本、插入图片、插入表格、相关格式调整函数3、编写生成报告界面类,调用接口函数生成word文档。二、接口函数WordEngine.h文件cpp&#

2、160;view plain copy1. #ifndef WORDENGINE_H  2. #define WORDENGINE_H  3. #include <QObject>  4. #include <QAxObject>  5. #include <QtCore>  6. class WordEngine : public QObject &

3、#160;7.   8.     Q_OBJECT  9. public:  10.     WordEngine();  11.     WordEngine();  12.   13.     / 打开Word文件,如果sFile路径为空或错误,则打开新的Word文档  14. 

4、60;   bool Open(QString sFile, bool bVisible = true);  15.   16.     void save(QString sSavePath);  17.   18.     void close(bool bSave = true);&

5、#160; 19.   20.     bool replaceText(QString sLabel,QString sText);  21.     bool replacePic(QString sLabel,QString sFile);  22.     /插入一个几行几列表格  23.   

6、60; QAxObject *insertTable(QString sLabel,int row,int column);  24.     /插入一个几行几列表格 并设置表头  25.     QAxObject *insertTable(QString sLabel,int row,int column,QStringList headList); &

7、#160;26.     /设置列宽  27.     void setColumnWidth(QAxObject *table,int column, int width);  28.     void SetTableCellString(QAxObject *table, int row,int column,QString

8、0;text);  29.   30. private:  31.   32.     QAxObject *m_pWord;      /指向整个Word应用程序  33.     QAxObject *m_pWorkDocuments;  /指向文档集,Word有很多文档  34.  

9、   QAxObject *m_pWorkDocument;   /指向m_sFile对应的文档,就是要操作的文档  35.   36.     QString m_sFile;  37.     bool m_bIsOpen;  38.     bool m_bNewFile; 

10、0;39. ;  40.   41. #endif / WORDENGINE_H  WordEngine.cpp文件cpp view plain copy1. #include "WordEngine.h"  2. #include "qt_windows.h"  3. WordEngine:WordEngine()  4.   5.   

11、;  m_pWord = NULL;  6.     m_pWorkDocuments = NULL;  7.     m_pWorkDocument = NULL;  8.   9.     m_bIsOpen = false;  10.    &

12、#160;m_bNewFile = false;  11.   12.     HRESULT result = OleInitialize(0);  13.   14.     if (result != S_OK && result != S_FALSE)  15.  

13、     16.         qDebug()<<QString("Could not initialize OLE (error %x)").arg(unsigned int)result);  17.       18.   19.   20. Wo

14、rdEngine:WordEngine()  21.   22.     /if(m_bIsOpen)  23.     /    close();  24.   25.     OleUninitialize();  26.   27.   28. bool Word

15、Engine:Open(QString sFile, bool bVisible)  29.   30.      /新建一个word应用程序  31.      m_pWord = new QAxObject();  32.      bool bFlag = m_pWord-

16、>setControl( "word.Application" );  33.      if(!bFlag)  34.        35.         return false;  36.        3

17、7.      m_pWord->setProperty("Visible", bVisible);  38.      /获取所有的工作文档  39.      QAxObject *document = m_pWord->querySubObject("Documents");  40. &#

18、160;    if(!document)  41.        42.         return false;  43.        44.      /以文件template.dot为模版新建一个文档  45

19、.      document->dynamicCall("Add(QString)", sFile);  46.      /获取当前激活的文档  47.      m_pWorkDocument = m_pWord->querySubObject("ActiveDocument");  48. 

20、0;    if(m_pWorkDocument)  49.          m_bIsOpen = true;  50.      else  51.          m_bIsOpen = false; 

21、0;52.   53.      return m_bIsOpen;  54.   55.   56. void WordEngine:save(QString sSavePath)  57.   58.     if(m_bIsOpen && m_pWorkDocument)  59.  &

22、#160;    60.         if(m_bNewFile)  61.             m_pWorkDocument->dynamicCall("Save()");  62.         &

23、#160; 63.         else  64.             /m_pWorkDocument->dynamicCall("SaveAs (const QString&,int,const QString&,const QString&,bool,bool)",

24、  65.              /                           m_sFile,56,QString(""),QString(&q

25、uot;"),false,false);  66.             m_pWorkDocument->dynamicCall("SaveAs (const QString&)", sSavePath);  67.           68.  &#

26、160;    69.     qDebug()<<"save Done."  70.   71.   72. void WordEngine:close(bool bSave)  73.   74.     if(bSave)  75.      

27、;   /save();  76.       77.     if(m_pWord)  78.         m_pWord->setProperty("DisplayAlerts", true);  79.       80.

28、    if(m_pWorkDocument)  81.         m_pWorkDocument->dynamicCall("Close(bool)", true);  82.       83.     if(m_pWord)  84.    

29、     m_pWord->dynamicCall("Quit()");  85.       86.     if(m_pWorkDocuments)  87.       88.         delete m_pWorkDoc

30、uments;  89.       90.     if(m_pWord)  91.       92.         delete m_pWord;  93.       94.    

31、0;m_pWorkDocument = NULL;  95.     m_pWorkDocuments = NULL;  96.     m_pWord = NULL;  97.   98.     m_bIsOpen   = false;  99.   &#

32、160; m_bNewFile  = false;  100.   101.   102.   103. bool WordEngine:replaceText(QString sLabel,QString sText)  104.   105.     if(!m_pWorkDocument)  106.    &#

33、160;    return false;  107.       108.     /获取文档中名字为sLabel的标签  109.     QAxObject *pBookmark = m_pWorkDocument->querySubObject("Bookmarks(QString)",sLabel);&

34、#160; 110.     if(pBookmark)  111.       112.         pBookmark->dynamicCall("Select(void)");  113.         pBookmark->querySubOb

35、ject("Range")->setProperty("Text",sText);  114.         delete pBookmark;  115.       116.     return true;  117.   118.   119.

36、 bool WordEngine:replacePic(QString sLabel,QString sFile)  120.   121.     if(!m_pWorkDocument)  122.         return false;  123.   124.     QAxObject

37、 *bookmark_pic = m_pWorkDocument->querySubObject("Bookmarks(QString)",sLabel);  125.     if(bookmark_pic)  126.       127.         bookmark_pic->dynamicCall(&q

38、uot;Select(void)");  128.         QAxObject *Inlineshapes = m_pWorkDocument->querySubObject("InlineShapes");  129.         Inlineshapes->dynamicCall("AddPictur

39、e(const QString&)",sFile);  130.         delete Inlineshapes;  131.       132.     return true;  133.   134.   135. QAxObject *Word

40、Engine:insertTable(QString sLabel, int row, int column)  136.   137.      QAxObject *bookmark = m_pWorkDocument->querySubObject("Bookmarks(QVariant)", sLabel);  138.    

41、60; if(bookmark)  139.        140.        bookmark->dynamicCall("Select(void)");  141.        QAxObject *selection = m_pWord->querySubObjec

42、t("Selection");  142.   143.        selection->dynamicCall("InsertAfter(QString&)", "n");  144.        /selection->dynamicCall("MoveLeft(int)",&#

43、160;1);  145.        selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphCenter");  146.        /selection->dynamicCall("Type

44、Text(QString&)", "Table Test");/设置标题  147.   148.        QAxObject *range = selection->querySubObject("Range");  149.        QAxObject *ta

45、bles = m_pWorkDocument->querySubObject("Tables");  150.        QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(),row,column);  151.   152.  &

46、#160;     for(int i=1;i<=6;i+)  153.          154.            QString str = QString("Borders(-%1)").arg(i);  155.  &#

47、160;         QAxObject *borders = table->querySubObject(str.toAscii().constData();  156.            borders->dynamicCall("SetLineStyle(int)",1);  157

48、.          158.        return table;  159.        160.   161.   162. QAxObject *WordEngine:insertTable(QString sLabel, int row,

49、60;int column, QStringList headList)  163.   164.     QAxObject *bookmark = m_pWorkDocument->querySubObject("Bookmarks(QVariant)", sLabel);  165.     if(headList.size() != 

50、column)  166.         return NULL;  167.       168.     if(bookmark)  169.       170.       bookmark->dynamicCal

51、l("Select(void)");  171.       QAxObject *selection = m_pWord->querySubObject("Selection");  172.   173.       selection->dynamicCall("InsertAfter(QString&)&quo

52、t;, "rn");  174.       /selection->dynamicCall("MoveLeft(int)", 1);  175.       selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "

53、;wdAlignParagraphCenter");  176.       /设置标题  177.       /selection->dynamicCall("TypeText(QString&)", "Table Test");  178.   179.     

54、60; QAxObject *range = selection->querySubObject("Range");  180.       QAxObject *tables = m_pWorkDocument->querySubObject("Tables");  181.       QAxObject

55、0;*table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(),row,column);  182.       /表格自动拉伸列 0固定  1根据内容调整  2 根据窗口调整  183.       table->dynamicC

56、all("AutoFitBehavior(WdAutoFitBehavior)", 2);  184.   185.       /设置表头  186.       for(int i=0;i<headList.size();i+)  187.          

57、 table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetText(QString)", headList.at(i);  188.           /加粗  189.       

58、;    table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetBold(int)", true);  190.         191.   192.       for(int i=1;i<=6;i+)  193.         194.         

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论