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实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl