2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉

news2025/1/11 10:29:13

文章目录

  • 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
主要复制这四个内容
QXlsx中需要复制到项目中的内容

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 图形界面应用程序,以下是详细解释:

  1. 头文件包含

    • #include "mainwindow.h":引入主窗口类的头文件,推测这个程序还关联了一个图形化的主窗口界面。
    • #include <QApplication>:这是 Qt 应用程序的基础类,用于管理 GUI 应用程序的控制流和主要设置,每个 Qt GUI 程序都需要一个QApplication对象。
    • 接下来一系列#include "xlsxdocument.h" 等头文件,它们来自QXlsx库,用于操作 Excel 文件,提供了诸如文档、工作表、单元格范围、图表、富文本字符串以及工作簿相关的类定义。
    • using namespace QXlsx;:使用QXlsx命名空间,这样后续代码使用该库中的类时,无需再显式写出命名空间前缀。
    • #include <QDebug>:引入用于调试输出的头文件。
  2. 主函数main

    • QApplication a(argc, argv);:创建QApplication对象,argcargv是程序启动时的命令行参数,这一步初始化了 Qt 的应用程序环境,为后续的图形界面展示和事件处理做准备。
    • MainWindow w;w.show();:实例化MainWindow类对象,并调用show方法显示主窗口,这部分是用于展示图形化界面的常规操作。
  3. 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类型并输出,输出格式包含工作表索引、行列信息和单元格的值。
  4. 程序返回
    return a.exec();:进入 Qt 应用程序的事件循环,等待用户操作(如关闭窗口、点击按钮等),程序会持续运行直到用户触发退出事件,之后返回系统,结束程序。

小结

  万事开头难,QT库的配置没有python简单,所以其慢慢的落幕不是没有道理的,网上可以找到很多资料,方法千奇百怪,但试过之后,方知只有那么一两种适合于自己,所以实践出真知,你我共勉。

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

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

相关文章

先辑芯片HPM5300系列之SEI多摩川协议命令表问题研究

多摩川协议有9条命令&#xff0c;但是先辑SEI的命令表只有8张。0-6是可用的&#xff0c;第7张是黑洞表&#xff0c;所以只有7张可用。 命令表的限制颇多&#xff0c;比如命令表只能按顺序使用 &#xff1a;例如0、1、3&#xff0c;那么命令表3是不能用的。 如果想要实现9个命令…

kotlin项目无法访问Java类的问题

使用IntelliJ创建一个Kotlin项目&#xff0c;然后在src/main/kotlin中创建一个java接口&#xff1a;Animal.java&#xff0c;然后在Main.kt中打印这个java接口&#xff0c;如下&#xff1a; fun main() {println(Animal::class.java) }代码在编辑器中并没有报错&#xff0c;但…

全栈面试(一)Basic/微服务

文章目录 项目地址一、Basic InterviewQuestions1. tell me about yourself?2. tell me about a time when you had to solve a complex code problem?3. tell me a situation that you persuade someone at work?4. tell me a about a confict with a teammate and how you…

医疗可视化大屏 UI 设计新风向

智能化交互 借助人工智能与机器学习技术&#xff0c;实现更智能的交互功能。如通过语音指令或手势控制来操作大屏&#xff0c;医护人员无需手动输入&#xff0c;可更便捷地获取和处理信息。同时&#xff0c;系统能根据用户的操作习惯和数据分析&#xff0c;自动推荐相关的医疗…

Angular由一个bug说起之十三:Cross Origin

跨域 想要了解跨域&#xff0c;首要要了解源 什么是源&#xff0c;源等于协议加域名加端口号 只有这三个都相同&#xff0c;才是同源&#xff0c;反之则是非同源。 比如下面这四个里&#xff0c;只有第4个是同源 而浏览器给服务器发送请求时&#xff0c;他们的源一样&#xff0…

【LeetCode Hot100 贪心算法】 买卖股票的最佳时机、跳跃游戏、划分字母区间

贪心算法 买卖股票的最佳时机买卖股票的最佳时机II跳跃游戏跳跃游戏II划分字母区间 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的…

MCANet: 基于多模态字幕感知的大语言模型训练无关视频异常检测

目录 摘要01 引言02 相关工作2.1 视频异常检测2.2 基于视频的大语言模型&#xff08;VLLMs&#xff09; 03 方法论3.1 问题定义3.2 MCANet3.3 图像字幕分支3.4 音频字幕分支3.5 基于LLM的异常评分3.6 视频-文本分数优化 04 实验4.1 数据集和评估指标4.2 实现细节4.3 定性结果4.…

为深度学习引入张量

