2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉
文章目录
- 1. 导入QXlsx库
- 2. 使用 QXlsx库 读取 .xlsx 文件
- 小结
网上有很多教程,但太费劲了,这里有个非常简便的好方法,分享给大家。
1. 导入QXlsx库
转载链接 :https://github.com/QtExcel/QXlsx/blob/master/HowToSetProject.md
以下是使用 QXlsx 的一种简便方法。
此方法仅适用于 qmake,若使用 cmake,请查看其他文档。
这里介绍在 Windows 系统下的应用方法。
设置步骤
1️⃣ 从 GitHub 克隆源代码
git clone https://github.com/j2doll/QXlsx.git
2️⃣ 打开 Qt Creator
如果你不知道如何使用 Qt Creator,请访问 Qt 公司网站:https://www.qt.io/qt-features-libraries-apis-tools-and-ide/
3️⃣ 创建你自己的 Qt 项目。
4️⃣ 示例是控制台应用程序。
5️⃣ 设置项目名称。当前项目名称是 HelloQXlsx。
6️⃣ HelloQXlsx 项目已创建。
7️⃣ 项目当前所在目录
8️⃣ 将 QXlsx 代码复制到你的应用项目中
xcopy c:\workspace\github\QXlsx\QXlsx c:\workspace\HelloQXlsx /s/e
主要复制这四个内容
9️⃣ 项目当前的目录与文件
🔟 在你的 Qt 项目(*.pro 文件)中添加 QXlsx 库相关代码
应用 Qt 项目的 QXlsx 代码
QXLSX_PARENTPATH=./ # 当前 QXlsx 路径是. (. 表示当前目录)
QXLSX_HEADERPATH=./header/ # 当前 QXlsx 头文件路径是./header/
QXLSX_SOURCEPATH=./source/ # 当前 QXlsx 源文件路径是./source/
include (./QXlsx.pri)
1️⃣1️⃣ 为示例设置头文件和命名空间,然后添加 “Hello World” 代码。
//main.cpp
#include <QCoreApplication>
#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"
using namespace QXlsx;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QXlsx::Document xlsx;// 将 “Hello Qt!” 写入单元格 (A,1),这是共享字符串。xlsx.write ("A1", "Hello Qt!"); xlsx.saveAs ("Test.xlsx"); // 将文档保存为 “Test.xlsx”return 0;// return a.exec();
}
1️⃣2️⃣ 构建并运行项目
1️⃣3️⃣ 会创建一个可执行文件(*.exe)和一个 Excel 文件(.xlsx)。
2. 使用 QXlsx库 读取 .xlsx 文件
#include "mainwindow.h"#include <QApplication>
#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"
using namespace QXlsx;#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();QString filePath = "Test.xlsx";// 创建QXlsx::Document对象并加载文件QXlsx::Document xlsx(filePath);// 检查文件是否成功加载if (xlsx.isLoadPackage()) {int sheetCount = xlsx.workbook()->sheetCount();for (int sheetIndex = 0; sheetIndex < sheetCount; ++sheetIndex) {QXlsx::Worksheet *sheet = dynamic_cast<QXlsx::Worksheet*>(xlsx.workbook()->sheet(sheetIndex));if (sheet) {int rowCount = sheet->dimension().lastRow();int columnCount = sheet->dimension().lastColumn();for (int row = 1; row <= rowCount; ++row) {for (int column = 1; column <= columnCount; ++column) {std::shared_ptr<QXlsx::Cell> cell = sheet->cellAt(row, column);if (cell) {QString value = cell->value().toString();qDebug() << "Sheet" << sheetIndex << "Cell(" << row << "," << column << "):" << value;}}}}}} else {qDebug() << "文件加载失败";}return a.exec();
}
这段 C++ 代码主要实现了一个使用 Qt 框架结合QXlsx
库来读取 Excel 文件的功能,同时启动了一个 Qt 图形界面应用程序,以下是详细解释:
-
头文件包含:
#include "mainwindow.h"
:引入主窗口类的头文件,推测这个程序还关联了一个图形化的主窗口界面。#include <QApplication>
:这是 Qt 应用程序的基础类,用于管理 GUI 应用程序的控制流和主要设置,每个 Qt GUI 程序都需要一个QApplication
对象。- 接下来一系列
#include "xlsxdocument.h"
等头文件,它们来自QXlsx
库,用于操作 Excel 文件,提供了诸如文档、工作表、单元格范围、图表、富文本字符串以及工作簿相关的类定义。 using namespace QXlsx;
:使用QXlsx
命名空间,这样后续代码使用该库中的类时,无需再显式写出命名空间前缀。#include <QDebug>
:引入用于调试输出的头文件。
-
主函数
main
:QApplication a(argc, argv);
:创建QApplication
对象,argc
和argv
是程序启动时的命令行参数,这一步初始化了 Qt 的应用程序环境,为后续的图形界面展示和事件处理做准备。MainWindow w;
和w.show();
:实例化MainWindow
类对象,并调用show
方法显示主窗口,这部分是用于展示图形化界面的常规操作。
-
Excel 文件读取部分:
-
QString filePath = "Test.xlsx";
:定义要读取的 Excel 文件路径,这里指定文件名为Test.xlsx
。 -
QXlsx::Document xlsx(filePath);
:创建QXlsx::Document
对象,尝试加载指定路径的 Excel 文件。 -
if (xlsx.isLoadPackage())
:检查文件是否成功加载,如果加载成功,后续代码开始遍历读取文件内容;否则,输出 “文件加载失败” 的调试信息。 -
int sheetCount = xlsx.workbook()->sheetCount();
:获取工作簿中的工作表数量,xlsx.workbook()
返回工作簿对象,sheetCount()
获取工作表总数。 -
接下来的嵌套
for
循环:-
外层循环遍历每个工作表索引
sheetIndex
。 -
QXlsx::Worksheet *sheet = dynamic_cast<QXlsx::Worksheet*>(xlsx.workbook()->sheet(sheetIndex));
:通过dynamic_cast
将抽象工作表指针转换为具体的Worksheet
指针,确保后续操作是针对正确类型的工作表。 -
内层两个嵌套
for
循环遍历每个工作表的行和列:int rowCount = sheet->dimension().lastRow();
和int columnCount = sheet->dimension().lastColumn();
获取当前工作表的行数和列数。std::shared_ptr<QXlsx::Cell> cell = sheet->cellAt(row, column);
:获取指定行列位置的单元格,这里返回的是智能指针。if (cell)
:判断单元格是否存在,如果存在,将其值转换为QString
类型并输出,输出格式包含工作表索引、行列信息和单元格的值。
-
-
-
程序返回:
return a.exec();
:进入 Qt 应用程序的事件循环,等待用户操作(如关闭窗口、点击按钮等),程序会持续运行直到用户触发退出事件,之后返回系统,结束程序。
小结
万事开头难,QT库的配置没有python简单,所以其慢慢的落幕不是没有道理的,网上可以找到很多资料,方法千奇百怪,但试过之后,方知只有那么一两种适合于自己,所以实践出真知,你我共勉。
相关文章:

