Qt读写Excel文件与QXlsx的使用

news2024/9/21 16:19:25

最近项目比较忙,许久没写博客了,想着还是需要定期整理下学到的和用到的新东西,才有沉淀。刚好最近使用Qt时需要读取excel文件的数据,于是在github找了一个开源库QXlsx,Star数还比较多,应该靠谱,下面就来记录下整个使用过程吧。

下载源码

话不多说,肯定是先把源码撸下来。
git clone https://github.com/QtExcel/QXlsx

编译源码

  1. 使用Qt Creator打开源码工程(我这里用的Qt版本是5.8.0)
    在这里插入图片描述
  2. 配置工程,然后选择release,点击左下角锤子进行构建。在这里插入图片描述
  3. 在构建目录下找到编译产物libQXlsx.a在这里插入图片描述

使用QXlsx

1.创建Qt工程

在这里插入图片描述
配置编译套件,生成UI基础模板工程。
在这里插入图片描述
添加两个按键、一个Tablewidget控件,用户打开、保存以及显示excel表内容。
在这里插入图片描述

2. 添加QXlsx库和头文件

将编译生成的QXlsx库文件和头文件目录(QXlsx\QXlsx\header),拷贝到刚刚新建的工程下:在这里插入图片描述
右键工程目录,添加现有文件,选择header目录下所有头文件(选择文件是ctrl+A可全选):
在这里插入图片描述
右键工程目录,添加库… ,选择外部库,然后点击浏览选择库文件,选择文件后点击下一步、完成即可。
在这里插入图片描述
配置完成后,可以在pro文件中看到如下内容:
在这里插入图片描述

3. 使用QXlsx库的函数接口

话不多说,直接上代码,供大家参考:
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QFileDialog>
#include <QDebug>

#include "header/xlsxdocument.h"
#include "header/xlsxchartsheet.h"
#include "header/xlsxcellrange.h"
#include "header/xlsxchart.h"
#include "header/xlsxrichstring.h"
#include "header/xlsxworkbook.h"
using namespace QXlsx;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_open_clicked();

    void on_pushButton_save_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_open_clicked()
{
    QString filepath = QFileDialog::getOpenFileName(this, "打开文件", ".", "*.xlsx");
    if(filepath.isEmpty())
        return;

    Document xlsxR(filepath);
    if (xlsxR.load())
    {
        ui->tableWidget->setRowCount(10);   // 显示10行10列
        ui->tableWidget->setColumnCount(10);
        QStringList header;
        header << "A" << "B"<< "C"<< "D"<< "E"<< "F"<< "G"<< "H"<< "I"<< "J";
        ui->tableWidget->setHorizontalHeaderLabels(header);
        for(int row = 0; row < 10; row++)
        {
            for(int col = 0; col < 10; col++)
            {
                Cell* cell = xlsxR.cellAt(row+1, col+1); // 注意:tablewidget控件的row和col是从0开始的,QXlsx的row和col是从1开始的
                if ( cell != NULL )
                {
                    ui->tableWidget->setItem(row, col, new QTableWidgetItem(cell->readValue().toString()));
                    ui->tableWidget->item(row, col)->setTextAlignment(Qt::AlignCenter); // 居中
                    QVariant var = cell->readValue();
                    qDebug() << var;
                }
            }
        }
    }
}

void Widget::on_pushButton_save_clicked()
{
    QXlsx::Document xlsxW;
    for(int row = 0; row < 10; row++)
    {
        for(int col = 0; col < 10; col++)
        {
           xlsxW.write(row+1, col+1, QVariant(ui->tableWidget->item(row, col)->text()));
        }
    }
    QString savefile = QFileDialog::getSaveFileName(this, "打开文件", ".", "*.xlsx");
    if(!savefile.isEmpty())
        xlsxW.saveAs(savefile); // save the document as 'Test.xlsx'
}

编译运行后:
新建一个excel表格,写一些测试数据,如下图所示:
在这里插入图片描述

点击打开,选择文件后,显示效果如下,成功读取出excel中的数据并显示到了tablewidget控件中:
在这里插入图片描述
点击修改其中任意一个单元格的数据:
在这里插入图片描述
点击保存,然后打开生成的文件,可以看到成功的将tablewidget控件里的数据写入到excel文件中:
在这里插入图片描述

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

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

相关文章

【CV】第 2 章:使用本地二进制模式的内容识别

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

MPLS隧道——PE与CE之间运行不同路由协议的情况分析

目录 PE和CE之间运行OSPF路由协议 Ospf的Dmian ID&#xff08;还原属性&#xff09; Ospf的Sham Link属性 OSPF的DN置位与VPN Router Tag PE和CE之间运行BGP路由协议 AS号替换功能 BGP的SoO属性 PE和CE之间可以不同部署不同的路由协议&#xff0c;部署不同的路由协议会存…

量子笔记:多比特量子门

目录 0. 前言 2. 量子多重H门 3. 量子SWAP门 4. 量子CNOT门&#xff08;CX门&#xff09;&#xff1a;受控非门 5. 量子CY和CZ门 6. 量子C*门 6.1 受控S门 6.2 受控H门 6.3 受控Z旋转门 6.4 受控X旋转门 6.4 受控Y旋转门 7. 量子托佛利门(CCNOT门) 8. 量子弗雷德…

【Linux】Linux中的gcc/g++编译器的使用

&#x1f4ac;推荐一款模拟面试、刷题神器 、从基础到大厂面试题&#xff1a;&#x1f449;点击跳转刷题网站进行注册学习 目录 一、编译的过程 1、预处理阶段 1.1预处理的工作——头文件展开、去注释、宏替换、条件编译 1.2外部定义宏&#xff08;-D选项&#xff09; 1.…

记一次网络安全应急响应流程

0x01 事件分析 网站源码被篡改&#xff0c;攻击者一定获取到了权限&#xff0c;那么接下来的思路就是推测攻击者入侵手段&#xff0c;找到业务脆弱点&#xff0c;对服务器进行全方位排查&#xff0c;找到攻击者留下来的痕迹并进行分析处理。 2.1 信息收集 与客户简单沟通后&…

【C++】动态联编、delete/free【有无析构】的使用,虚析构

文章目录动态联编的条件&#xff1a;联编的概念&#xff1a;1. 动态联编&#xff1a;2. 静态联编&#xff1a;静态联编时确认了那些属性&#xff1a;结论&#xff1a;基类指针和派生类指针访问虚函数结论&#xff1a;delete和free的使用条件&#xff1a;1. 没有析构函数时&…

由一个按键程序引发的思考(上)

说起按键程序&#xff0c;只要会单片机的肯定都很熟悉。一般开始学习单片机的时候&#xff0c;入门程序基本都是LED灯和按键。那么这个按键程序有什么特别的吗&#xff0c;还需要专门去思考吗&#xff1f;如果我刚开始学单片机的时候也会这么想&#xff0c;但是随着项目的积累&…

微信早安消息推送(大升级版-企业微信)

微信早安消息推送&#xff08;企业微信&#xff09; 在微信公众号推送的基础上的一个升级 新增图文、疫情状况等 可以修改头像 、 昵称 效果展示 更多资讯 源代码获取 → 薇信公粽号“Cloud技术栈”&#xff0c;回复“企业微信推送” ———————————————————…

【贪心算法-LeetCode3:无重复字符的最长子串(Java实现)】

无重复字符的最长子串一、题目描述1.题目内容2.样例二、解决方案1.算法流程1&#xff09;分析2&#xff09;算法流程2.Java代码1&#xff09;核心代码2&#xff09;完整测试代码个人社区&#xff1a;https://bbs.csdn.net/forums/smile 个人主页&#xff1a;https://blog.csdn.…

STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁

STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁&#x1f4cd;相关篇《【硬件开源电路】STM32G070RBT6开发板》&#x1f33a;配置内容演示&#xff1a; &#x1f4da;功能介绍 &#x1f4d1;通过STM32CubeMX配置定时器1和定时器3分别作为两个led的定时闹钟。这里作为…

单片机原理及应用实验一交通信号系统(基于Proteus仿真)

1.实验内容与要求 交通信号系统是保障交通安全高效的重要设施。51单片机价格低廉、体积小、低功耗、抗干扰性好等优点&#xff0c;适用于交通信号系统中&#xff0c;本实验利用51单片机IO口的开关量的输入输出功能及内部CPU运算功能&#xff0c;设计一个简易的交通信号灯系统&…

生成.keystore 安卓签名

需要有openssl.exe和keytool.exe支持 signapk.jar手动签名命令 java -jar signapk.jar pl.x509.pem pl.pk8 smartrecord_3.5.8.apk smartrecord_3.5.8-signed.apk除了直接使用signapk.jar签名外&#xff0c;还可以将签名文件生成keystore文件&#xff0c;然后配置编译器给apk进…

数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(5)

文章目录前期准备1. 将create Time列设置为索引2. 生成一个和df长度相同的随机数DataFrame3. 将上一题生成的DataFrame与df合并4. 生成的新的一列new值为salary列减去之前生成的随机数列5. 检查数据中是否含有空值6. 将salary类型转换成浮点数7. 计算salary 大于10000的次数8. …

多线程之线程池

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、什么是线程池二.为什么要有线程池引入&#xff1a;为什么从池子里取&#xff0c;比创建线程速度要快什么是用户态&#xff0c;什么是内核态最终结论&#xf…

aws 负载均衡clb/nlb/alb

目录 概述 传统负载均衡器&#xff08;Classic Load Balancer&#xff09; DNS解析 健康检查&#xff08;Health Check) 监听器&#xff08;Listeners&#xff09; 连接耗尽&#xff08;Connection Draining&#xff09; 粘性会话/会话关联&#xff08;Sticky Sessions/…

(四)手写简单版MyBatis框架

文章目录环境搭建第一步&#xff1a;资源⼯具类第二步&#xff1a;定义SqlSessionFactoryBuilder类第三步&#xff1a;定义SqlSessionFactory类第四步&#xff1a;定义JDBC事务管理器第五步&#xff1a;定义数据源类第六步&#xff1a;定义MyMappedStatement类第七步&#xff1…

基于遗传算法卡车无人机旅行推销员问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Leetcode刷题111. 二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 示例 2&#xff1a; 输入…

Python_机器学习_算法_第7章_7.拓展知识

Python_机器学习_算法_第7章_7.拓展知识 文章目录Python_机器学习_算法_第7章_7.拓展知识7.拓展知识7.1. 其他距离公式1 标准化欧氏距离2 余弦距离3 汉明距离【了解】4 杰卡德距离【了解】5 马氏距离【了解】7.2.再议数据分割1 留出法2 交叉验证法2.1 交叉验证法基本介绍2.2 KF…

ARM发布Cortex-X3和Cortex-A715

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; ARM公司发布了第二代 AR…