Qt编程进阶(24):Qt操作Office的基本方式

Qt编程进阶(24):Qt操作Office的基本方式与其他高级语言平台一样 Qt 也提供了访问 Office 文档的功能 可实现对 Mircosoft Office 套件 包括 Excel Word 等 的访问和灵活操作 Qt 可在程序中直接操作读写 Office 中的数据 也可以通过控件将 Office 文档中的

欢迎大家来到IT世界,在知识的湖畔探索吧!

与其他高级语言平台一样,Qt也提供了访问Office文档的功能,可实现对Mircosoft Office套件(包括Excel、Word等)的访问和灵活操作。

Qt可在程序中直接操作读写Office中的数据,也可以通过控件将Office文档中的数据显示在应用程序图形界面上供用户预览。在开始做实例之前,先介绍这两种操作方式通行的编程步骤。

一、QAxObject对象访问

从下图可看出Qt操作Excel的基本流程。

Qt编程进阶(24):Qt操作Office的基本方式

欢迎大家来到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的基本流程。

Qt编程进阶(24):Qt操作Office的基本方式

(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编程进阶(24):Qt操作Office的基本方式

三、项目配置

为了能在Qt项目中使用QAxObject和QAxWidget对象,对于每个需要操作Office的Qt程序项目都要进行配置,在项目的.pro文件中添加语句(加黑处),例如:

QT += axcontainer

这样配置后,就可以使用上面介绍的QAxObject、QAxWidget及其全部接口方法了。

————————————————

觉得有用的话请关注点赞,谢谢您的支持!

对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/89444.html

(0)
上一篇 7小时前
下一篇 7小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信