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文档中的文字,如下图所示: