c++标准库无法直接读取.xlsx文件,因其本质是zip压缩的xml结构,需用xlnt等第三方库解析;fstream只能读取二进制乱码,无法自动解压、解析xml及重建单元格关系。

C++ 标准库不支持直接读取 Excel 文件,必须借助第三方库或系统级接口。没有“开箱即用”的方案,硬要用 fstream 读 .xlsx 只会得到乱码或 ZIP 解压失败错误。
为什么不能像 CSV 那样用 std::ifstream 直接读 .xlsx
.xlsx 实质是 ZIP 压缩包,内部包含 XML 文件(如 xl/worksheets/sheet1.xml)、样式表、共享字符串等。直接用 std::ifstream 读取只会拿到二进制流,解析需手动解压 + XML 解析 + 关系重建 —— 工程量远超实际需求。
- 常见错误现象:
std::ifstream读出全是不可见字符,getline()立即失败,failbit被置位 - 即使强行用
zlib解压,也得处理 OPC(Open Packaging Conventions)目录结构和 XML 命名空间,极易漏掉sharedStrings.xml导致文本显示为索引数字(如显示5而非"销售额") - Excel 的公式、日期序列、合并单元格、样式引用等逻辑,标准 C++ 完全不感知
推荐方案:用 libxlsxwriter(只写)还是 libxls(只读旧格式)?
二者都不满足“读取现代 Excel(.xlsx)”需求:libxlsxwriter 是纯写入库,无读取能力;libxls 仅支持老式 .xls(BIFF8 格式),对 .xlsx 返回 ERR_FILE_FORMAT 错误。
- 若你确定文件来源固定为 Excel 2003 或更早,且无需公式求值,
libxls可用,但已多年未更新,Windows 上需手动编译.lib -
libxlsxwriter名字有误导性 —— 它连read函数都没有,调用xlsx_open_workbook()会编译报错 - 真正能读
.xlsx的主流 C++ 库只有:libxlsxio(轻量,C 接口)、xlnt(现代 C++17,头文件为主)、libxml2+minizip自研(复杂度高,仅建议已有 ZIP/XML 处理经验者)
xlnt 读取 .xlsx 的最小可行代码及坑点
xlnt 是目前最接近“开箱即读”的选择,支持读写、公式计算(基础)、日期自动转换,但需注意其默认行为与 Excel UI 不一致的地方:
#include <xlnt>
#include <iostream>
int main() {
try {
xlnt::workbook wb;
wb.load("data.xlsx"); // 不支持中文路径(Windows 下需先转 UTF-8 → GBK 或用 _wfopen)
auto ws = wb.active_sheet();
// 注意:行/列索引从 1 开始,不是 0!
for (size_t row = 1; row
<ul>
<li>依赖项:CMake 构建时需链接 <code>libxml2</code> 和 <code>minizip</code>,macOS 上用 <code>brew install libxml2 minizip</code>,Windows 上推荐 vcpkg:<code>vcpkg install xlnt</code>
</li>
<li>空单元格默认返回空字符串,但 <code>cell.data_type()</code> 可区分是空还是 0 / false / ""</li>
<li>公式单元格默认返回计算结果(<code>cell.value()</code>),若要原始公式字符串,得用 <code>cell.formula()</code>,但需确保工作簿启用公式计算(<code>wb.calculate_formulae(true)</code>)</li>
<li>不支持密码保护的 Excel 文件 —— 会直接抛 <code>std::runtime_error</code>,错误信息为 <code>"Encrypted files are not supported"</code>
</li>
</ul>
<h3>绕过 C++ 直接读取的务实替代路径</h3>
<p>如果项目允许松动技术栈边界,比硬啃 <code>xlnt</code> 编译问题更省时的方案是让 Excel 自己“导出中间格式”:</p>
<ul>
<li>用 Excel 手动另存为 <code>.csv</code>(注意编码:Windows 记事本默认 ANSI,应选 UTF-8 带 BOM,否则中文乱码)</li>
<li>用 PowerShell 脚本批量转:<code>Import-Excel data.xlsx | Export-Csv data.csv -Encoding UTF8</code>(需安装 <code>ImportExcel</code> 模块)</li>
<li>在 C++ 中调用系统命令执行转换(Linux/macOS 用 <code>libreoffice --convert-to csv data.xlsx</code>;Windows 可调用 <code>excel.exe /e /c "SaveAs"</code> 宏,但需 Office 安装)</li>
<li>若数据源可控,改由上游系统直接输出 JSON/CSV,彻底避开 Excel 解析</li>
</ul>
<p>真正麻烦的从来不是“怎么读”,而是“谁来保证 Excel 文件结构稳定”——合并单元格、空行、多表头、注释行、隐藏列,这些在 Excel 里点几下就能生成的结构,在代码里都需要显式判断和容错。没人工校验的 Excel 自动化,迟早会在某次财务同事多加一列后崩掉。</p></iostream></xlnt>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











