使用qt对Microsoft Excel进行操作

1,序言

网上的例子还是比较多,但是真正付诸实践,还是需要一番艰苦的探索,尤其在如此炎热的南国初夏午后,烦躁心情可想而知。闲话不多说,开门见山简单说说。

2,步骤与代码

本来想采用两分式,先祭出代码,然后在进行说明。但是,想到过往读过的书,往往还没读到讲解,前面的代码已经忘得一干二净。因此,本文将按照创建的整个步骤,一步一步来说明。

步骤1:创建工程

为了方便说明,我们此处直接创建一个project,然后在工程中添加一个main函数即可。pic-1显示了工程中所包含的文件,以及初始状态下各个文件中的内容。
如图pic-1所示为工程中包含的文件。只有配置文件和main.cpp

pic-1
pic-1: 工程中包含的文件

如图pic-2所示,为pro文件中的内容,其中加入了qaxcontainer库,注意很多资料上写的是axcontainer库,具体没有考证,但是qt 4.8, Windows10中使用的qaxcontainer.

pic-2
pic-2: pro文件中的内容

步骤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-3保存或新建文件弹出文件对话框

如图pic-4所示,为运行程序时,qt creator中的输出内容

pic-4
pic-4qt creator的输出

步骤4:excel文件和输出结果

最后,我们查看excel文件,是否真正写入数据。如图pic-5所示。

pic-5
pic-5 成功将数据写入excel文件中

猜你喜欢

转载自blog.csdn.net/zhizifengxiang/article/details/80560976