Qt 5.12 上读取 .xlsx 文件(Windows 平台)

news2025/6/8 1:41:40

推荐最优方案:使用 QXlsx 库

QXlsx 是一个基于 Qt 的开源库,专门用于读写 .xlsx 文件,适用于 Qt 5.12,且无需依赖 Microsoft Excel 或 COM 对象。以下是其优势与实现步骤:

优势
  1. 跨平台:QXlsx 不依赖 Microsoft Excel,支持 Windows、Linux 和 macOS。
  2. 轻量高效:直接操作 .xlsx 文件(基于 XML 格式),避免 COM 对象的性能瓶颈。
  3. 易于集成:QXlsx 可以作为 Qt 项目的一部分直接嵌入,无需额外的动态链接库。
  4. MIT 许可证:开源且使用灵活,适合商业和非商业项目。
  5. 维护活跃:QXlsx 是 QtXlsxWriter 的后继者,社区维护较好。
安装与配置
  1. 下载 QXlsx
    • 从 GitHub 下载 QXlsx 源代码:https://github.com/QtExcel/QXlsx。
    • 确保使用与 Qt 5.12 兼容的版本(QXlsx 支持 Qt 5 和 6)。
  2. 构建与集成
    • 将 QXlsx 源代码放入项目目录或单独编译为静态库。
    • 在 Qt 项目 .pro 文件中添加:

       

      include(path_to_QXlsx/QXlsx.pri)

    • 如果使用静态库,需先运行 qmake 和 make(Windows 上使用 mingw32-make)编译 QXlsx。
  3. 依赖
    • 确保 Qt 5.12 已安装,包含 QtCore 和 QtGui 模块。
    • 无需额外安装 Microsoft Office 或 ODBC 驱动。
示例代码

以下是一个简单的读取 .xlsx 文件的示例:

 

#include <QCoreApplication>
#include <QDebug>
#include "xlsxdocument.h"

using namespace QXlsx;

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 加载 .xlsx 文件
    Document xlsxR("example.xlsx");
    if (!xlsxR.load()) {
        qDebug() << "Failed to load Excel file.";
        return -1;
    }

    // 读取特定单元格(例如 A1)
    QVariant value = xlsxR.read("A1");
    qDebug() << "Cell A1:" << value.toString();

    // 遍历整个工作表
    int maxRow = xlsxR.dimension().rowCount();
    int maxCol = xlsxR.dimension().columnCount();
    for (int row = 1; row <= maxRow; ++row) {
        for (int col = 1; col <= maxCol; ++col) {
            Cell* cell = xlsxR.cellAt(row, col);
            if (cell) {
                qDebug() << QString("Cell(%1,%2): %3").arg(row).arg(col).arg(cell->readValue().toString());
            }
        }
    }

    return app.exec();
}
性能注意事项
  • 小型文件:QXlsx 能快速处理小型 .xlsx 文件(几百行)。
  • 大型文件:对于大文件(例如上千行),QXlsx 可能因内存占用较高而变慢。建议分块读取或优化代码,避免一次性加载整个文件。
  • 调试:如遇到崩溃(例如处理大文件),使用调试器检查内存分配问题,避免手动删除 QXlsx::Document 管理的单元格指针。

其他方案对比

1. 使用 QODBC

通过 ODBC 驱动读取 .xlsx 文件,利用 Microsoft Access Database Engine。

优点

  • 简单,代码量少。
  • 支持 .xls 和 .xlsx 格式。
  • 适合快速查询特定范围的数据。

缺点

  • 依赖 Microsoft Access Database Engine(需单独安装)。
  • Windows 专用,无法跨平台。
  • 对复杂 .xlsx 文件的支持有限,可能因数据类型不一致导致丢失数据。
  • 存在已知的 ODBC 驱动 bug(例如 FirstRowHasNames 设置问题)。

示例代码

 

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>

int main() {
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "xlsx_connection");
    db.setDatabaseName("DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\\path\\to\\file.xlsx");
    if (db.open()) {
        QSqlQuery query("SELECT * FROM [Sheet1$]", db);
        while (query.next()) {
            qDebug() << query.value(0).toString();
        }
        db.close();
        QSqlDatabase::removeDatabase("xlsx_connection");
    } else {
        qDebug() << "Failed to open database.";
    }
    return 0;
}

