欢迎大家来到IT世界,在知识的湖畔探索吧!
与其他高级语言平台一样,Qt也提供了访问Office文档的功能,可实现对Mircosoft Office套件(包括Excel、Word等)的访问和灵活操作。
Qt可在程序中直接操作读写Office中的数据,也可以通过控件将Office文档中的数据显示在应用程序图形界面上供用户预览。在开始做实例之前,先介绍这两种操作方式通行的编程步骤。
一、QAxObject对象访问
从下图可看出Qt操作Excel的基本流程。
欢迎大家来到IT世界,在知识的湖畔探索吧!
QAxObject是Qt提供给程序员从代码中访问Office的对象类,其本质上是一个面向微软操作系统的COM接口,它操作Excel和Word的基本流程分别如图和图所示。QAxObject将所有Office的工作簿、表格、文档等都作为其子对象,程序员通过调用querySubObject()这个统一的方法来获取各个子对象的实例,再用dynamicCall()方法执行各对象上的具体操作。
1. 操作Excel的基本流程
(1) 启动Excel进程、获取Excel工作簿集。
创建Excel进程使用如下语句:
QAxObject *myexcel = new QAxObject("Excel.Application");
欢迎大家来到IT世界,在知识的湖畔探索吧!
其中,myexcel为进程的实例对象名,该名称由用户自己定义,整个程序中引用一致即可。
通过进程获取Excel工作簿集,语句为:
欢迎大家来到IT世界,在知识的湖畔探索吧!QAxObject *myworks = myexcel->querySubObject("WorkBooks");
其中,myworks是工作簿集的引用,用户可根据需要定义其名称,同样,在程序中也要求引用一致。
有了Excel进程和工作簿集的引用,就可以使用它们对Excel进行一系列文档级别的操作,例如:
myworks->dynamicCall("Add"); //添加一个工作簿 myexcel->querySubObject("ActiveWorkBook"); //获取当前活动的工作簿
(2) 获取电子表格集
每个Excel工作簿中都可以包含若干电子表格(Sheet),通过打开的当前工作簿获取其所有电子表格的程序语句为:
欢迎大家来到IT世界,在知识的湖畔探索吧!QAxObject *mysheets = workbook->querySubObject("Sheets");
其中,workbook也是一个QAxObject对象,引用的是当前正在操作的一个活动工作簿。同理,在获取了电子表格集后,就可以像操作工作簿文档那样,对其中的表格执行各种操作,例如:
mysheets->dynamicCall("Add"); //添加一个表格 workbook->querySubobject("ActiveSheet"); //获取工作簿中当前活动表格 sheet->setProperty("Name",字符串); //给表格命名
其中,sheet也是个QAxObject对象,代表当前所操作的表格。
(3) 操作单元格及其数据
对Excel的操作最终要落实到对某个电子表格单元格中数据信息的读写上,在Qt中的Excel单元格同样是作为QAxObject对象来看待的,对它的操作通过其所在表格的QAxObject对象句柄执行,如下:
欢迎大家来到IT世界,在知识的湖畔探索吧!QAxObject *cell = sheet->querySubObject("Range(QVariant, QVariant)",单元格编号); cell->dynamicCall("SetValue(const QVariant&)", QVariant(字符串));
这样,就实现了对Excel各个级别对象的灵活操作和使用。
为避免资源无谓消耗和程序死锁,通常在编程结束时还必须通过语句释放该Excel进程所占据的系统资源,如下:
workbook->dynamicCall("Close()''); //关闭工作簿 myexcel->dynamicCall("Quit()"); //退出进程
2.操作Word的基本流程
从下图可看出Qt操作Word的基本流程。
(1) 启动Word进程、获取Word文档集。
创建Word进程使用如下语句:
欢迎大家来到IT世界,在知识的湖畔探索吧!QAxObject *myword = new QAxObject("Word.Application");
其中,myword为进程的实例对象名,该名称由用户自己定义,整个程序中引用一致即可。通过进程获取Word文档集,语句为:
QAxObject *mydocs = myword->querySubObject("Documents");
其中,mydocs是文档集的引用,用户可根据需要定义其名称,同样,在程序中也要求引用一致。
有了Word进程和文档集的引用,就可以使用它们对Word文档执行操作,例如:
欢迎大家来到IT世界,在知识的湖畔探索吧!mydocs->dynamicCall("Add(void)"); //添加一个新文档 myword->querySubObject("ActiveDocument"); //获取当前打开的活动文档
(2)获取和操作当前选中的段落。
一个Word文档由若干文本段落构成,通过文档句柄可对当前选中的段落执行特定的操作,如下:
QAxObject *paragraph = myword->querySubObject("Selection");
其中,paragraph是一个QAxObject对象,引用的是当前所选中将要对其执行操作的一个段落文本。
下面举两个操作Word文档段落的语句的例子:
欢迎大家来到IT世界,在知识的湖畔探索吧!paragraph->dynamicCall("TypeText(const QString&)",字符串);//写入文本字符串 paragraph = document->querySubObject("Range()"); //获取文本 QString str = paragraph->property("Text").toString(); //读出文本字符串
其中,document是一个表示当前活动文档的QAxObject对象。
同样,在使用完Word文档之后也要进行释放资源和关闭进程的善后处理,如下:
document->dynamicCall("Close()''); //关闭文档 myword->dynamicCall("Quit()"); //退出进程
从以上介绍可以看出,Qt对Excel和Word的操作有很多相通的地方,读者可以将两者放在一起比照学习以加深理解。
二、AxWidget界面显示
除用程序代码中的QAxObject对象直接操作Office外,Qt还支持用户在应用程序界面上实时地显示和预览Office文档的内容,这通过Qt中的QAxWidget对象来实现。它的机制是:将桌面程序界面上的某个Qt控件重定义包装为专用于显示Office文档的QAxWidget对象实例,该实例与用户程序中所启动的特定Office进程相关联,就具备了显示外部文档的增强功能,本质上就是用Qt的组件调用外部的Microsoft Office组件,实际在后台执行功能的仍然是Microsoft Office的COM组件。
例如,将一个Qt的标签(QLabel)控件绑定到Excel进程来显示表格的程序代码如下:
欢迎大家来到IT世界,在知识的湖畔探索吧!QAxWidget * mywidget = new QAxWidget("Excel.Application", ui->标签控件名); mywidget->dynamicCall("SetVisible(bool Visible)", "false"); //隐藏不显示Office窗体 mywidget->setProperty("DisplayAlerts", false); //屏蔽Office的警告消息框 mywidget->setGeometry(ui->标签控件名->geometry().x(),ui->标签控件名->geometry().y(), 宽度, 高度); //设置显示区尺寸 mywidget->setControl(Excel文件名); //指定要打开的文件名 mywidget->show(); //显示内容
一个Office表格在Qt界面上的典型显示效果如下图所示。
三、项目配置
为了能在Qt项目中使用QAxObject和QAxWidget对象,对于每个需要操作Office的Qt程序项目都要进行配置,在项目的.pro文件中添加语句(加黑处),例如:
QT += axcontainer
这样配置后,就可以使用上面介绍的QAxObject、QAxWidget及其全部接口方法了。
————————————————
觉得有用的话请关注点赞,谢谢您的支持!
对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/89444.html