为深度学习引入张量 什么是张量&#xff1f; 神经网络中的输入、输出和转换都是使用张量表示的&#xff0c;因此&#xff0c;神经网络编程大量使用张量。 张量是神经网络使用的主要数据结构。 张量的概念是其他更具体概念的数学概括。让我们看看一些张量的具体实例。 张量…

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件&#xff0c;支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境&#xff0c;可以在网页、小程序等平台中使用。 源码 https:…

[DO374] Ansible 配置文件

[DO374] Ansible 配置文件 1. 配置文件位置2. 配置文件3. Ansible 配置4. Ansible的Ad-hoc5. Ansible 模块6. playbook段落7. 任务执行后续8. Ansible 变量8.1 ansible 变量的定义8.1.1 主机变量8.1.2 主机组变量 8.2 vars的循环 9. Ansible Collection10. Ansible-galaxy 安装…

[程序设计]—代理模式

[程序设计]—代理模式&#x1f473; 本文章记录学习于——52.面向切面&#xff1a;AOP-场景模拟_哔哩哔哩_bilibili 最近闲来无事&#xff0c;在学习Spring的源码&#xff1a; 后面慢慢更新源码系列blog&#xff0c;希望多多关注&#x1f64f;&#x1f64f; 目前已经总结的b…

OSPF - 2、3类LSA(Network-LSA、NetWork-Sunmmary-LSA)

前篇博客有对常用LSA的总结 2类LSA&#xff08;Network-LSA&#xff09; DR产生泛洪范围为本区域 作用:  描述MA网络拓扑信息和网络信息&#xff0c;拓扑信息主要描述当前MA网络中伪节点连接着哪几台路由。网络信息描述当前网络的 掩码和DR接口IP地址。 影响邻居建立中说到…

景芯SOC设计实战

终身辅导、一对一辅导&#xff0c;手把手教您完成SoC全流程设计&#xff0c;从入门到进阶&#xff0c;带您掌握SoC芯片架构、算法、设计、验证、DFT、后端及低功耗全流程&#xff01;直播视频不定期升级&#xff01;让您快速超越同龄人&#xff01; 景芯团队主打文档服务器实战…

多云架构,JuiceFS 如何实现一致性与低延迟的数据分发

随着大模型的普及&#xff0c;GPU 算力成为稀缺资源&#xff0c;单一数据中心或云区域的 GPU 资源常常难以满足用户的全面需求。同时&#xff0c;跨地域团队的协作需求也推动了企业在不同云平台之间调度数据和计算任务。多云架构正逐渐成为一种趋势&#xff0c;然而该架构下的数…

如何获取文件的MIME类型

文章目录 1. 概念介绍2. 方法与类型2.1 使用方法2.2 常见类型3. 示例代码4. 内容总结我们在上一章回中介绍了"如何加载本地图片"相关的内容,本章回中将介绍如何获取文件类型.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中提到的文件类型是指MI…

【Uniapp-Vue3】computed计算属性用法及方法对比

如果我们想要将两个响应式变量进行某种运算&#xff0c;就可以使用computed计算属性。 比如下面这个例子中&#xff0c;输入名和姓合成全名&#xff0c;可以用直接显示的方法&#xff1a; 我们也可以使用computed属性&#xff1a; import {computed} from "vue"; le…

C#实现凸壳算法

凸壳计算代码: public static PointD[] calcConvexHull(PointD[] points) {// 按 x 坐标对点进行排序Array.Sort(points, (p1, p2) => p1.X.CompareTo(p2.X));// 创建下凸壳var lowerHull = new List<PointD>();foreach (var point in points){while (lowerHull.Co…

设计模式 行为型 状态模式(State Pattern)与 常见技术框架应用 解析

状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为&#xff0c;使得对象看起来好像修改了它的类。这种设计模式的核心思想是将对象的状态和行为封装成不同的状态类&#xff0c;通过状态对象的行为改变来避免…

SAP SD学习笔记27 - 贩卖契约(框架协议)2 - 基本契约 - 金额契约(价值合同)

上一章讲了贩卖契约&#xff08;框架协议&#xff09;的概要&#xff0c;以及贩卖契约中最为常用的 基本契约 - 数量契约。 SAP SD学习笔记26 - 贩卖契约(框架协议)的概要&#xff0c;基本契约 - 数量契约-CSDN博客 本章继续讲SAP中的内容&#xff1a; - 基本契约 - 金额契约…

mysql之基本select语句 运算符 排序分页

1.SQL的分类 DDL:数据定义语言. CREATE ALTER DROP RENAME TRUNCATE DML: 数据操作语言. INSERT DELETE UPDATE SELECT 重中之重 DCL: 数据控制语言. COMMIT ROLLBACK SAVEPOINT GRANT REVOKE 2.SQL语言的规则与规范 1.基本规则 SQL可以在一行或多行,为了提高可…