2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉
文章目录 1. 导入QXlsx库2. 使用 QXlsx库 读取 .xlsx 文件小结 网上有很多教程,但太费劲了,这里有个非常简便的好方法,分享给大家。 1. 导入QXlsx库 转载链接 :https://github.com/QtExcel/QXlsx/blob/master/HowToSetProject.md…...

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode
【2024最新版】React18 核心源码分析教程(全61集) Element对象与Fiber对象 在 React 中,Element 对象 和 Fiber 对象 是核心概念,用于实现 React 的高效渲染和更新机制。以下是它们的详细解读: 1. Element 对象 定…...

利用Python实现Union-Find算法
Union-Find(又称 并查集)是一种高效解决 动态连通性问题 的算法。它主要提供两种操作: Union(x, y):将元素 x 和 y 连接。Find(x):找到元素 x 所属的集合的标识符(通常是集合的根节点)。 常用…...

【LeetCode: 912. 排序数组 + 归并排序】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
AI时代来了,我们不再需要IDE了
大家好,我是编程乐趣。 最近在思考一个问题,那就是AI这么强大。 未来有没有可能,我们就不需要不需要开发工具了,只需一个浏览器就可以开发软件了。 一、AI带来的变化 1、代码生成与补全 AI工具如GitHub Copilot等能够根据代码…...
PL/SQL语言的网络编程
PL/SQL语言的网络编程 引言 在信息化迅速发展的今天,网络编程作为现代软件开发的重要组成部分,受到了广泛关注。而在数据库管理系统中,Oracle 提供了 PL/SQL(Procedural Language/Structured Query Language)&#x…...
vue video重复视频 设置 srcObject 视频流不占用资源 减少资源浪费
// 直接设置srcObject减少获取视频流:通过 captureStream() 方法从下方视频元素获取视频流。 // 设置 srcObject:将获取到的视频流设置为上方视频的 srcObject 减少资源浪费 // 获取到需要复制到的dom元素 const firstVideoElement proxy.$refs.firs…...

