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

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

推荐最优方案:使用 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,但需权衡性能和依赖问题。

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

相关文章:

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

推荐最优方案&#xff1a;使用 QXlsx 库 QXlsx 是一个基于 Qt 的开源库&#xff0c;专门用于读写 .xlsx 文件&#xff0c;适用于 Qt 5.12&#xff0c;且无需依赖 Microsoft Excel 或 COM 对象。以下是其优势与实现步骤&#xff1a; 优势 跨平台&#xff1a;QXlsx 不依赖 Mic…...

虚拟机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…...

【前端】每日一道面试题6:解释Promise.any和Promise.allSettled的使用场景及区别。

Promise.any() 和 Promise.allSettled() 是 JavaScript 中用于处理异步操作的两种不同策略的 Promise 组合器&#xff0c;它们的核心区别在于逻辑目标与结果处理方式&#xff1a; 1. Promise.any() 使用场景&#xff1a; 需要获取 首个成功结果&#xff08;类似竞速成功优先&…...

wordpress+woocommerce电商平台搭建方案的优势分析

以下是WordPress WooCommerce电商平台搭建方案的优势分析&#xff1a; 技术架构与功能扩展优势 强大的插件生态系统&#xff1a;WordPress拥有超过58000个插件&#xff0c;WooCommerce作为其中最受欢迎的电商插件&#xff0c;提供了丰富的功能扩展选项&#xff0c;如支持超过…...

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

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

IDEA:配置 Git 需要完成 Git 路径设置、账号认证以及仓库关联三个主要步骤

一、验证 Git 是否已安装 检查 Git 版本&#xff08;Windows/Linux/Mac&#xff09;&#xff1a; 打开终端 / 命令提示符&#xff0c;输入&#xff1a; git --version若未安装&#xff0c;下载并安装 Git 二、在 IDEA 中配置 Git 路径 打开设置&#xff1a; Windows/Linux&a…...

PHP 复制商品扩展实操:轻松切换一号通、99api ,实现商品复制功能

目前已有一号通、99api复制商品扩展 复制商品扩展入口 namespace crmeb\services\copyproduct;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use think\facade\Config; use think\Container;/*** Class Product* package crmeb\services\copyp…...

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

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

Prompt Engineering Notes

TOC LLM output configurationOutput length LLM output configuration Output length 仅仅起到截断作用&#xff0c;不会让模型的输出更简洁。...

C++课设:学生成绩管理系统

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、项目功能概览1. 核心功能模块2. 系统特色亮点3. 完整代码4. 运行演示二、核心结构设计1. 系统架构设计2. Stud…...

制作个人Github学术主页

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

【Linux内核】设备模型之udev技术详解

目录 1. udev技术概述 2. 技术层次分析 2.1 内核层交互 2.2 规则引擎层 2.3 用户空间实现 3. 关键技术要点 3.1 动态设备节点管理 3.2 热插拔处理 3.3 模块化规则系统 3.3.1. 变量替换功能 3.3.2. 条件判断能力 3.3.3. 实现机制 3.3.4 应用场景 3.3.5 扩展能力 4…...

FineReport模板认证找不到模板

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

STM32实战:数字音频播放器开发指南

基于STM32的数字音频播放器/效果器是个很棒的项目&#xff01;这涉及到多个嵌入式开发的关键技术点。下面我为你拆解实现方案和关键学习内容&#xff1a; 系统架构概览 [SD Card] -> [File System (FATFS)] -> [Audio Decoder (WAV/MP3)] -> [DSP Processing (EQ, R…...

豆包和deepseek 元宝 百度ai区别是什么

豆包、DeepSeek、元宝和百度 AI 有以下区别&#xff1a; 开发公司 豆包5&#xff1a;由字节跳动公司基于云雀模型开发。DeepSeek4&#xff1a;是深度求索打造的开源多模态大模型。元宝1&#xff1a;是腾讯混元模型的落地产品&#xff0c;整合了 DeepSeek - R1 与混元模型。百…...

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、诱导受害者点击 …...

场景题-3

如何实现一个消息队列 拆解分析主流的几种消息队列 1、基本架构 生产者Producer、消费者Consumer、Broker&#xff1a;生产者发送消息&#xff0c;消费者接受消息&#xff0c;Broker是服务端&#xff0c;处理消息的存储、备份、删除和消费关系的维护。 主题和分区&#xff…...

Java 类型参数 T、R 、 O 、K、V 、E 、? 区别

在 Java 泛型和函数式编程中&#xff0c;T、R 和 O 都是类型参数&#xff08;Type Parameters&#xff09;&#xff0c;它们的主要区别在于命名约定和上下文含义&#xff0c;而不是语言层面的区别。它们可以互换使用&#xff0c;但通常遵循一定的命名习惯以提高代码可读性。 1.…...

中医的十问歌和脉象分类

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

C#封装HttpClient:HTTP请求处理最佳实践

C#封装HttpClient&#xff1a;HTTP请求处理最佳实践 在现代的.NET应用程序开发中&#xff0c;与外部服务进行HTTP通信是一项常见需求。HttpClient作为.NET框架中处理HTTP请求的核心组件&#xff0c;为我们提供了强大而灵活的API。然而&#xff0c;直接使用原生的HttpClient可能…...

前端基础之《Vue(19)—状态管理》

一、什么是状态管理 1、Vue版本问题 Vue2 Vuex3 Vue3 Vuex4 / Pinia2 在使用任何技术的时候&#xff0c;都先要去搜索一下版本&#xff0c;你的版本和脚手架环境是否兼容。 2、安装Vuex yarn add vuex3.6.2 3、状态管理 状态&#xff0c;在应用程序中表示数据&#xff0c…...

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

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

2.1 Windows编译环境介绍

一、Windows四个主要编译工具套件 MSVC&#xff1a;Windows原生编译套件&#xff0c;Microsoft Visual C&#xff0c;VS2019默认使用&#xff0c;编译生成原生Windows程序。Cygwin&#xff1a;不仅移植GCC&#xff0c;还移植了Linux命令&#xff08;如ls、mkdir、clear&#x…...

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

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

生成JavaDoc文档

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

八股学习-JS的闭包

一.闭包的定义 闭包是指函数和其周围的词法环境的引用的组合。 简单来说&#xff0c;就是函数可以记住并访问其在定义时的作用域内的变量&#xff0c;即使该函数在其它作用域调用。 也就是说&#xff0c;闭包让你可以在一个内层函数中访问到其外层函数的作用域。 function …...