Qt篇——QTableWidget保存表格数据到Excel文件中,读Excel内容到QTableWidget

news/2024/7/21 5:30:09 标签: qt, excel, 开发语言

表格和excel例子如下图所示: 

一、QTableWidget保存表格数据到Excel文件中

代码如下:

(pro文件中添加QT += axcontainer)

#include <QAxObject>

void MainWindow::saveTableToExcel() {
    QDateTime current_date_time =QDateTime::currentDateTime();
    QString excelName = "data_" + current_date_time.toString("yyyy-MM-dd_hh-mm-ss");
    QString filePath = QFileDialog::getSaveFileName(this, "Save Data", excelName, "Microsoft Excel 2013(*.xlsx)");
    int row = ui->originDataTable->rowCount();
    int col = ui->originDataTable->columnCount();
    QAxObject* excel = new QAxObject(this);
    //excel->setControl("ket.Application");//wps
    excel->setControl("Excel.Application"); //Excel
    excel->dynamicCall("SetVisible(bool Visible)", false);
    excel->setProperty("DisplayAlerts", false);
    QAxObject* workbooks = excel->querySubObject("WorkBooks");
    workbooks->dynamicCall("Add");
    QAxObject* workbook = excel->querySubObject("ActiveWorkBook");
    QAxObject* worksheets = workbook->querySubObject("Sheets");
    QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1);
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            QAxObject* Range = worksheet->querySubObject("Cells(int,int)", i + 1, j + 1);
            Range->dynamicCall("SetValue(const QString &)", ui->originDataTable->item(i, j)->text());
        }
    }
    workbook->dynamicCall("SaveAs(const QString &)", QDir::toNativeSeparators(filePath));
    if (excel != NULL) {
        excel->dynamicCall("Quit()");
        delete excel;
        excel = NULL;
    }
    QMessageBox::information(this, QStringLiteral("提示"), "保存成功");
}

二、读Excel文件内容到QTableWidget表格中

#include <QAxObject>

void MainWindow::saveTableToExcel() {
    QString strFile = QFileDialog::getOpenFileName(this,QStringLiteral("选择Excel文件"),"","Exel file(*.xls *.xlsx)");
    if (strFile.isEmpty()){
        return;
    }
    QAxObject excel("Excel.Application");
    excel.setProperty("Visible", false);
    QAxObject *work_books = excel.querySubObject("WorkBooks");
    //打开指定文件
    work_books->dynamicCall("Open (const QString&)", strFile);
    QAxObject *work_book = excel.querySubObject("ActiveWorkBook");
    QString ExcelName;
    static int row_count = 0, column_count = 0;
    QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);
    QAxObject *used_range = work_sheet->querySubObject("UsedRange");
    QAxObject *rows = used_range->querySubObject("Rows");
    row_count = rows->property("Count").toInt();
    QAxObject *column = used_range->querySubObject("Columns");
    column_count = column->property("Count").toInt();
    //这里先清空QTableWidget表格数据
    ui->originDataTable->clearContents();
    ui->setRowCount(0);
    for (int i = 1; i <= row_count; i++) {
        QStringList dataList;
        for (int j = 1; j <= column_count;j++) {
            QAxObject *range = work_sheet->querySubObject("Cells(int,int)",i,j); //获取cell的值
            QString strVal = range->dynamicCall("Value2()").toString();
            dataList << strVal;
        }
        int row = ui->originDataTable->rowCount();
        ui->originDataTable->insertRow(row);
        for (int col = 0; col < dataList.size(); ++col) {
            QTableWidgetItem *pItem = new QTableWidgetItem(dataList[col]);
            ui->originDataTable->setItem(row, col, pItem);
        }
    }
    work_book->dynamicCall("Close(Boolean)", false);  //关闭文件
    excel.dynamicCall("Quit(void)");  //退出
}

总结:

QAxObject读取excel较为方便,不必使用第三方库;缺点是读取excel文件时非常慢,一个内容很少的excel文件读取都需要几秒钟。 用第三方库读取效率会高一些,我用的是xlsx的库,需要的可以在评论区留下自己的邮箱,我将在有空时回复并发到邮箱。


http://www.niftyadmin.cn/n/5396145.html

相关文章

Sora和Gemma一出,人类又要完了?

热辣滚烫的2024刚开年&#xff0c;AI巨头们的竞赛&#xff0c;一波未平一波又起。这些天&#xff0c;铺天盖地都是“Sora又让人类完了”的新闻。 为啥人类又要完了呢&#xff1f; 简单说&#xff0c;Sora能够生成流畅的60秒视频&#xff0c;具有多个角色、特定类型的运动以及主…

医疗行业数据分析,为医疗提质增效提供科学支持

信息化时代的到来&#xff0c;医疗行业数据分析已成为提升医疗服务质量和效率的重要手段。医院拥有大量的医疗数据&#xff0c;医疗数据中包含着很多宝贵的信息与规律&#xff0c;通过深入的数据分析&#xff0c;能够为决策者提供直观、深入的数据洞察&#xff0c;帮助医疗服务…

认真了解空气质量标准

一.背景 在西南最大的盆地生活&#xff0c;孩子小的时候&#xff0c;呼吸系统疾病太难受了。一年下来&#xff0c;平均1-2周跑一次医院。每次去医院&#xff0c;看到有些的孩子都是类似的情况。我母亲也总是咳嗽&#xff0c;回老家一年后明显好了很多。当然&#xff0c;这里没有…

npm install卡在sill idealTree buildDeps没有反应,安装失灵

我的是 这通常是由于证书颁发机构&#xff08;CA&#xff09;的证书已经过期&#xff0c;或者服务器上的证书没有及时更新。 更换 npm 仓库源&#xff1a;如果你正在使用淘宝的 npm 镜像&#xff08;registry.npm.taobao.org&#xff09;&#xff0c;可以尝试更换为官方的 npm…

白鲸开源科技与瀚高基础软件完成产品兼容性认证,开启数据管理新篇章

北京白鲸开源科技有限公司&#xff08;以下简称“白鲸开源”&#xff09;今日宣布&#xff0c;其旗舰产品WhaleStudio套件已与瀚高基础软件股份有限公司&#xff08;以下简称“瀚高软件”&#xff09;旗下的IvorySQL数据库管理系统V3.0完成深度兼容性认证。此次合作标志着两家领…

2024 值得推荐的免费开源 WAF

WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。区别于传统防火墙&#xff0c;WAF 工作在应用层&#xff0c;对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果&#xff0c;使其免于受到黑客的攻击。 开源 WAF 和商用 WAF&#xff08;奇安信…

基于区块链技术的物联网设备影子服务

一&#xff0e; 背景 物联网设备影子是指真实的物联网设备在物联网平台中对应的虚拟设备&#xff0c;设备影子服务存储了对应物理设备的当前数据。用户使用物联网设备的实时数据都是从物联网设备影子服务获取&#xff0c;如果设备影子服务的数据被修改&#xff0c;就容易导致…

非阻塞式 I/O 模型的工作原理【NIO】

非阻塞式 I/O&#xff08;Non-blocking I/O&#xff0c;NIO&#xff09;是一种改进的 I/O 模型&#xff0c;引入了通道&#xff08;Channel&#xff09;和缓冲区&#xff08;Buffer&#xff09;的概念。相比于阻塞式 I/O&#xff0c;非阻塞式 I/O 允许在进行读/写操作时不会导致…