Qt Excel读写 - QXlsx读取Excel文件显示到QTableWidget

2024-05-11 07:36

本文主要是介绍Qt Excel读写 - QXlsx读取Excel文件显示到QTableWidget,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt Excel读写 - QXlsx读取Excel文件显示到QTableWidget

  • 引言
  • 一、设计思路
  • 二、核心源码
  • 三、其他参考链接

引言

在这里插入图片描述

QXlsx官方显示的例子中,有一个XlsxFactory可以Load xlsx file and display on Qt widgets.但是其包含商业许可…自己写了一个简化版本:可以读取Excel文件,显示到QTableWidget上 (如上图所示),也可在QTableWidget上进行修改,再保存到Excel文件中。

  • 本文只考虑了单元格合并情况,其他格式问题暂未处理 (字体、颜色等)

一、设计思路

    1. 考虑单元格合并的情况,先读取所有合并的单元格
xlsx = new QXlsx::Document(filename);
CellRange cellrange = xlsx->dimension();
Worksheet *wst = static_cast<QXlsx::Worksheet *>(xlsx->workbook()->sheet(0));
QList<QXlsx::CellRange> qMergedCellsList = wst->mergedCells();   // 获取所有合并的单元格
    1. 根据读取的文件信息,初始化tableWidget (行列数),在tableWidget相同位置执行合并操作
ui->tableWidget->setColumnCount(cellrange.columnCount());
ui->tableWidget->setRowCount(cellrange.rowCount());
for(CellRange c : qMergedCellsList) {   // 合并单元格处理ui->tableWidget->setSpan(c.firstRow() - 1, c.firstColumn() - 1,c.lastRow() - c.firstRow() + 1, c.lastColumn() - c.firstColumn() + 1);
}
    1. 遍历进行数据读取,无脑读取即可 (需注意索引从0开始还是1开始). 被合并的单元格内容为空 (合并的大单元格,只有左上角单元格有值 - 详见Debug输出信息)
for(int i = 1; i <= cellrange.lastRow(); i++){for(int j = 1; j <= cellrange.lastColumn(); j++){QTableWidgetItem *it = new QTableWidgetItem();it->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);it->setText(wst->read(i, j).toString());ui->tableWidget->setItem(i-1, j-1, it);qDebug("%d,%d: %s",i,j,wst->read(i,j).toString().toStdString().c_str());}
}

在这里插入图片描述

    1. 修改数据,然后保存到文件中
      设置Table可编辑:setEditTriggers(QAbstractItemView::AllEditTriggers); // 可编辑
for(int i = 1; i <= cellrange.lastRow(); i++){for(int j = 1; j <= cellrange.lastColumn(); j++){qDebug("%d,%d: %s",i,j,ui->tableWidget->item(i-1, j-1)->text().toStdString().c_str());qDebug("%d,%d: %s",i,j,ui->tableWidget->itemAt(i-1, j-1)->text().toStdString().c_str());wst->write(i, j, ui->tableWidget->item(i-1, j-1)->text());}
}
xlsx->saveAs(file);

使用setSpan合并QTableWidget单元格,会造成itemAt函数一直返回0,使用item获取每一个单元格即可。

QTableWidget表格合并若干问题及解决方法:https://www.cnblogs.com/findumars/p/5422995.html
QTableWidget 成员函数itemAt与item的区别与疑问:https://blog.csdn.net/sddzycnqjn/article/details/24968763/
QTableWidget的获取指定位置项的item和itemAt方法:https://www.cnblogs.com/LaoYuanStudyPython/p/12949250.html

二、核心源码

  • Excel文件的读取和保存
connect(ui->action_open, &QAction::triggered, [this](){filename = QFileDialog::getOpenFileName(this, "打开", nullptr, "*.xlsx (*.xlsx)");if(!filename.isEmpty()){// 打开xlsx文件,获取相关信息xlsx = new QXlsx::Document(filename);CellRange cellrange = xlsx->dimension();Worksheet *wst = static_cast<QXlsx::Worksheet *>(xlsx->workbook()->sheet(0));QList<QXlsx::CellRange> qMergedCellsList = wst->mergedCells();   // 获取所有合并的单元格
//            Cell c = wst->cellAt(1, 1);
//            c.format();/// 根据信息初始化Qtablewidgetui->tableWidget->setColumnCount(cellrange.columnCount());ui->tableWidget->setRowCount(cellrange.rowCount());ui->tableWidget->resizeColumnsToContents();ui->tableWidget->setEditTriggers(QAbstractItemView::AllEditTriggers);ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//ui->tableWidget->verticalHeader()->hide();for(CellRange c : qMergedCellsList) {   // 合并单元格处理ui->tableWidget->setSpan(c.firstRow() - 1, c.firstColumn() - 1,c.lastRow() - c.firstRow() + 1, c.lastColumn() - c.firstColumn() + 1);}for(int i = 1; i <= cellrange.lastRow(); i++){for(int j = 1; j <= cellrange.lastColumn(); j++){QTableWidgetItem *it = new QTableWidgetItem();it->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);it->setText(wst->read(i, j).toString());ui->tableWidget->setItem(i-1, j-1, it);qDebug("%d,%d: %s",i,j,wst->read(i,j).toString().toStdString().c_str());}}}
});connect(ui->action_save, &QAction::triggered, [this](){if(!xlsx){return;}QString file = QFileDialog::getSaveFileName(this, "打开", filename, "*.xlsx (*.xlsx)");if(!file.isEmpty()){// 打开xlsx文件,获取相关信息CellRange cellrange = xlsx->dimension();Worksheet *wst = static_cast<QXlsx::Worksheet *>(xlsx->workbook()->sheet(0));for(int i = 1; i <= cellrange.lastRow(); i++){for(int j = 1; j <= cellrange.lastColumn(); j++){qDebug("%d,%d: %s",i,j,ui->tableWidget->item(i-1, j-1)->text().toStdString().c_str());qDebug("%d,%d: %s",i,j,ui->tableWidget->itemAt(i-1, j-1)->text().toStdString().c_str());wst->write(i, j, ui->tableWidget->item(i-1, j-1)->text());}}xlsx->saveAs(file);}
});

三、其他参考链接

官方例子:https://gitcode.com/qtexcel/qxlsx/blob/master/Example.md
QT读取Excel表格内容到Table Widget:https://blog.csdn.net/qq_16186465/article/details/125555628
QXlsx对合并单元格的处理:https://blog.csdn.net/qq_36391817/article/details/84032788
Qt-QXLS应用 读写Excel常用函数 (包括表单、样式、图、宏操作等,比较全):https://www.cnblogs.com/fengye2021/p/15363391.html

这篇关于Qt Excel读写 - QXlsx读取Excel文件显示到QTableWidget的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978900

相关文章

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

如何利用Python实现给Excel表格截图

《如何利用Python实现给Excel表格截图》这篇文章主要为大家详细介绍了如何利用Python实现给Excel表格截图功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 我搜索了网络上的方案,感觉把 Excel 表格转换为 html 再用 platwright 截图是比China编程较顺

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三