Qt利用ActiveX生成Word文档
2013-09-04 21:31
1131 查看
一个Qt的项目,项目中要求生成doc格式的报表,查阅发现这方面的资料比较少,通过有限的资料,自己研究了一下午,终于搞明白了一些。
其中QAxWidget扮演着ActiveX控制器的角色
而QAxObject扮演着COM对象容器的角色
在.pro文件中需要加入如下语句:
程序如下
上面的程序注释写的比较详细了,就不在过多的解释了。只说两个地方:
注意要点是要尽量保证操作的有效性,使宏尽可能的简介。
下面是一个插入一个图片,并设置阴影的宏。
忽略Selection,看后面的内容。
selection应该是指选中当前选中的位置,可以用Range和select等函数定位。
倒序读取这行的内容,AddPicture 后面是空格和一些属性,所以AddPicture 是一个函数,而空格后面则是函数对应的参数
InlineShapes 就是拥有函数 AddPicture 的对象
我们就可以用如下语句创建一个InlineShapes 的对象,并调用使用他的方法
再看最后一句:
还是忽略Selection,看后面的内容。
selection如上所示
依旧倒序读取,最后是一个赋值操作,所以Type是一个属性。而前面每一个被“.”隔开的变量都是一个对象。
我们可以用如下语句完成上述VB的功能:
方法如下:
生成的html文件阅读起来十分方便。
利用word模版,标记书签(bookmark),然后通过Qt读取书签,在相应位置插入内容,将大大简化Qt的代码。
使用书签的方法与使用其他的对象没有大的区别,代码如下:
以上就是我对Qt生成word文件的初步了解
另附一个msdn关于VB和C#的页面:http://msdn.microsoft.com/zh-cn/library/y1xatbkd%28v=vs.80%29.aspx
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生成Word文档
- Qt使用html生成word文档
- 利用freemarker生成包含合并单元格的表格的word文档
- 利用iText生成word文档例子参考
- java中利用itext.jar生成word文档
- POI应用:利用word模板批量生成word文档(java中word文档的读写)
- 利用python程序生成word和PDF文档的方法
- QT 生成word文档
- 利用Java Apache POI 生成Word文档
- [置顶] java后台利用模板生成Word文档提供前台下载
- POI应用:利用word模板批量生成word文档(java中word文档的读写)
- 利用Java Apache POI 生成Word文档示例代码
- Java 中利用 Freemarker 生成 Word 文档
- 利用IText生成word、pdf文档
- JAVA利用FreeMarker生成(导出)Word文档
- JAVA利用FreeMarker生成(导出)Word文档(Bug修改)
- java利用freemarker生成简单格式的word文档
- PHPWord利用模板替换字符串生成精确的word文档
- 利用Java Apache POI 生成Word文档
- 利用freemarker 在模板里面写入动态数据,动态表格,图片插入并生成word文档