适用场景:需要快速读取小型表格,且目标机器已安装 Excel 或 Access Database Engine。

2. 使用 ActiveX (QAxObject)

通过 ActiveX 访问 Microsoft Excel 的 COM 接口。

优点

  • 直接调用 Excel 的完整功能,适合复杂操作(如格式处理)。
  • 适合 Windows 平台,且 Excel 已安装。

缺点

  • 依赖 Microsoft Excel,需安装 Office。
  • Windows 专用,无法跨平台。
  • 性能较慢,尤其是处理大量数据时(例如上千行可能需要数秒)。
  • 可能产生“僵尸进程”问题,需确保正确关闭 Excel 实例。

示例代码

 

#include <QAxObject>
#include <QDebug>

int main() {
    QAxObject* excel = new QAxObject("Excel.Application");
    QAxObject* workbooks = excel->querySubObject("Workbooks");
    QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", "C:\\path\\to\\file.xlsx");
    QAxObject* sheets = workbook->querySubObject("Worksheets");
    QAxObject* sheet = sheets->querySubObject("Item(int)", 1);

    QAxObject* usedRange = sheet->querySubObject("UsedRange");
    int rows = usedRange->querySubObject("Rows")->property("Count").toInt();
    int cols = usedRange->querySubObject("Columns")->property("Count").toInt();

    for (int row = 1; row <= rows; ++row) {
        for (int col = 1; col <= cols; ++col) {
            QAxObject* cell = sheet->querySubObject("Cells(int,int)", row, col);
            qDebug() << cell->dynamicCall("Value()").toString();
        }
    }

    workbook->dynamicCall("Close()");
    excel->dynamicCall("Quit()");
    delete excel;
    return 0;
}


​

适用场景:需要调用 Excel 的高级功能(如宏或复杂格式),且目标机器已安装 Excel。

3. 使用第三方库(xlnt 或 libxlsxwriter)
  • xlnt:跨平台的 C++ 库,QXlsx 内部使用 xlnt 作为后端。
  • libxlsxwriter:专注于写 .xlsx 文件,但读支持有限。

优点

  • 跨平台,适合多平台开发。
  • 不依赖 Excel。

缺点

  • 集成到 Qt 需要额外配置(例如 Qxlnt 辅助项目)。
  • 相比 QXlsx,直接使用 xlnt 的 API 较复杂,学习曲线陡峭。

适用场景:需要高度定制化的 .xlsx 文件处理,且不希望依赖 QXlsx。

4. 使用 Qt 的 XML 处理

.xlsx 文件本质上是 ZIP 压缩的 XML 文件,可以用 Qt 的 QXmlStreamReader 解析。

优点

  • 无需第三方库,完全依赖 Qt。
  • 适合简单的数据提取。

缺点

  • 需要手动解析 XML 结构,代码复杂且易出错。
  • 不适合复杂 .xlsx 文件(例如包含公式或格式)。

适用场景:文件结构简单,且仅需提取少量数据。


为什么推荐 QXlsx?

  • 跨平台性:无需依赖 Excel 或 ODBC,适合多平台部署。
  • 易用性:API 简单,集成方便,文档和示例丰富。

  • 性能:对于中小型文件(<1000 行),性能良好;大型文件需优化读取逻辑。
  • 维护性:QXlsx 是 QtXlsxWriter 的活跃分支,社区支持较好。

注意事项

  1. 环境配置
    • 确保 Qt 5.12 安装正确,包含 qmake 和 mingw32-make(Windows)。
    • 如果使用 MinGW 编译器,可能需安装 Perl(如 Active Perl)以构建 QXlsx。
  2. 大文件优化
    • 对大文件,建议分块读取(如逐行或指定范围)。
    • 避免频繁创建/销毁 QXlsx::Document 对象。
  3. 调试
    • 如果遇到崩溃,使用调试器检查内存分配或文件路径问题。
    • 确保 .xlsx 文件格式正确,避免损坏文件导致加载失败。

总结

在 Qt 5.12 上读取 .xlsx 文件,QXlsx 是最优选择,因其跨平台、易用性和无需外部依赖的特性。相比 QODBC 和 ActiveX,QXlsx 避免了 Windows 专属依赖和性能瓶颈,适合大多数场景。如果需要处理复杂文件或高级功能,可考虑 ActiveX,但需权衡性能和依赖问题。

