Qt中操作excel

博主接到将检测结果导出到Excel的任务,因熟悉Qt,决定用其实现。通过Qt自带的QAxObject类,在pro文件添加axcontainer并添加包含文件即可。代码实现打开模板文件、写入记录并另存,但此方法要求系统安装微软Excel,WPS不行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有一个把检测结果导出到excel中的任务,由于对qt比较熟悉,所以打算使用qt来实现。查了一下,使用qt下自带的QAxObject类,实现还是比较简单的。

首先需要在pro文件中添加axcontainer

QT       += core gui axcontainer

然后添加包含文件

#include <QAxObject>

如下是代码的具体实现:

void MainWindow::exportexcel(VRecord vrecord)
{
    QAxObject *excel = NULL;
    QAxObject *workbooks = NULL;
    QAxObject *workbook = NULL;
    excel = new QAxObject("Excel.Application");
    excel->dynamicCall("SetVisible(bool)", true);
    workbooks = excel->querySubObject("WorkBooks");

    workbook = workbooks->querySubObject("Open(QString&)",
          "D:/build-QT_EXPORT-Desktop_Qt_5_9_0_MSVC2015_32bit-Debug/template.xls");

    QAxObject * worksheets = workbook->querySubObject("WorkSheets");

    //int iWorkSheet = worksheets->property("Count").toInt();
    //qDebug() << QString::fromLocal8Bit("Excel文件中表的个数: %1").arg(QString::number(iWorkSheet));

    QAxObject * worksheet = worksheets->querySubObject("Item(int)", 1);

    /*
    表格范围和行数列数
    QAxObject * usedrange = worksheet->querySubObject("UsedRange");

    QAxObject * rows = usedrange->querySubObject("Rows");
    int iRows = rows->property("Count").toInt();
    qDebug() << QString::fromLocal8Bit("行数为: %1").arg(QString::number(iRows));

    QAxObject * columns = usedrange->querySubObject("Columns");
    int iColumns = columns->property("Count").toInt();
    qDebug() << QString::fromLocal8Bit("列数为: %1").arg(QString::number(iColumns));

    int iStartRow = rows->property("Row").toInt();
    qDebug() << QString::fromLocal8Bit("起始行为: %1").arg(QString::number(iStartRow));

    int iColumn = columns->property("Column").toInt();
    qDebug() << QString::fromLocal8Bit("起始列为: %1").arg(QString::number(iColumn));
    */

    /*
    读出数据
    QAxObject *range1 = worksheet->querySubObject("Range(QString)", "F6");
    QString strRow6Col6 = range1->property("Value").toString();
    qDebug() << QString::fromLocal8Bit("第6行,第6列的数据为:") + strRow6Col6;
    */


    //写入数据

    //QAxObject *range2 = worksheet->querySubObject("Range(QString)", "F6");
    //range2->setProperty("Value", "aaaa");
    for(int i = 0;i<vrecord.size();i++)
    {
        QString cora = "A" + QString::number(i+2);
        QAxObject *rangea = worksheet->querySubObject("Range(QString)", cora);
        rangea->setProperty("Value", vrecord.at(i).id);

        QString corb = "B" + QString::number(i+2);
        QAxObject *rangeb = worksheet->querySubObject("Range(QString)", corb);
        rangeb->setProperty("Value", vrecord.at(i).dt.toString("yyyy/MM/dd HH:mm:ss"));

        QString corc = "C" + QString::number(i+2);
        QAxObject *rangec = worksheet->querySubObject("Range(QString)", corc);
        rangec->setProperty("Value", vrecord.at(i).res);
    }

    //另存为文件
    QString filepath = QString::fromLocal8Bit("D:/build-QT_EXPORT-Desktop_Qt_5_9_0_MSVC2015_32bit-Debug/报表输出结果.xls");
    workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));
    workbook->dynamicCall("Close()");
    excel->dynamicCall("Quit()");

    if (excel)
    {
        delete excel;
        excel = NULL;
    }

    QMessageBox::information(0 ,
                          QString::fromLocal8Bit("提示") , QString::fromLocal8Bit("报表生成成功"),
                          QMessageBox::Ok | QMessageBox::Default ,
                          0 );

}

本函数实现的功能是打开一个模板文件,把传入的记录写到指定的位置,并自动完成另存为的操作。这个程序在跑的过程中会打开excel。使用这种方法有一个缺点,那就是系统必须按照微软的excel,wps不行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元点机智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值