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

news2024/11/18 1:24:52

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();

        /// 根据信息初始化Qtablewidget
        ui->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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1662527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习--生成对抗网络GAN

GAN简介 让我们先来简单了解一下GAN GAN的全称是Generative Adversarial Networks&#xff0c;中文称为“生成对抗网络”&#xff0c;是一种在深度学习领域广泛使用的无监督学习方法。 GAN主要由两部分组成&#xff1a;生成器和判别器。生成器的目标是尽可能地生成真实的样本数…

深度学习之前馈神经网络

1.导入常用工具包 #在终端中输入以下命令就可以安装工具包 pip install numpy pip install pandas Pip install matplotlib注&#xff1a; numpy是科学计算基础包 pandas能方便处理结构化数据和函数 matplotlib主要用于绘制图表。 #导包的代码&#xff1a; import numpy as n…

java对象互换工具类

1:将Object类型转成json字符串 /*** 将对象转为字符串* param obj* return*/public static String toString(Object obj) {if(obj null) {return null;}if ("".equals(obj.toString())) {return null;}if (obj instanceof String) {return obj.toString();}try {Ob…

c#教程——索引器

前言&#xff1a; 索引器&#xff08;Indexer&#xff09;可以像操作数组一样来访问对象的元素。它允许你使用索引来访问对象中的元素&#xff0c;就像使用数组索引一样。在C#中&#xff0c;索引器的定义方式类似于属性&#xff0c;但具有类似数组的访问方式。 索引器&#x…

2010-2030年GHS-POP数据集下载

扫描文末二维码&#xff0c;关注微信公众号&#xff1a;ThsPool 后台回复 g008&#xff0c;领取 2010-2030年100m分辨率GHS-POP 数据集 &#x1f4ca; GHS Population Grid (R2023)&#xff1a;全球人口分布的精准视图与深度应用 &#x1f310; 在全球化和快速城市化的今天&am…

2024-05-10 Ubuntu上面使用libyuv,用于转换、缩放、旋转和其他操作YUV图像数据,测试实例使用I420ToRGB24

一、简介&#xff1a;libyuv 最初是由Google开发的&#xff0c;主要是为了支持WebRTC项目中的视频处理需求。用于处理YUV格式图像数据的开源库。它提供了一系列的函数&#xff0c;用于转换、缩放、旋转和其他操作YUV图像数据。 二、执行下面的命令下载和安装libyuv。 git clo…

【全开源】JAVA台球助教台球教练多端系统源码支持微信小程序+微信公众号+H5+APP

功能介绍 球厅端&#xff1a;球厅认证、教练人数、教练的位置记录、助教申请、我的项目、签到记录、我的钱包、数据统计 教练端&#xff1a;我的页面&#xff0c;数据统计、订单详情、保证金、实名认证、服务管理、紧急求助、签到功能 用户端&#xff1a;精准分类、我的助教…

FonePaw Data Recovery for Mac:轻松恢复丢失数据

FonePaw Data Recovery for Mac是一款功能强大的数据恢复软件&#xff0c;专为Mac用户设计&#xff0c;帮助用户轻松恢复因各种原因丢失的数据。该软件支持从硬盘驱动器、存储卡、闪存驱动器等存储介质中恢复丢失或删除的文件&#xff0c;包括照片、视频、文档、电子邮件、音频…

2024最新版付费进群系统源码全开源

源码说明&#xff1a; 下 载 地 址 &#xff1a; runruncode.com/php/19758.html 2024最新修复版独立付费进群系统源码全开源&#xff0c;基于ThinkPHP框架开发。 1、修复SQL表 2、修复支付文件 3、修复支付图标不显示 4、修复定位、分销逻辑、抽成逻辑 5、新增支持源支…

AVL树的旋转

目录 1.平衡因子 2.旋转 a.节点定义 b.插入 插入 平衡因子更新 旋转 左单旋 右单旋 右左双旋 左右双旋 3.AVL树的验证 1.平衡因子 我们知道搜索二叉树有缺陷&#xff0c;就是不平衡&#xff0c;比如下面的树 什么是搜索树的平衡&#xff1f;就是每个节点的左右子树的…

Web实时通信的学习之旅:轮询、WebSocket、SSE的区别以及优缺点

文章目录 一、通信机制1、轮询1.1、短轮询1.2、长轮询 2、Websocket3、Server-Sent Events 二、区别1、连接方式2、协议3、兼容性4、安全性5、优缺点5.1、WebSocket 的优点&#xff1a;5.2、WebSocket 的缺点&#xff1a;5.3、SSE 的优点&#xff1a;5.4、SSE 的缺点&#xff1…

刷代码随想录有感(62):修建二叉搜索树

题干&#xff1a; 代码&#xff1a; class Solution { public:TreeNode* traversal(TreeNode* root, int low, int high){if(root NULL)return NULL;if(root->val < low)return traversal(root->right, low, high);if(root->val > high)return traversal(ro…

新版文件同步工具(Python编写,其中同时加入了多进程计算MD5、多线程复制大文件、多协程复制小文件、彩色输出消息、日志功能)

两个月前&#xff0c;接到一个粉丝的要求&#xff0c;说希望在我之前编写的一个python编写的文件同步脚本(Python编写的简易文件同步工具(已解决大文件同步时内存溢出问题)https://blog.csdn.net/donglxd/article/details/131225175)上加入多线程复制文件的功能&#xff0c;前段…

Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)

1 漏洞描述 CVE-2020-1938 是 Apache Tomcat 中的一个严重安全漏洞&#xff0c;该漏洞涉及到 Tomcat 的 AJP&#xff08;Apache JServ Protocol&#xff09;连接器。由于 AJP 协议在处理请求时存在缺陷&#xff0c;攻击者可以利用此漏洞读取服务器上的任意文件&#xff0c;甚至…

ALV Color-颜色

目录 前言 实战 列颜色 行颜色 单元格颜色 前言 在ABAP ALV中&#xff0c;Color颜色设置是一种增强列表显示效果的重要手段&#xff0c;可以用来突出显示特定行、列或单元格&#xff0c;以吸引用户注意或传达数据的特定状态。 颜色设置中有优先级顺序&#xff0c;他们是单元格…

Mac电脑安装打开APP显示问题已损坏 问题解决

当MAC电脑安装完软件打开时&#xff0c;显示文件已损坏&#xff0c;无法打开。搜了很多教程终于找到解决方案&#xff0c;记录下方便以后再用。 我的mac电脑是intel芯片的&#xff0c;如果你遇到这个问题&#xff0c;可以参考我的这个方案。 1.首先当打开软件后出现 “xx软件已…

HTTPS 原理和 TLS 握手机制

HTTPS的概述与重要性 在当今数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;数据在传输过程中的安全性备受关注。HTTPS 作为一种重要的网络通信协议&#xff0c;为数据的传输提供了强有力的安全保障。它是在 HTTP 的基础上发展而来&#xff0c;通过引入数据加密机制&a…

C++ BuilderXE 计算程序运行时间精确到毫秒

#include <time.h> // //计算时间 clock_t start,end,dtStart; startclock(); // ProgressBar1->Percent0; // // ProgressBar1->Percenti/DDnum*100; // Application->ProcessMessages(); // //操作完成计时 …

干货分享:AI知识库-从认识到搭建

随着知识库的出现&#xff0c;人工智能也逐渐加入进来&#xff0c;形成了“AI知识库”。也许将AI和知识库拆开&#xff0c;你能理解是什么意思&#xff0c;但是当两个词结合在一起时&#xff0c;你又真的能理解它是做什么的吗&#xff1f;这就是今天我们要来聊的话题&#xff0…

服务器内存占用不足会怎么样,解决方案

在当今数据驱动的时代&#xff0c;服务器对于我们的工作和生活起着举足轻重的作用。而在众多影响服务器性能的关键因素当中&#xff0c;内存扮演着极其重要的角色。 服务器内存&#xff0c;也称RAM&#xff08;Random Access Memory&#xff09;&#xff0c;是服务器核心硬件部…