c++如何读取excel文件_libxl或OpenXLSX库入门教程【进阶】

风辰同学_7662

风辰同学_7662

2026-04-08

814人浏览

原创

用libxl读excel前须确认文件为真excel:.xlsx需microsoft生成且文件头为50 4b 03 04,.xls仅支持原生二进制;openxlsx不支持.xls,且默认不加载单元格值,需判类型再取值。

c++如何读取excel文件_libxl或openxlsx库入门教程【进阶】

libxl 读 Excel 前先确认你拿的是不是「真 Excel」

很多用户一上来就报错:Invalid file format 或直接崩溃,根本没走到读取逻辑。原因往往是:你手里的 .xlsx 文件其实是 WPS 保存的“伪 xlsx”(底层是 zip + xml,但结构不标准),或是从网页导出的 .xls 实际是 HTML 表格伪装的。libxl 只支持原生二进制 .xls(Excel 97–2003)和部分兼容的 .xlsx(需 Microsoft Excel 2007+ 生成)。OpenXLSX 则**完全不支持 .xls**,只处理标准 OOXML 格式。

实操建议:

  • file your.xlsx(Linux/macOS)或 PowerShell 中 Get-Item your.xlsx | Get-Content -Encoding Byte -TotalCount 8 | ForEach-Object { $_.ToString("X2") } 检查文件头 —— 真正的 .xlsx 开头应为 50 4B 03 04(即 PK..)
  • 用 Excel 重新「另存为」一次,格式选「Excel Workbook (*.xlsx)」,不要选「Excel 97–2003 Workbook」或「严格 Open XML」
  • libxl 的免费版(libxl.dll/.so)不支持密码保护、公式计算、条件格式;商用才解锁 —— 别在 demo 阶段误以为是代码问题

OpenXLSX 读取时为什么 worksheet.cell("A1").value() 返回空?

OpenXLSX 默认不加载单元格值,只解析结构。它把数值、字符串、公式、空单元格统一抽象为 XLCell,但 .value() 只对「已显式存储内容」的单元格有效。常见空返回场景:单元格是公式但没预计算、是空样式占位符、或被设置为「null value」(如导出工具写入的空字符串但标记为类型 XLValueType::empty)。

实操建议:

  • 先用 cell.valueType() 判断类型:XLValueType::emptyXLValueType::stringXLValueType::number 等,再决定怎么取值
  • 公式单元格需手动触发计算:workbook.calculateFormulae()(仅限简单公式,不支持宏或外部引用)
  • 读字符串推荐用 cell.value<:string>()</:string> 而非 cell.value(),后者返回 std::any,类型擦除后容易丢精度或抛 bad_any_cast
  • 别依赖 worksheet.dimension() 获取最大行列 —— 它返回的是「已使用区域」,但 Excel 允许中间留空行/列;稳妥做法是遍历 worksheet.rows() 或按业务逻辑限定范围

libxl 里 sheet->readStr()sheet->readNum() 怎么选?

libxl 不做类型自动推断。同一个单元格,用错读取函数会返回 0 或空指针,且不报错。比如一个显示为 "123" 的文本型数字,用 readNum() 得到 0;而真实数字 123.45readStr() 会得到 "123.45"(注意小数点),但若单元格格式设为「整数」,可能返回 "123" —— 这取决于 Excel 内部存储方式,不是显示格式。

C++
C++

"空空如也"

下载

实操建议:

  • 优先用 sheet->cellType(row, col) 获取类型:XL_CELL_NUMBERXL_CELL_STRINGXL_CELL_BOOLEANXL_CELL_BLANK
  • 对疑似数字文本(如身份证、订单号),一律用 readStr(),避免截断或科学计数法变形(例如 "12345678901234567890"readNum() 会变成 1.23457e+19
  • readNum() 返回 double,但 Excel 存储精度只有 15 位有效数字 —— 别指望它还原完整 18 位银行卡号
  • 中文路径或含 Unicode 表名需用 UTF-8 编码传入 book->getSheet() ,否则返回 nullptr(libxl Windows 版对宽字符支持弱)

两个库都绕不开的内存与异常细节

OpenXLSX 使用 RAII,但 XLDocument 构造失败(如文件损坏)不会抛异常,默认静默失败;libxl 则全靠返回值和 book->errorCode()。两者都不自动释放工作表句柄,重复打开同一文件不报错,但可能读到旧缓存。

实操建议:

  • OpenXLSX 必须检查 doc.open("a.xlsx") == XLDocument::ErrorCode::Success,不能只看构造是否完成
  • libxl 中 Book* 创建后,必须配对调用 book->release(),否则 Windows 下 DLL 句柄泄漏,多次运行后报 ERROR_TOO_MANY_OPEN_FILES
  • 多线程读同一文件?OpenXLSX 不是线程安全的 —— 每个线程必须独立 XLDocument 实例;libxl 的 Book* 实例也不可跨线程共享
  • 大文件(>10MB)慎用 OpenXLSX 的 doc.saveAs(),它会全量重写 ZIP —— 如只需读,用 doc.load() 后别调 saveAs

最常被跳过的一步:关掉杀毒软件实时扫描。libxl 和 OpenXLSX 在加载瞬间会高频访问 ZIP 内部文件,某些国产杀软会拦截并伪造空文件流,导致读出来全是空值 —— 换台干净机器试一次,往往就定位了。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

WPS零基础入门到精通全套教程!
WPS零基础入门到精通全套教程!

全网最新最细最实用WPS零基础入门到精通全套教程!带你真正掌握WPS办公! 内含Excel基础操作、函数设计、数据透视表等

下载

相关标签:

c++ c++入门教程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5139

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

509

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1638

6

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

2025.12.04

698

13

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1569

3

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.06.27

1191

7

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

3944

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

5037

7

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2024.11.28

2262

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习