如果您有特定需求(例如文件大小、是否只读、跨平台要求),可以进一步提供细节,我可以为您调整方案!

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

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

相关文章

虚拟机CentOS 7 网络连接显示“以太网(ens33,被拔出)“、有线已拔出、CentOS7不显示网络图标

文章目录 一、问题描述二、解决方法1、查看网络连接方式2、开启相关服务3、确认虚拟机网络连接 一、问题描述 问题描述&#xff1a;在VmWare中安装CentOS7, 启动后界面不显示网络的图标。 在GONE桌面—》设置中找到网络设置&#xff0c;发现显示线缆已拔出。 二、解决方法 …

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(六):图片上传交互功能

在 《Tailwind CSS 实战&#xff1a;基于 Kooboo 构建 AI 对话框页面&#xff08;五&#xff09;》 中&#xff0c;完成了语音交互功能的优化。本文作为该系列教程的第六篇&#xff0c;将聚焦于图片上传功能的开发。通过集成图片上传与预览能力&#xff0c;我们将进一步完善 AI…

传统的将自然语言转化为嵌入向量的核心机制是:,将离散的语言符号转化为连续的语义向量,其核心依赖“上下文决定语义”的假设和神经网络的特征提取能力。

传统的将自然语言转化为嵌入向量的核心机制是:,将离散的语言符号转化为连续的语义向量,其核心依赖“上下文决定语义”的假设和神经网络的特征提取能力。 传统的将自然语言转化为嵌入向量(Word Embedding)的核心机制是分布式语义假设(Distributional Semantics Hypothesis…

玄机-日志分析-IIS日志分析

1.phpstudy-2018站点日志.(.log文件)所在路径&#xff0c;提供绝对路径 2.系统web日志中状态码为200请求的数量是多少 3.系统web日志中出现了多少种请求方法 4.存在文件上传漏洞的路径是什么(flag{/xxxxx/xxxxx/xxxxxx.xxx} 5.攻击者上传并且利用成功的webshell的文件名是什…

【办公类-104-01】20250606通义万相50分一天用完,通义万相2.1专业版测试

背景需求&#xff1a; 昨天打开通义万相&#xff0c;发现分数降低到3位数&#xff0c;原来时1500.仔细看&#xff0c;原来每天的50分&#xff0c;只有1天有效期了。 用掉试试&#xff0c;用的是之前的30天积分&#xff0c;还是今天的1天积分 纯白色背景&#xff0c;卡通简笔画…

制作个人Github学术主页

1.fork一个模板 从模板网站Jekyll Themes fork一个模板&#xff0c;并在repository name里填入yourname.github.io 2.生成自己的site 按顺序点击以下按钮&#xff0c;修改Branch为master /root 然后点击save &#xff0c;等待一会后刷新&#xff0c;便会生成一个新的site。 3.…

FineReport模板认证找不到模板

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1.现象及排查过程2. 解决办法 1.现象及排查过程 FR模板认证下面找不到模板 由于是集群部署的FR&#xff0c;所以后台查看了sftp服务器&#xff0c;测试连接&#xff0c;连接成功。 但是…

TomatoSCI数据分析实战:探索社交媒体成瘾

今天我们尝试对一份社交媒体成瘾的调查数据进行几项简单的分析&#xff0c;看看可以得出哪些有意思的结论&#xff1f;图1A是这份数据的说明&#xff0c;因为篇幅太长只把部分数据贴出来&#xff08;图1B&#xff09;。 01 不同性别的成瘾程度会不同吗&#xff1f; 我们使用bo…

网络安全厂商F5推出AI Gateway,化解大模型应用风险

AI正以前所未见的速度重塑数字化体验。然而&#xff0c;企业在加速落地现代化数字体验的过程中&#xff0c;其在保障和交付AI应用方面仍面临严峻挑战。这些应用需处理海量数据&#xff0c;涉及复杂流量模式&#xff0c;并引入更高级的安全威胁&#xff0c;而企业当前的安全能力…

pikachu靶场通关笔记16 CSRF关卡02-CSRF(POST)

目录 一、CSRF原理 二、源码分析 三、渗透实战 1、构造CSRF链接 &#xff08;1&#xff09;登录 &#xff08;2&#xff09;bp设置inception on &#xff08;3&#xff09;修改个人信息 &#xff08;4&#xff09;构造CSRF链接 2、模拟受害者登录 3、诱导受害者点击 …

中医的十问歌和脉象分类

中医核心理论框架如下 诊断技术如下 本文主要介绍问诊和切诊。 十问歌的“十”是虚指&#xff0c;实际包含12个核心问题&#xff0c;脉象28种中常见仅10余种&#xff0c;重点解释脉诊的物理本质&#xff08;血流动力学触觉感知&#xff09; 以下是中医十问歌的完整内容及脉…

构建 MCP 服务器:第 4 部分 — 创建工具

这是我们构建 MCP 服务器的四部分教程的最后一部分。在第一部分中&#xff0c;我们使用基本资源创建了第一个 MCP 服务器。第二部分添加了资源模板并改进了代码组织。在第三部分中&#xff0c;我们添加了提示符并进一步完善了服务器结构。现在&#xff0c;我们将通过添加工具来…

如何以 9 种方式将照片从手机传输到笔记本电脑

使用 USB 电缆可以将照片从智能手机复制到计算机。但是&#xff0c;如果没有 USB 数据线&#xff0c;如何将照片从手机无线传输到笔记本电脑呢&#xff1f;为了解决这个问题&#xff0c;我们搜索并测试了不同的应用程序&#xff0c;然后总结了本指南中分享的 9 个有效选项。您可…

生成JavaDoc文档

生成 JavaDoc 文档 1、快速生成 文档 注解 2、常见的文档注解 3、脚本生成 doc 文档 4、IDEA工具栏生成 doc 文档 第一章 快速入门 第01节 使用插件 在插件工具当中&#xff0c;找到插件 javaDoc 使用方式&#xff0c;在代码区域&#xff0c;直接点击右键。选择 第02节 常用注…

Web后端基础(Maven基础)

https://blog.csdn.net/q20202828/article/details/148459525?spm1001.2014.3001.5501 这是我总结了一下aliyun私服maven依赖配置Maven 3.9.1下载安装的操作 Maven的作用 统一项目结构 Maven 还提供了标准、统一的项目结构 。 1). 未使用Maven 由于java的开发工具呢&#x…

set map数据结构

#include <set> #include <iostream> using namespace std;int main() {// 设置控制台输出编码为UTF-8system("chcp 65001");set<int> s1; // 创建一个整数集合// 插入元素s1.insert(5);s1.insert(3);s1.insert(7);s1.insert(1);s1.insert(9);//默…

面试题小结(真实面试)

面试题 1.call与apply的区别2.vue3的响应式原理3.js的垃圾回收机制4.说说原型链5.什么是防抖和节流6.说一下作用域链7.在一个页面加载数据时&#xff08;还没加载完成&#xff09;&#xff0c;切换到另一个页面&#xff0c;怎么暂停之前页面的数据加载。 浏览器自动中止机制 这…

计算机网络领域所有CCF-A/B/C类期刊汇总!

本期小编统计了【计算机网络】领域CCF推荐所有期刊的最新影响因子&#xff0c;分区、年发文量以及投稿经验&#xff0c;供大家参考&#xff01; CCF-A类 1 IEEE Journal on Selected Areas in Communications 【影响因子】13.8 【期刊分区】JCR1区&#xff0c;中科院1区TOP …

有意向往gis开发靠,如何规划学习?

听说GIS开发工资不错、还不像互联网那么卷&#xff1f;心动了&#xff1f;但一看那些“WebGL”、“空间分析”、“OGC规范”的词儿就头大&#xff1f;别急&#xff01; 今天咱就聊聊零基础/转行选手&#xff0c;咋规划学习GIS开发这条路。不整高大上&#xff0c;就讲实在的&am…

五、查询处理和查询优化

五、查询处理和查询优化 主要内容 查询概述查询处理过程关系操作的基本实现算法查询优化技术代数优化基于存取路径的优化基于代价估算的优化 1. 查询概述 查询是数据库管理系统中使用最频繁、最基本的操作&#xff0c;对系统性能有很大影响。 对于同一个SQL查询&#xff0c…