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

相关文章

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.