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

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

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

代码如下:

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

cpp 复制代码
#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表格中

cpp 复制代码
#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的库,需要的可以在评论区留下自己的邮箱,我将在有空时回复并发到邮箱。

相关推荐
Larry_Yanan1 小时前
QML学习笔记(四十二)QML的MessageDialog
c++·笔记·qt·学习·ui
爱喝白开水a1 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway1 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康1 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
杰克尼1 小时前
JavaWeb_p165部门管理
java·开发语言·前端
一成码农1 小时前
JavaSE面向对象(下)
java·开发语言
偶尔的鼠标人2 小时前
Avalonia DataGrid 控件的LostFocus事件会多次触发
开发语言·c#
晚风残2 小时前
【C++ Primer】第十二章:动态内存管理
开发语言·c++·c++ primer
_extraordinary_2 小时前
Java Spring日志
java·开发语言·spring
初圣魔门首席弟子2 小时前
【C++ 学习】单词统计器:从 “代码乱炖” 到 “清晰可品” 的复习笔记
开发语言·c++