JavaFx 21 项目Markdown 预览、编辑、新建、文件树、删除、重命名
项目文件结构 项目的源代码和资源文件存放在以下路径: 源代码: src/main/java/com/kong/markdown/ 包含多个 Java 文件,主要实现了应用的功能: App.java:主类,可能包含应用的启动逻辑。FileService.java:可能与文件操作相关的服务类。MainController.java:控制器类,可…...

git项目提交步骤(简洁版)
1.创建仓库 2.填写 信息 3.点击这个按钮 4.找到要上传的文件,在目录内右键点击 5.依次执行命令 在命令窗口中输入:git init 复制仓库地址: 在命令窗口中输入:git remote add origin 仓库地址 在命令窗口中输入:…...

风水算命系统架构与功能分析
系统架构 服务端:Java(最低JDK1.8,支持JDK11以及JDK17)数据库:MySQL数据库(标配5.7版本,支持MySQL8)ORM框架:Mybatis(集成通用tk-mapper,支持myb…...
Clojure语言的学习路线
Clojure语言的学习路线 Clojure是一种现代的Lisp方言,运行于Java虚拟机(JVM)上。它具备强大的函数式编程特性,支持并发和多线程编程,适合处理复杂的数据和计算任务。由于其简洁和灵活的语法,Clojure在数据…...

网络安全核心目标CIA
网络安全的核心目标是为关键资产提供机密性(Confidentiality)、可用性(Availablity)、完整性(Integrity)。作为安全基础架构中的主要的安全目标和宗旨,机密性、可用性、完整性频频出现,被简称为CIA,也被成为你AIC,只是顺序不同而已…...

Wi-Fi Direct (P2P)原理及功能介绍
目录 Wi-Fi Direct (P2P)介绍Wi-Fi Direct P2P 概述P2P-GO(P2P Group Owner)工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct ÿ…...
Perl语言的数据结构
Perl语言的数据结构 Perl是一种功能强大的、灵活的脚本语言,广泛用于文本处理、系统管理、网络编程以及许多其他领域。其灵活性不仅体现在语法上,还体现在其丰富的数据结构上。本文将深入探讨Perl的主要数据结构,包括标量、数组、哈希以及引…...

【MFC】设置CTreeCtrl单个节点的文字颜色
问题 功能调整需要依据不同状态设置树控件中单个节点的文字颜色。 分析 1、CTreeCtrl本身有设置文字颜色的接口SetTextColor,但是这个接口是设置树控件整体的文字颜色。 2、在自定义接口可以对树控件单个节点进行更新文字颜色和背景颜色,接收自定义绘制…...
【CSS】设置滚动条样式
文章目录 基本语法用法案例 基本语法 在CSS中,可以使用 ::-webkit-scrollbar 和相关伪元素来为滚动条设置样式,但请注意这些伪元素是非标准的,主要用于WebKit内核浏览器(如Chrome、Safari)。 ::-webkit-scrollbar CSS …...

Gitlab-Runner配置
原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务,如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信,接收作业并提交到执行队列,Gitlab-Runner从队列中获取作业,并允许在不同环境下进行作…...
代码随想录 哈希 test 8
18. 四数之和 - 力扣(LeetCode) 与三数之和类似,重点在剪枝和去重的区别,由于target可正可负,因此需要分两种情况讨论,如果target为正,则若当前选择的元素之和大于target,需要跳出这…...

[SAP ABAP] 使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数据
使用 LOOP AT...ASSIGNING FIELD-SYMBOL... 可以直接修改内表中的数据,而不需要先将内表数据复制到相应的工作区,然后再更新回内表中,从而提高性能 针对上述代码进行优化,我们使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数…...
MySQL数据导出导入
一、数据导出 1.导出全库备份到本地的目录 mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines--default-character-setutf8 --lock-all-tables --add-drop-database -A >db.all.sql 2.导出指定库到本地的目录(例如mysql库) mysqldump -u$USER -p$PASSWD -h127.…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...