1,序言
网上的例子还是比较多,但是真正付诸实践,还是需要一番艰苦的探索,尤其在如此炎热的南国初夏午后,烦躁心情可想而知。闲话不多说,开门见山简单说说。
2,步骤与代码
本来想采用两分式,先祭出代码,然后在进行说明。但是,想到过往读过的书,往往还没读到讲解,前面的代码已经忘得一干二净。因此,本文将按照创建的整个步骤,一步一步来说明。
步骤1:创建工程
为了方便说明,我们此处直接创建一个project,然后在工程中添加一个main函数即可。pic-1显示了工程中所包含的文件,以及初始状态下各个文件中的内容。
如图pic-1所示为工程中包含的文件。只有配置文件和main.cpp
pic-1
如图pic-2所示,为pro文件中的内容,其中加入了qaxcontainer库,注意很多资料上写的是axcontainer库,具体没有考证,但是qt 4.8, Windows10中使用的qaxcontainer.
pic-2
步骤2:向main.cpp中添加代码
如下为向main.cpp中添加的内容。此处需要注意包含QAxObject.h和windows.h头文件。
// main.cpp
#include <QApplication>
#include <QAxObject>
#include <QDebug>
#include <QFileDialog>
#include <QList>
#include <QObject>
#include <QVariant>
#include <windows.h>
int main(int ac, char **av) {
QApplication app(ac, av);
QString filePath = QFileDialog::getSaveFileName(NULL, "Save File",
"./", QObject::tr("Microsoft Office 2007 (*.xlsx)")); // 保存路径
if (!filePath.isEmpty()) {
// 此处的层次关系是:excel -> workBooks -> workSheets -> workSheet
QAxObject *excel = new QAxObject("Excel.Application"); // 打开Excel.Application模块
excel->dynamicCall("SetVisible(bool visible)", false); // 不显示窗口
QAxObject *workBooks = excel->querySubObject("WorkBooks"); // 获得程序中workBooks
workBooks->dynamicCall("Add");
QAxObject *activeWorkBook = excel->querySubObject("ActiveWorkBook"),
*workSheets = activeWorkBook->querySubObject("Sheets"),
*workSheet = workSheets->querySubObject("Item(int)", 1);
// 向第一行添加数据:第一列A1为123, 第二列A2为456
QList<QVariant> rowData;
rowData.append(QVariant(123));
rowData.append(QVariant(456));
QAxObject *range = workSheet->querySubObject("Range(const QString)", "A1:B1");
range->dynamicCall("SetValue(const QVariant&)", QVariant(rowData));
// 向单元格中添加数据:第1行第3列的数据为789
QAxObject *cell = workSheet->querySubObject("Cells(int, int)", 1, 3); // 第1行,第3列
cell->dynamicCall("SetValue(const QVariant&)", QVariant(789));
QString theResult = cell->dynamicCall("Value()").toString();
qDebug() << theResult; //验证添加的数据是否正确
// 保存,关闭对应的workBook
activeWorkBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(filePath));
activeWorkBook->dynamicCall("Close()");
excel->dynamicCall("Quit()"); // 退出模块
delete excel;
excel = NULL;
}
qDebug() << QString("finish");
return app.exec();
}
步骤3:运行程序
如图pic-3所示,为弹出的保存文件的对话框。此处我们可以自己创建一个文件。
pic-3
如图pic-4所示,为运行程序时,qt creator中的输出内容
pic-4
步骤4:excel文件和输出结果
最后,我们查看excel文件,是否真正写入数据。如图pic-5所示。
pic-5