欢迎小伙伴的点评✨✨,相互学习 博主六六 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神‍

文章目录

前言一、Qt操作Office的基本方式1.1、QAxObject对象访问1.1.1、操作Excel的基本流程1.1.2、操作Word的基本流程

二、AxWidget界面显示三、Qt 对 Office 的基本读写3.1、程序界面3.2、效果实例3.3、原码解析mainwindow.hmain.cppmainwindow.cpp

总结

前言

本节将会给大家带来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的基本流程

#mermaid-svg-va0N08f3UPBwN5l4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-va0N08f3UPBwN5l4 .error-icon{fill:#552222;}#mermaid-svg-va0N08f3UPBwN5l4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-va0N08f3UPBwN5l4 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-va0N08f3UPBwN5l4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-va0N08f3UPBwN5l4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-va0N08f3UPBwN5l4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-va0N08f3UPBwN5l4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-va0N08f3UPBwN5l4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-va0N08f3UPBwN5l4 .marker.cross{stroke:#333333;}#mermaid-svg-va0N08f3UPBwN5l4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-va0N08f3UPBwN5l4 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-va0N08f3UPBwN5l4 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-va0N08f3UPBwN5l4 .actor-line{stroke:grey;}#mermaid-svg-va0N08f3UPBwN5l4 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-va0N08f3UPBwN5l4 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-va0N08f3UPBwN5l4 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-va0N08f3UPBwN5l4 .sequenceNumber{fill:white;}#mermaid-svg-va0N08f3UPBwN5l4 #sequencenumber{fill:#333;}#mermaid-svg-va0N08f3UPBwN5l4 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-va0N08f3UPBwN5l4 .messageText{fill:#333;stroke:#333;}#mermaid-svg-va0N08f3UPBwN5l4 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-va0N08f3UPBwN5l4 .labelText,#mermaid-svg-va0N08f3UPBwN5l4 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-va0N08f3UPBwN5l4 .loopText,#mermaid-svg-va0N08f3UPBwN5l4 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-va0N08f3UPBwN5l4 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-va0N08f3UPBwN5l4 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-va0N08f3UPBwN5l4 .noteText,#mermaid-svg-va0N08f3UPBwN5l4 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-va0N08f3UPBwN5l4 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-va0N08f3UPBwN5l4 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-va0N08f3UPBwN5l4 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-va0N08f3UPBwN5l4 .actorPopupMenu{position:absolute;}#mermaid-svg-va0N08f3UPBwN5l4 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-va0N08f3UPBwN5l4 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-va0N08f3UPBwN5l4 .actor-man circle,#mermaid-svg-va0N08f3UPBwN5l4 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-va0N08f3UPBwN5l4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

Excel.Application(创建Excel进程)

WorkBooks(工作薄集)

WorkBook(工作薄)

Sheets(表格集)

querySubObject(1){ 访问文档 xx.xls }

querySubObject(2){ 访问表 Sheets }

querySubObject(3){ 访问表单元格 cell }

Excel.Application(创建Excel进程)

WorkBooks(工作薄集)

WorkBook(工作薄)

Sheets(表格集)

(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的基本流程

#mermaid-svg-96pCqvIfZXza3V9m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-96pCqvIfZXza3V9m .error-icon{fill:#552222;}#mermaid-svg-96pCqvIfZXza3V9m .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-96pCqvIfZXza3V9m .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-96pCqvIfZXza3V9m .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-96pCqvIfZXza3V9m .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-96pCqvIfZXza3V9m .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-96pCqvIfZXza3V9m .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-96pCqvIfZXza3V9m .marker{fill:#333333;stroke:#333333;}#mermaid-svg-96pCqvIfZXza3V9m .marker.cross{stroke:#333333;}#mermaid-svg-96pCqvIfZXza3V9m svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-96pCqvIfZXza3V9m .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-96pCqvIfZXza3V9m text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-96pCqvIfZXza3V9m .actor-line{stroke:grey;}#mermaid-svg-96pCqvIfZXza3V9m .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-96pCqvIfZXza3V9m .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-96pCqvIfZXza3V9m #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-96pCqvIfZXza3V9m .sequenceNumber{fill:white;}#mermaid-svg-96pCqvIfZXza3V9m #sequencenumber{fill:#333;}#mermaid-svg-96pCqvIfZXza3V9m #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-96pCqvIfZXza3V9m .messageText{fill:#333;stroke:#333;}#mermaid-svg-96pCqvIfZXza3V9m .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-96pCqvIfZXza3V9m .labelText,#mermaid-svg-96pCqvIfZXza3V9m .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-96pCqvIfZXza3V9m .loopText,#mermaid-svg-96pCqvIfZXza3V9m .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-96pCqvIfZXza3V9m .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-96pCqvIfZXza3V9m .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-96pCqvIfZXza3V9m .noteText,#mermaid-svg-96pCqvIfZXza3V9m .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-96pCqvIfZXza3V9m .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-96pCqvIfZXza3V9m .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-96pCqvIfZXza3V9m .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-96pCqvIfZXza3V9m .actorPopupMenu{position:absolute;}#mermaid-svg-96pCqvIfZXza3V9m .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-96pCqvIfZXza3V9m .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-96pCqvIfZXza3V9m .actor-man circle,#mermaid-svg-96pCqvIfZXza3V9m line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-96pCqvIfZXza3V9m :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

Word.Application(创建Word进程)

Documents(文档集)

Doc(文档)

querySubObject(1){ 访问文档 xx.doc }

querySubObject(2){ 访问 文本 }

Word.Application(创建Word进程)

Documents(文档集)

Doc(文档)

(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 基本读写程序界面如下图 所示。 图示 上图界面上各控件的名称及控件类型

序号控件名称控件类型1labelQLabel1lineEditQLineEdit1pushButtonQPushButton2label_2QLabel2lineEdit _2QLineEdit2pushButton_2QPushButton3label_3QLabel3lineEdit_3QLineEdit3pushButton_3QPushButton4label_4QLabel4lineEdit_4QLineEdit4pushButton_4QPushButton

按钮鼠标右键 “转到槽” 选择 clicked()如下图所示

控件如下图所示

3.2、效果实例

图一 图二

3.3、原码解析

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

#include

#include //访问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

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读写在应用开发中是经常用到的。

查看原文