【QT常用技术讲解】excel表格处理两种方式:QAxObject和qtxlsx

前言

        QAxObject和qtxlsx都可以处理表格,QAxObject比较慢,并且功能少,建议是使用qtxlsx。

功能讲解

QAxObject

   QAxObject 是 Qt 框架中的一个类,用于通过 COM(Component Object Model)自动化与 Windows 平台上的 ActiveX 控件进行交互。

        使用QAxObject时,需要在.pro文件中加入QT+=axcontainer,这个模块提供了对 ActiveX 容器的支持,使得可以使用 QAxObject 等类来与 ActiveX 控件进行交互。

#include <QCoreApplication>
#include <QAxObject>
#include <QDebug>

int realexcel()
{
    // 创建 Excel 应用对象
    QAxObject *excel = new QAxObject("Excel.Application");
    //excel->setControl("ket.Application");//wps
    excel->setControl("Excel.Application"); //Excel
    // 获取工作簿集合
    QAxObject *workbooks = excel->querySubObject("Workbooks");

    // 打开一个现有的工作簿
    QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", "D:\\test.xlsx");

    // 获取第一个工作表
    QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);

    // 获取工作表的维度
    QAxObject *usedRange = worksheet->querySubObject("UsedRange");

    // 获取行数和列数
    int rowCount = usedRange->property("Rows").toVariant().toList().size();
    int colCount = usedRange->property("Columns").toVariant().toList().size();

    // 读取数据
    for (int row = 1; row <= rowCount; ++row) {
        for (int col = 1; col <= colCount; ++col) {
            QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, col);
            QVariant cellValue = cell->property("Value");
            qDebug() << "Cell(" << row << "," << col << "):" << cellValue.toString();
        }
    }

    // 释放资源
    workbook->dynamicCall("Close()");
    excel->dynamicCall("Quit()");

    delete excel;
}
void writeexcel(){
    // 创建 Excel 应用对象
    QAxObject *excel = new QAxObject("Excel.Application");
    //excel->setControl("ket.Application");//wps
    excel->setControl("Excel.Application"); //Excel
    // 获取工作簿集合
    QAxObject *workbooks = excel->querySubObject("Workbooks");

    // 创建一个新的工作簿
    QAxObject *workbook = workbooks->querySubObject("Add()");

    // 获取第一个工作表
    QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);

    // 写入数据
    worksheet->querySubObject("Cells(int,int)").toVariant().setValue("Hello", 1, 1); // A1 单元格
    worksheet->querySubObject("Cells(int,int)").toVariant().setValue(123, 1, 2); // B1 单元格

    // 写入一行数据
    QAxObject *row = worksheet->querySubObject("Rows(int)").toVariant().value<QAxObject*>(1);
    for (int col = 1; col <= 3; ++col) {
        row->querySubObject("Cells(int)").toVariant().setValue(QString("Row1-Col%1").arg(col), col);
    }

    // 保存并关闭工作簿
    workbook->querySubObject("Save()");
    workbook->querySubObject("Close()");

    // 退出 Excel 应用
    excel->dynamicCall("Quit()");

    delete excel;

}

使用QAxObject写数据到excel时(即使内容很少),都会卡个5秒钟以上,才会生成文件。

qtxlsx

        QTXlsx 是 第三方工具QtXlsxWriter 的一部分,读写excel非常快,需要下载工具:QT读写excel文件的第三方工具QtXlsxWriter

解压后,把src目录整个拷贝到你的项目与main.cpp文件同一级目录下,并且在.pro文件中加入

include(src/xlsx/qtxlsx.pri)  即可引入qtxlsx,下面是保存数据到excel

#include "xlsxdocument.h"
#include "xlsxworksheet.h"
void MainWindow::saveexcel(QTableWidget *tableWidget, const QString &fileName)
{
    QXlsx::Document xlsx;
    QXlsx::Worksheet *worksheet = xlsx.currentWorksheet();

    // 设置表头和数据
    for (int row = 0; row < tableWidget->rowCount(); ++row) {
        for (int col = 0; col < tableWidget->columnCount(); ++col) {
            QTableWidgetItem *item = tableWidget->item(row, col);
            if (item) {
                worksheet->write(row + 1, col + 1, item->text());
            } else {
                worksheet->write(row + 1, col + 1, "");
            }
        }
    }
    //合并表头
    xlsx.mergeCells(QXlsx::CellRange(1, 1, 1, tableWidget->columnCount()));
    // 保存到文件
    xlsx.saveAs(fileName);
}

使用qtxlsx读写的代码都很简洁,并且很快就生成excel文件。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

deepallin

打个赏吧,三瓜两枣不嫌弃^_^

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

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

打赏作者

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

抵扣说明:

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

余额充值