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

一、程序界面

创建一个Qt桌面应用程序项目,项目名称为OfficeHello,为了方便对比Qt对两种不同类型文档的 操作,设计程序界面,Qt对Office基本读写程序界面如图所示:

分别用两个分组框(QGroupBox)演示对相同文字内容的读写功能。界面上各控件我们都用数字序号 ①,②,③,…标注,其名称、类型及属性设置见下图:

二、全局变量及方法

为了提高程序代码的使用效率,通常建议将程序中公用的Office对象的句柄声明为全局变量,定义在项目.h头文件中。 后面实现具体读写功能的代码皆在 mainwindow.cpp源文件中。

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 = 0);~MainWindow();
private slots:void on_writeExcelPushButton_clicked();           //写Excel按钮单击事件槽void on_readExcelPushButton_clicked();           //读Excel按钮单击事件槽void on_writeWordPushButton_clicked();           //写Word按钮单击事件槽void on_readWordPushButton_clicked();         //读Word按钮单击事件槽
private:Ui::MainWindow *ui;QAxObject *myexcel;                                  //Excel应用程序指针QAxObject *myworks;                                    //工作簿集指针QAxObject *workbook;                                //工作簿指针QAxObject *mysheets;                             //电子表格集指针//QAxObject *myword;                                   //Word应用程序指针QAxObject *mydocs;                                  //文档集指针QAxObject *document;                             //文档指针QAxObject *paragraph;                             //文本段指针
};
#endif // MAINWINDOW_H

三、对Excel的读写

对电子表格的基本读写,在构造方法中添加如下代码:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
myexcel = new QAxObject("Excel.Application");
myworks = myexcel->querySubObject("WorkBooks");
//获取工作簿集
myworks->dynamicCall("Add"); //添加工作簿
workbook = myexcel->querySubObject("ActiveWorkBook"); //获取当前活动工作簿
mysheets = workbook->querySubObject("Sheets"); //获取电子表格集
}

写Excel的事件方法代码:

void MainWindow::on_writeExcelPushButton_clicked()
{
mysheets->dynamicCall("Add"); //添加一个表
QAxObject *sheet = workbook->querySubObject("ActiveSheet"); //指向当前活动表格
sheet->setProperty("Name", "我爱Qt"); //给表格命名
QAxObject *cell = sheet->querySubObject("Range(QVariant, QVariant)", "C3"); //指向C3单元格
QString inStr = ui->InExcelLineEdit->text();
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");
cell->dynamicCall("SetValue(const QVariant&)", QVariant("Hello!I love Qt."));
workbook->dynamicCall("SaveAs(const QString&)", "d:\\Qt\\office\\我爱 Qt5.xls"); //保存Excel
workbook->dynamicCall("Close()");
myexcel->dynamicCall("Quit()");
QMessageBox::information(this, tr("完毕"), tr("Excel工作表已保存。"));
ui->writeExcelPushButton->setEnabled(false);
ui->readExcelPushButton->setEnabled(true);
}

读Excel的事件方法代码:

void MainWindow::on_readExcelPushButton_clicked()
{
myexcel = new QAxObject("Excel.Application");
myworks = myexcel->querySubObject("WorkBooks");
myworks->dynamicCall("Open(const QString&)", "d:\\Qt\\office\\我爱 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->OutExcelLabel->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->writeExcelPushButton->setEnabled(true);
ui->readExcelPushButton->setEnabled(false);
}

程序运行后,单击“写入”按钮,弹出消息框提示Excel工作表已保存,即说明界面文本框里的文字 “我爱最新的 Qt 5.11”已成功写入Excel表格,为试验英文语句的读写,程序在后台还往Excel另一张表中 写入了一句“Hello!I love Qt.”。写入完成后,原“写入”按钮变为不可用,“读出”按钮则变为可用。 单击“读出”按钮,标签框中会输出刚刚写入保存的Excel单元格内容(“我爱最新的 Qt 5.11”),同时弹出消息框显示另一句英文文本“Hello!I love Qt.”,如下图所示:

该程序在计算机d:\Qt\office\路径下生成了一个名为“我爱Qt5.xls”的Excel文件,打开后可看到之前 Qt写入Excel表格的内容,如图所示:

四、对Word的读写

用Qt对Word文档进行最简单的基本读写操作,在构造方法中添加代码如下:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
...
myword = new QAxObject("Word.Application");
mydocs = myword->querySubObject("Documents"); //获取文档集
mydocs->dynamicCall("Add(void)"); //添加一个文档
document = myword->querySubObject("ActiveDocument"); //指向当前活动文档
paragraph = myword->querySubObject("Selection"); //指向当前选中文本
}

写Word的事件方法代码:

void MainWindow::on_writeWordPushButton_clicked()
{
QString inStr = ui->InWordLineEdit->text();
paragraph->dynamicCall("TypeText(const QString&)", inStr);//写入从界面文本框获取的文本
paragraph->dynamicCall("TypeText(const QVariant&)",QVariant("\nHello!I love Qt.")); //写入指定的文本
document->dynamicCall("SaveAs(const QString&)","d:\\Qt\\office\\我爱 Qt5.doc"); //保存文档
delete paragraph;
paragraph = nullptr;
document->dynamicCall("Close()");
myword->dynamicCall("Quit()");
QMessageBox::information(this, tr("完毕"), tr("Word文档已保存。"));
ui->writeWordPushButton->setEnabled(false);
ui->readWordPushButton->setEnabled(true);
}

