当前位置: 代码网 > it编程>编程语言>C/C++ > Qt5操作Office及Word读写实例

Qt5操作Office及Word读写实例

2024年08月06日 C/C++ 我要评论
本节将会给大家带来Qt连接Office读写及Word读写的实例Excel 软件具有完善的电子表格处理和计算功能,可在表格特定行列的单元格上定义公式,对其中的数据进行批量运算处理,用 Qt 操作 Excel 可辅助执行大量原始数据的计算功能,巧妙地借助单元格的运算功能就能极大地减轻 Qt 程序本身的计算负担。故Qt5操作Office及Word读写在应用开发中是经常用到的。


前言

本节将会给大家带来qt连接office读写及word读写的实例


一、qt操作office的基本方式

与其他高级语言平台一样, qt 也提供了访问 office 文档的功能,可实现对 mircosoft office
套件(包括 excel 、 word 等)的访问和灵活操作。
qt 可在程序中直接操作读写 office 中的数据,也可以通过控件将 office 文档中的数据显示
在应用程序图形界面上供用户预览。

qaxobject 是 qt 提供给程序员从代码中访问 office 的对象类,其本质上是一个面向微软操作系统的 com 接口,它操作 excel 和 word 的基本流程分别如下图所示。 qaxobject将所有 office 的工作簿、表格、文档等都作为其子对象,程序员通过调用 querysubobject()这个统一的方法来获取各个子对象的实例,再用 dynamiccall()方法执行各对象上的具体操作。
为了能在 qt 项目中使用 qaxobject 和 qaxwidget 对象,对于每个需要操作 office 的 qt 程
序项目都要进行配置,在项目的 .pro 文件中添力语句如下

qt       +=axcontainer

图示如下
在这里插入图片描述

1.1、qaxobject对象访问

1.1.1、操作excel的基本流程

(1) 启动excel进程、获取excel工作薄集。
创建 excel 进程使用如下语句:

qaxobject *myexcel = new qaxobject{"excel.application");

其中, myexcel 为进程的实例对象名,该名称由用户自己定义,整个程序中引用一致即可。
通过进程获取 excel 工作簿集,语句为:

qaxobject *myworks = myexcel->querysl.ibobject("workbooks");

其中, myworks 是工作簿集的引用,用户可根据需要定义其名称,同样 , 在程序中也要求引用 一致 。
有了 excel 进程和工作簿集的引用,就可以使用它们对 excel 进行一系列文档级别的操作,例如:

myworks->dynamiccall("add");  //添加一个工作簿
myexcel->querysubobject("activeworkbook"); //获取当前活动的工作簿

(2) 获取电子表格集 。
每个 excel 工作簿中都可以包含若干电子表格 (sheet), 通过打开的当前工作簿获取其所有电子表格的程序语句为:

qaxobject *mysheets = workbook->querysubobject("sheets");

其中, workbook 也是一个 qaxobject 对象,引用的是当前正在操作的 一个活动工作簿 。
同理,在获取了电子表格集后,就可以像操作工作簿文档那样,对其中的表格执行各种操作,例如:

mysheets->dynamiccall ("add");           ///添加一个表格
workbook->querysubobject("activesheet");  //获取工作簿中当前活动表格
sheet->setproperty("name", "字符串");     //给表格命名

其中, sheet 也是个 qaxobject 对象,代表当前所操作的表格 。
(3) 操作单元格及其数据 。
对 excel 的操作最终要落实到对某个电子表格单元格中数据信息的读写上,在 qt 中的 excel
单元格同样是作为 qaxobject 对象来看待的,对它的操作通过其所在表格的 qaxobject 对象句
柄执行,如下:

qaxobject *cell= sheet->querysubobjec 七 ("range (qvariant, qvariant)",单元格编号);
cell->dynamiccall("setvalue(const qvariant&)", qvariant("字符串");

这样,就实现了对 excel 各个级别对象的灵活操作和使用。
为避免资源无谓消耗和程序死锁,通常在编程结束时还必须通过语句释放该 excel 进程所占据的系统资源,如下:

workbook->dynamiccall("close()");    //关闭工作薄
myexcel->dynamiccall ("quit()");     //退出进程

1.1.2、操作word的基本流程

(1) 启动word 进程、获取word文档集。
创建 word 进程使用如下语句:

qaxobject *myword = new qaxobject("word.application");

其中, myword 为进程的实例对象名,该名称由用户自己定义,整个程序中引用一致即可。
通过进程获取 word 文档集,语句为:

qaxobject *mydocs = myword->querysubobject("documents");

其中, mydocs 是文档集的引用,用户可根据需要定义其名称,同样,在程序中也要求引用一致。
有了 word 进程和文档集的引用,就可以使用它们对 word 文档执行操作,例如:

mydocs->dynamiccall("add(void)");    //添加一个新文档
myword->querysubobject("activedocument");  //获取当前打开的活动文档

(2)获取和操作当前选中的段落。
一个 word 文档由若干文本段落构成,通过文档句柄可对当前选中的段落执行特定的操作,如下:

qaxobject *paragraph= myword->querysubobject("selection");

其中, paragraph 是一个 qaxobject 对象,引用的是当前所选中将要对其执行操作的 一个段落文本。
下面举两个操作 word 文档段落的语句,如下:

paragraph->dynamiccall("typetext(const qstring&)", "字符串");  //写入文本字符串
paragraph = document->querysubobject("range()");  //获取文本
qstring str = paragraph->property("text") .tostring();  //读出文本字符串

其中, document 是 一个表示当前活动文档的 qaxobject 对象。
同样,在使用完 word 文档之后也要进行释放资源和关闭进程的善后处理,如下:

document->dynamiccall("close()");   //关闭文档
myword->dynamiccall("quit()");     //退出进程

二、axwidget界面显示

除用程序代码中的 qaxobject 对象直接操作 office 外, qt 还支持用户在应用程序界面上实时地显示和预览 office 文档的内容,这通过 qt 中的 qaxwidget 对象来实现。它的机制是:将桌面程序界面上的某个 qt 控件重定义包装为专用于显示 office 文档的 qaxwidget 对象实例,该实例与用户程序中所启动的特定 office 进程相关联,就具备了显示外部文档的增强功能,本质上就是用 qt 的组件调用外部的 microsoft office 组件,实际在后台执行功能的仍然是 microsoft office 的 com 组件。例如,将一个 qt 的标签 (qlabel) 控件绑定到 excel 进程来显示表格的程序代码如下:

    qaxwidget * mywidget = new qaxwidget("excel.application", ui->label);
    mywidget->dynamiccall("setvisible(bool visible)", "false");//隐藏不显示 office 窗体
    mywidget->setproperty("displayalerts", false); //屏蔽 office 的警告消息框
    mywidget->setgeometry(ui->label->geometry().x() , ui->label->geometry().y(),1000,500); //设置显示区尺寸
    mywidget->setcontrol("d:\\qt application  code  file\\file_qt\\qt5.xls"); //指定要打开的文件名路径
    mywidget->show (); //显示内容

图示
在这里插入图片描述

三、qt 对 office 的基本读写

excel 软件具有完善的电子表格处理和计算功能,可在表格特定行列的单元格上定义公式,对其中的数据进行批量运算处理,用 qt 操作 excel 可辅助执行大量原始数据的计算功能,巧妙地借助单元格的运算功能就能极大地减轻 qt 程序本身的计算负担。 word 是最为常用的办公软件,很多日常工作资料都是以 word 文档格式保存的。用 qt 既可以对 word 中的文字也可以对表格中的信息进行读写。

3.1、程序界面

创建一个 qt 桌面应用程序项目, 为了方便对比 qt 对两种不同类型文档的操作,设计程序界面, qt 对 office 基本读写程序界面如下图 所示。
图示
在这里插入图片描述
上图界面上各控件的名称及控件类型

序号控件名称控件类型
1labelqlabel
1lineeditqlineedit
1pushbuttonqpushbutton
2label_2qlabel
2lineedit _2qlineedit
2pushbutton_2qpushbutton
3label_3qlabel
3lineedit_3qlineedit
3pushbutton_3qpushbutton
4label_4qlabel
4lineedit_4qlineedit
4pushbutton_4qpushbutton

按钮鼠标右键 “转到槽” 选择 clicked()如下图所示
在这里插入图片描述

在这里插入图片描述
控件如下图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2、效果实例

图一
在这里插入图片描述
图二

在这里插入图片描述

3.3、原码解析

mainwindow.h

#ifndef mainwindow_h
#define mainwindow_h

#include <qmainwindow>
#include <qmessagebox>
#include <qaxobject>                //访问office对象类
namespace ui {
class mainwindow;
}

class mainwindow : public qmainwindow
{
    q_object

public:
    explicit mainwindow(qwidget *parent = nullptr);
    ~mainwindow();

private slots:
    void on_pushbutton_clicked();    /*写入数据到excel单机事件按钮*/
    void on_pushbutton_2_clicked();  /*读取excel单机事件按钮*/
    void on_pushbutton_3_clicked();  /*写入数据到word单机事件按钮*/
    void on_pushbutton_4_clicked();  /*读取word单机事件按钮*/

private:
    ui::mainwindow *ui;
    /*excel读写指针*/
    qaxobject *myexcel;      //excel 应用程序指针
    qaxobject *myworks;      //工作薄集指针
    qaxobject *workbook;     //工作薄指针
    qaxobject *mysheets;     //电子表格集指针

    /*word读写指针*/
    qaxobject *myword;       //word应用程序指针
    qaxobject *mydocs;       //文档集指针
    qaxobject *document;     //文档指针
    qaxobject *paragraph;    //文本段指针

};

#endif // mainwindow_h

main.cpp

#include "mainwindow.h"
#include <qapplication>

int main(int argc, char *argv[])
{
    qapplication a(argc, argv);
    mainwindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

mainwindow::mainwindow(qwidget *parent) :
    qmainwindow(parent),
    ui(new ui::mainwindow)
{
    ui->setupui(this);

}

mainwindow::~mainwindow()
{
    delete ui;
}

/*将控件lineedit写入数据到excel*/
void mainwindow::on_pushbutton_clicked()
{

    myexcel = new qaxobject ("excel.application");

    myexcel->dynamiccall("setvisible(bool visible)", "false");//隐藏不显示文档窗体
    myexcel->setproperty("displayalerts", false); //屏蔽文档的警告消息框

    myworks = myexcel->querysubobject("workbooks");  //获取工作薄集
    myworks->dynamiccall("add");                     //添加工作薄
    workbook= myexcel->querysubobject("activeworkbook"); //获取当前活动工作薄
    mysheets = workbook->querysubobject("sheets");  //获取电子表格集

    mysheets->dynamiccall ("add"); //添加一个表
    qaxobject *sheet= workbook->querysubobject("activesheet");  //指向当前的活动表格
    sheet->setproperty ("name", "我爱 qt");                     //给表格命名
    qaxobject *cell= sheet->querysubobject ("range (qvariant, qvariant) ", "c3"); //指向c3单元格

    qstring  instr = ui->lineedit->text();    //从lineedit控件获得数据
    cell->dynamiccall("setvalue(const qvariant&)", qvariant(instr)); //向单元格写入内容

    sheet= mysheets->querysubobject("item(int)", 2);  //指向第二个表格
    sheet->setproperty ("name", "hello qt");          //给表格命名
    cell= sheet->querysubobject("range(qvariant, qvariant)", "b5"); //指向b5单元格
    cell->dynamiccall ("setvalue(const qvariant&)", qvariant ("hello qt!"));  //向单元格写入内容
    workbook->dynamiccall("saveas(const qstring&) ", "d:\\qt application  code  file\\file_qt\\qt5.xls");
                                                       //excel(qt5.xls)保存到指定路径
    workbook->dynamiccall("close()"); //关闭
    myexcel->dynamiccall ("quit()");  //退出
    qmessagebox::information(this, tr("完毕"), tr("excel 工作表已保存")) ;
    ui->pushbutton->setenabled(false);
    ui->pushbutton_2->setenabled(true);
}

/*从excel读取数据到lineedit_2控件*/
void mainwindow::on_pushbutton_2_clicked()
{

  myexcel = new qaxobject("excel.application");

  myexcel->dynamiccall("setvisible(bool visible)", "false");//隐藏不显示文档窗体
  myexcel->setproperty("displayalerts", false); //屏蔽文档的警告消息

  myworks = myexcel->querysubobject("workbooks"); //获取工作薄集
  myworks->dynamiccall ("open(const qstring&)","d:\\qt application  code  file\\file_qt\\qt5.xls");
                                                           //打开excel
  workbook= myexcel->querysubobject("activeworkbook");  //获取当前活动工作薄
  mysheets = workbook->querysubobject("worksheets");    //获取当前电子表
  qaxobject *sheet= workbook->querysubobject("sheets(int)", 1); //指向第一个表格
  qaxobject *cell= sheet->querysubobject ("range (qvariant, qvariant) ", "c3");
  qstring outstr = cell->dynamiccall ("value2()").tostring(); //读出c3单元格内容;

  ui->lineedit_2->settext(outstr);

  sheet= workbook->querysubobject("sheets(int)", 2); //指向第二个表格

  cell= sheet->querysubobject("range(qvariant, qvariant)", "b5"); //
  outstr = cell->dynamiccall ("value2()").tostring(); //读出 b5 单元格内容
  workbook->dynamiccall("close()");
  myexcel->dynamiccall ("quit()");
  qmessagebox::information(this, tr("消息"), outstr);
  ui->pushbutton->setenabled(true);
  ui->pushbutton_2->setenabled(false);

}


/*将写lineedit_3控件数据写到word*/
void mainwindow::on_pushbutton_3_clicked()
{
    myword = new qaxobject("word.application");

    myword->dynamiccall("setvisible(bool visible)", "false");//隐藏不显示文档窗体
    myword->setproperty("displayalerts", false); //屏蔽文档的警告消息

    mydocs = myword->querysubobject("documents");  //获取文档集
    mydocs->dynamiccall("add(void)");              //添加一个文档
    document= myword->querysubobject("activedocument"); //指向当前活动文档
    paragraph = myword->querysubobject ("selection") ; //指向当前选中文本

    qstring instr = ui->lineedit_3->text();

    paragraph->dynamiccall("typetext(const qstring&)", instr);
    //写入从界面文本框获取的文本
    paragraph->dynamiccall ("typetext (const qvariant&) ", qvariant ("\nhello qt!")) ;
    //写入指定的文本
    document->dynamiccall("saveas(const qstring&)","d:\\qt application  code  file\\file_qt\\qt5.doc");
    //保存文档
    delete paragraph;
    paragraph= nullptr;
    document->dynamiccall("close()");
    myword->dynamiccall("quit()");
    qmessagebox::information(this, tr("完毕") , tr("word 文档己保存")) ;
    ui->pushbutton_3->setenabled(false);
    ui->pushbutton_4->setenabled(true);

}

void mainwindow::on_pushbutton_4_clicked()
{
    myword = new qaxobject("word.application");

    myword->dynamiccall("setvisible(bool visible)", "false"); //隐藏不显示文档的窗体
    myword->setproperty("displayalerts", false); //屏蔽文档的警告消息

    mydocs = myword->querysubobject("documents"); //获取文档集

    mydocs->dynamiccall("open(const qstring&)","d:\\qt application  code  file\\file_qt\\qt5.doc");
                                                       //打开文档
    document= myword->querysubobject("activedocument"); //指向活动文档

    paragraph = document->querysubobject ("range()"); //指向当前文本
    qstring outstr = paragraph->property("text").tostring () ; //读出文本
    ui->lineedit_4->settext(outstr.split("h").at(0));
    paragraph= document->querysubobject("range(qvariant, qvariant)", 4, 15);
    /* 由于 word 文档中共有两行文本,而 qt 一次性读出的
是所有文本(并不自动分行分段),为了能分行输出,我们运用了 splito方法分隔以及索引截取
字符串的编程技术。*/
    outstr = paragraph->property("text").tostring();
    delete paragraph;
    paragraph= nullptr;
    document->dynamiccall ("close()");
    myword->dynamiccall("quit()");
    qmessagebox::information(this, tr("消息"),outstr) ;
    ui->pushbutton_4->setenabled(false);
    ui->pushbutton_3->setenabled(true);


}

总结

excel 软件具有完善的电子表格处理和计算功能,可在表格特定行列的单元格上定义公式,对其中的数据进行批量运算处理,用 qt 操作 excel 可辅助执行大量原始数据的计算功能,巧妙地借助单元格的运算功能就能极大地减轻 qt 程序本身的计算负担。
故qt5操作office及word读写在应用开发中是经常用到的。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com