应优先用CSV替代Excel:UTF-8+BOM编码,字符串加双引号,数值不加引号,nan/inf转空或"#N/A",Excel可直接打开且无依赖。

直接用C++写Excel文件?别费劲了
C++标准库不支持Excel格式(.xlsx),也没有内置的二进制规范解析能力。硬啃OOXML标准或用libzip+libxml2手动拼装,容易导出打不开的文件,调试成本远高于问题本身。真实项目里,99%的情况应该绕过“纯C++生成”,改用更稳的路径。
推荐方案:用CSV替代Excel,兼容性最好
Excel能直接双击打开.csv文件,且格式简单、无依赖、无编码陷阱(只要统一用UTF-8 + BOM)。适合导出二维数组(如std::vector<:vector>></:vector>):
- 每行数据用逗号分隔,字符串字段加英文双引号(防逗号/换行干扰)
- 中文必须写BOM头:
\xEF\xBB\xBF,否则Excel默认用GBK乱码
- 数值不用引号,
nan或inf要转成空字符串或"#N/A"避免Excel报错
std::ofstream f("data.csv", std::ios::binary);
f << "\xEF\xBB\xBF"; // UTF-8 BOM
for (const auto& row : data) {
for (size_t i = 0; i < row.size(); ++i) {
if (i > 0) f << ',';
if constexpr (std::is_same_v<decltype(row[i]), std::string>) {
f << '"' << row[i] << '"';
} else {
f << row[i];
}
}
f << '\n';
}
真要.xlsx?用现成C++库,但注意License和平台限制libxlsxwriter 是最轻量的选择(纯C,无依赖,MIT协议),但只支持写,不支持读;xlnt 功能全(支持样式、公式),但编译慢、Windows下需额外处理OpenSSL。
-
libxlsxwriter 导出二维数组示例:
- 必须先调用
lxw_workbook_new(),最后lxw_workbook_close(),漏掉就生成损坏文件
- 单元格写入用
lxw_worksheet_write_number()或write_string(),不能混用类型参数
- Linux/macOS默认没问题,Windows需确保链接
-lz(zlib)
-
xlnt 注意点:
C++ Code Review Master
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
下载
-
worksheet.cell("A1").value() = 3.14; 这种写法看着方便,但频繁调用性能差(内部有异常检查和类型推导)
- 中文路径在Windows下要用
std::filesystem::u8path()转UTF-8,否则save()静默失败
跨语言调用Python脚本是最省心的工程解
C++导出CSV后,用std::system()或popen()调用一行Python(要求目标机装了Python和pandas):
- Python侧只需三行:
import pandas as pd
df = pd.read_csv('data.csv')
df.to_excel('output.xlsx', index=False)
- 避开C++里处理字体、列宽、冻结窗格等Excel专属细节
- 缺点:强依赖Python环境;若需嵌入式或离线场景,此路不通
.csv文件,且格式简单、无依赖、无编码陷阱(只要统一用UTF-8 + BOM)。适合导出二维数组(如std::vector<:vector>></:vector>):
- 每行数据用逗号分隔,字符串字段加英文双引号(防逗号/换行干扰)
- 中文必须写BOM头:
\xEF\xBB\xBF,否则Excel默认用GBK乱码 - 数值不用引号,
nan或inf要转成空字符串或"#N/A"避免Excel报错
std::ofstream f("data.csv", std::ios::binary);
f << "\xEF\xBB\xBF"; // UTF-8 BOM
for (const auto& row : data) {
for (size_t i = 0; i < row.size(); ++i) {
if (i > 0) f << ',';
if constexpr (std::is_same_v<decltype(row[i]), std::string>) {
f << '"' << row[i] << '"';
} else {
f << row[i];
}
}
f << '\n';
}
真要.xlsx?用现成C++库,但注意License和平台限制libxlsxwriter 是最轻量的选择(纯C,无依赖,MIT协议),但只支持写,不支持读;xlnt 功能全(支持样式、公式),但编译慢、Windows下需额外处理OpenSSL。
-
libxlsxwriter 导出二维数组示例:
- 必须先调用
lxw_workbook_new(),最后lxw_workbook_close(),漏掉就生成损坏文件
- 单元格写入用
lxw_worksheet_write_number()或write_string(),不能混用类型参数
- Linux/macOS默认没问题,Windows需确保链接
-lz(zlib)
-
xlnt 注意点:
C++ Code Review Master
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
下载
-
worksheet.cell("A1").value() = 3.14; 这种写法看着方便,但频繁调用性能差(内部有异常检查和类型推导)
- 中文路径在Windows下要用
std::filesystem::u8path()转UTF-8,否则save()静默失败
跨语言调用Python脚本是最省心的工程解
C++导出CSV后,用std::system()或popen()调用一行Python(要求目标机装了Python和pandas):
- Python侧只需三行:
import pandas as pd
df = pd.read_csv('data.csv')
df.to_excel('output.xlsx', index=False)
- 避开C++里处理字体、列宽、冻结窗格等Excel专属细节
- 缺点:强依赖Python环境;若需嵌入式或离线场景,此路不通
libxlsxwriter 导出二维数组示例:
- 必须先调用
lxw_workbook_new(),最后lxw_workbook_close(),漏掉就生成损坏文件 - 单元格写入用
lxw_worksheet_write_number()或write_string(),不能混用类型参数 - Linux/macOS默认没问题,Windows需确保链接
-lz(zlib)
xlnt 注意点:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
worksheet.cell("A1").value() = 3.14;这种写法看着方便,但频繁调用性能差(内部有异常检查和类型推导) - 中文路径在Windows下要用
std::filesystem::u8path()转UTF-8,否则save()静默失败
std::system()或popen()调用一行Python(要求目标机装了Python和pandas):
- Python侧只需三行:
import pandas as pd df = pd.read_csv('data.csv') df.to_excel('output.xlsx', index=False) - 避开C++里处理字体、列宽、冻结窗格等Excel专属细节
- 缺点:强依赖Python环境;若需嵌入式或离线场景,此路不通
真正卡住人的往往不是“怎么写”,而是Excel对BOM、浮点精度、日期格式的隐式转换——比如12345678901234567导出后变成12345678901234500,这是Excel自动转成双精度导致的,得提前转成字符串再写。

















