Qt获取office文件内容 

    需要获取word文件的文件内容。网上找了好久,大部分都是excel的。而word的很少。所以在这里记录一下,方便大家查阅和自己使用。

使用的Qt版本是5.4.2 。

下面通过代码说明:

  1. 首先在.pro文件中加入

    QT       += axcontainer

  2. 需要加入以下头文件

    #include <QAxWidget>

    #include <QAxObject>

  3. 详细代码如下



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void  Qt_word(QString filePath)
{
     //指定要打开文件的路径
     //QString filePath = "D:/doc/local.doc";
     //创建QAxWidget 对象,使其拥有Word的对象
     QAxWidget *word= new  QAxWidget( "Word.Application" , 0, Qt::MSWindowsOwnDC);
     
     //设置word是否为可见,这里设置为false。这样就不会看到word的程序了
     word->setProperty( "Visible" false );
     
     //通过word对象找到它的属性,Document
     QAxObject * documents = word->querySubObject( "Documents" );
     
     //通过Document打开要获取文件内容的文件
     documents->dynamicCall( "Open(QString)" ,filePath);
//    documents->dynamicCall("Open(QString)",QString::fromLocal8Bit("D:/doc/local.doc"));
 
     //获取当前活动的Document
     QAxObject *document = word->querySubObject( "ActiveDocument" );
     
     //从当前活动的Document中获取paragraphs
     QAxObject *paragraphs = document->querySubObject( "Paragraphs" );
 
     //循环输入每一个paragraph
     for  ( int  ipar = 1; ipar <= paragraphs->property( "Count" ).toInt(); ipar++)
     {
         QAxObject *lines = paragraphs->querySubObject( "Item(QVariant)" , ipar);
         QAxObject *line = lines->querySubObject( "Range" );
         QString str = line->property( "Text" ).toString();
         line->clear();
         delete  line;
         lines->clear();
         delete  lines;
         str = str.trimmed();
         qDebug()<<str;
     }
 
     //关闭Document
     document->dynamicCall( "Close (boolean)" false );
//     document->dynamicCall("Close (boolean)", false);
 
     //退出word
     word->dynamicCall( "Quit()" );
     
}


由于对word的内部组织不是很清楚。所以都是一点点摸索出来。

目前只是对word2003进行了测试。2007以上版本还不好使。希望有清楚word内部组织的朋友能够指点一下。

参考自:http://it-ua.info/news/2015/08/10/parsing-dokumenta-word-na-kartinki-abo-storya-pro-pereddiplomnih-budn.html

2016-04-24 19:21:44