当前位置: 首页 > article >正文

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
主要复制这四个内容
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.kler.cn/a/500870.html

相关文章:

  • Codeforces Round 995 (Div. 3)【题解】D ~ G
  • EasyExcel(二)导出Excel表自动换行和样式设置
  • Python实现windows自动关机
  • 为AI聊天工具添加一个知识系统 开发环境准备
  • 【经典神经网络架构解析篇】【1】LeNet网络详解:模型结构解析、优点、实现代码
  • 3298. 统计重新排列后包含另一个字符串的子字符串数目 II
  • el-date-picker 禁用一个月前、一个月后(当天之后)的时间 datetimerange
  • ssh链接飞牛NAS的时候出现WARNING提示无法正常登录!按照这个可以解决
  • 数据结构与算法之二叉树: LeetCode 700. 二叉搜索树中的搜索 (Ts版)
  • 【网络云SRE运维开发】2025第2周-每日【2025/01/10】小测-【第10章 ACL理论和实操考试】解析
  • Golang——channel
  • DS内排—堆排序
  • LeetCode 521最长特殊序列
  • 【STM32-学习笔记-3-】TIM定时器
  • 【C++开源库】Boost.Asio网络库使用介绍
  • 大模型训练(2):内存开销
  • 网络安全-网站协议请求报文(基础篇)
  • NVIDIA Clara平台助力医学影像处理:编程案例与实践探索(下)
  • Word表格内容批量写入Excel
  • 动态规划【打家劫舍】
  • 【python爬虫入门教程13--selenium的自动点击 --小小案例分享】
  • 挖掘用户价值:链动2+1模式、AI智能名片与S2B2C商城小程序的应用研究
  • tensor core实现flash_attn_mma_share_kv源码分析
  • WebSocket、SSE(Server-Sent Events)、HTTP 和 Axios关系总结
  • openEuler安装docker
  • 做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)