读Word的事件方法代码:

void MainWindow::on_readWordPushButton_clicked()
{
myword = new QAxObject("Word.Application");
mydocs = myword->querySubObject("Documents"); //获取文档集
mydocs->dynamicCall("Open(const QString&)","d:\\Qt\\office\\我爱 Qt5.doc"); //打开文档
document = myword->querySubObject("ActiveDocument"); //指向活动文档
paragraph = document->querySubObject("Range()"); //指向当前文本
QString outStr = paragraph->property("Text").toString();//读出文本
ui->OutWordLabel->setText(outStr.split("H").at(0));
paragraph = document->querySubObject("Range(QVariant, QVariant)", 14, 30);
outStr = paragraph->property("Text").toString();
delete paragraph;
paragraph = nullptr;
document->dynamicCall("Close()");
myword->dynamicCall("Quit()");
QmessageBox::information(this, tr("消息"), outStr);
ui->writeWordPushButton->setEnabled(true);
ui->readWordPushButton->setEnabled(false);
}

运行效果 与上面Excel读写操作类同,运行程序的输出效果如图所示:

该程序在计算机d:\Qt\office\路径下生成了一个名为“我爱 Qt5.doc”的Word文档,打开后可看到之前Qt写入Word文档中的文字,如下图所示:

QT学习:Qt对Office的基本读写相关推荐

  1. Python QT学习——Qt Designer(二)

    QT学习 文章目录 QT学习 一.Qt Designer 简介 二.使用方法 三.动态加载UI文件 一.Qt Designer 简介 QT程序界面的 一个个窗口.控件,就是像上面那样用相应的代码创建出 ...

  2. QT学习——Qt工具介绍,Qt助手使用,第一个Qt程序,Qt字符串和字符编码

    一.Qt主要工具介绍 1)qt助手(assistant) 2)qt构建器(qmake) 3)qt设计师(designer) 4)qt转换器(uic) 5)qt资源编译器(rcc) 6)qt元对象编译器 ...

  3. Qt学习之路(56): 二进制文件读写

    今天开始进入 Qt 的另一个部分:文件读写,也就是 IO.文件读写在很多应用程序中都是需要的.Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力.常用的IO ...

  4. Qt学习笔记之文件处理

    Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储.对文件信息和目录进行操作的类是QfileIn ...

  5. QT学习笔记(九):遍历容器-迭代器(iterators)

    QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...

  6. Qt学习之Qt基础入门(下)

    1. 前言 前两篇博客简单的阐述了一下Qt的入门用法,这篇博客继续跟着视频学习. Qt入门系列: Qt学习之C++基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门(中) ...

  7. QT学习笔记之对话框

    QT学习笔记之对话框 对话框是一种用户界面(窗口),它的主要功能是输出信息和接收用户的输入.在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互. 1)       模式对话框:用户只能与 ...

  8. 《Qt 学习之路 2》

    Home / Qt 学习之路 2 / <Qt 学习之路 2>目录 <Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 ...

  9. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

最新文章

  1. # POJ-1979(BFS)
  2. H5 Canvas刮刮乐
  3. java 将查询到的值 存下_MyBatis3.x 从入门到精通(六)查询
  4. python def return 文件_python基础-文件处理与函数
  5. java类验证和装载顺序_JVM类加载过程分析及验证
  6. mysql 慢查询日志的作用_MySQL慢查询日志的作用和开启
  7. elasticsearch使用优化备忘
  8. Item9:总是要改写toString
  9. “一边熬夜一边求不要猝死”,90后养生朋克指南,条条扎心!
  10. LeetCode【11--盛水最多的容器】LeetCode【12 -- 整数转罗马数字】
  11. 表达式计算器类的设计4(面向对象的表达式计算器7)
  12. Java程序中调用Python脚本的方法
  13. M1 macbook安装jdk
  14. JAVA简单聊天室的实现
  15. 苹果笔记本装win7_小白“复活记”,十多年前的MacBook,曲折安装Win7
  16. js将数字的金额转换成中文大写金额
  17. 按键精灵 获取某网站服务器时间,按键精灵如何获得网络时间的毫秒
  18. JAVA初学习(三)(数组和面向对象)
  19. AGV、IGV、RGV这三者之间的区别浅析
  20. css解决图片缩小变模糊问题

热门文章

  1. 如何搭建AIoT智能对话交互系统:技术解析和实操分享
  2. 做 NLP 算法研究,去大公司还是创业公司?
  3. Transformer的七十二变
  4. PW Live 直播 | 清华大学博士生岂凡超:义原知识库的应用和扩充
  5. filter函数的用法_JavaScript中forEach和filter的用法和原理
  6. python将字典导入excel_python将字典列表导出为Excel文件的方法
  7. java.lang.IllegalStateException: PathVariable/RequestParam annotation was empty on param 0.
  8. python function terminated_calibre 打不开也转不了 并且出现错误 mobi转docx
  9. java耗时操作阻塞_springboot~高并发下耗时操作的实现
  10. findfirstfile函数为什么不能遍历doc_编程之美:IO多路复用——记性不好的poll函数...