您的位置:首页 > 编程语言 > Qt开发

Qt利用ActiveX生成Word文档

2013-09-04 21:31 1131 查看
一个Qt的项目,项目中要求生成doc格式的报表,查阅发现这方面的资料比较少,通过有限的资料,自己研究了一下午,终于搞明白了一些。

Qt中的ActiveQt框架

控制word主要使用的两个类:QAxWidget和QAxObject

Qt通过QAxWidget和QAxObject来使用ActiveX控件

其中QAxWidget扮演着ActiveX控制器的角色

而QAxObject扮演着COM对象容器的角色

程序中必要的引用和配置文件更改

需要引用如下头文件

#include <QAxWidget>
#include <QAxObject>


在.pro文件中需要加入如下语句:

CONFIG  += qaxcontainer


一个写word文件的例子

程序如下

#include <QApplication>
#include <QAxWidget> #include <QAxObject>
#include <QFile>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 新建一个word应用程序,并设置为不可见
QAxWidget *word=new QAxWidget("Word.Application", 0, Qt::MSWindowsOwnDC);
word->setProperty("Visible", false);
// 获取所有的工作文档
QAxObject * documents = word->querySubObject("Documents");
// 以文件template.dot为模版新建一个文档
documents->dynamicCall("Add(QString)",QString("D:/template.dot"));
// 获取当前激活的文档
QAxObject *document=word->querySubObject("ActiveDocument"); // 获取文档中名字为label1的标签 QAxObject*bookmark_text=document->querySubObject("Bookmarks(label1)"); // 选中标签,将字符InsertText插入到标签位置 if(!bookmark_text->isNull()) { bookmark_text->dynamicCall("Select(void)"); bookmark_text->querySubObject("Range")->setProperty("Text","InsertText"); }
// 获取文档中名字为label2的标签
QAxObject *bookmark_pic = document->querySubObject("Bookmarks(label2)");
// 选中标签,将图片插入到标签位置
if(!bookmark_pic->isNull())
{
bookmark_pic->dynamicCall("Select(void)");
QAxObject *Inlineshapes = document->querySubObject("InlineShapes"); Inlineshapes->dynamicCall("AddPicture(const QString&)","D:\\123.jpg"); //路径必须为windows路径格式
}

// 将文件另存为docbyqt.doc,关闭工作文档,退出应用程序
document->dynamicCall("SaveAs (const QString&)", QString("D:/docbyqt.doc"));
document->dynamicCall("Close (boolean)", false);
word->dynamicCall("Quit()");

delete bookmark_text;
delete bookmark_pic;
delete document;
delete documents;
delete word;

return 0;
}


上面的程序注释写的比较详细了,就不在过多的解释了。只说两个地方:

对象函数的调用

QAxObject *subobject = object->querySubObject("name");
subobject->dynamicCall("function(paraList)",para);


对象属性的设置

object->setProperty("property_key",property_value);


得到COM的类、对象以及对象的函数和属性的方法

第一步,得到word宏的VBA代码

方法就是在word中录制操作的宏,然后查看宏的内容。

注意要点是要尽量保证操作的有效性,使宏尽可能的简介。

下面是一个插入一个图片,并设置阴影的宏。

Sub 宏1()
Selection.InlineShapes.AddPicture FileName:="D:\123.jpg", LinkToFile:= _
False, SaveWithDocument:=True
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.InlineShapes(1).Shadow.Type = msoShadow5
End Sub


第二步,从宏中解析出想要的信息

先以第一句代码为例:

忽略Selection,看后面的内容。

selection应该是指选中当前选中的位置,可以用Range和select等函数定位。

倒序读取这行的内容,AddPicture 后面是空格和一些属性,所以AddPicture 是一个函数,而空格后面则是函数对应的参数

InlineShapes 就是拥有函数 AddPicture 的对象

我们就可以用如下语句创建一个InlineShapes 的对象,并调用使用他的方法

QAxObject *Inlineshapes = document->querySubObject("InlineShapes");
Inlineshapes->dynamicCall("AddPicture(const QString&)","D:\\123.jpg");


再看最后一句:

还是忽略Selection,看后面的内容。

selection如上所示

依旧倒序读取,最后是一个赋值操作,所以Type是一个属性。而前面每一个被“.”隔开的变量都是一个对象。

我们可以用如下语句完成上述VB的功能:

QAxObject *Inlineshape = document->querySubObject("InlineShapes(1)");
QAxObject *Shadow = Inlineshape->querySubObject("Shadow");
Shadow->dynamicCall("SetType(Office::MsoShadowType)", 5);


第三步,获取类的API文档

当我们想系统的了解一个类的时候,最方便的就是读API文档。幸运的是,Qt能够生成COM的API

方法如下:

QString doc=object->generateDocumentation();
QFile outFile("d:/object.html");
outFile.open(QIODevice::WriteOnly|QIODevice::Append);
QTextStream ts(&outFile);
ts<<doc<<endl;


生成的html文件阅读起来十分方便。

使用word模版(.dot)和书签

word有模版和标签机制,可以方便的创建一个框架并且标记要插入内容的位置,非常便于生成word文件。

利用word模版,标记书签(bookmark),然后通过Qt读取书签,在相应位置插入内容,将大大简化Qt的代码。

使用书签的方法与使用其他的对象没有大的区别,代码如下:

QAxObject *document=word->querySubObject("ActiveDocument");
// 获取文档中名字为label1的标签
QAxObject*bookmark_text=document->querySubObject("Bookmarks(label1)");
// 选中标签,将字符InsertText插入到标签位置
if(!bookmark_text->isNull())
{
bookmark_text->dynamicCall("Select(void)");
bookmark_text->querySubObject("Range")->setProperty("Text","InsertText");
}


以上就是我对Qt生成word文件的初步了解

另附一个msdn关于VB和C#的页面:http://msdn.microsoft.com/zh-cn/library/y1xatbkd%28v=vs.80%29.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Qt C++ activex word