libxlsxwriter生成带样式的xlsx文件最直接:需用lxw_format对象定义字体、颜色、边框等样式,再传给写入函数;合并单元格须先write_blank占位再merge_range;中文需确保utf-8编码且避免bom。

用 libxlsxwriter 生成带样式的 xlsx 文件最直接
libxlsxwriter 是 C++ 里生成 Excel(.xlsx)最轻量、最可控的方案,不依赖 COM、Java 或系统 Excel 程序,纯 C 实现但提供 C++ 封装接口。它不读取文件,只写;不支持公式计算或图表,但样式(字体、颜色、边框、合并单元格、数字格式)全支持。
常见错误是误选 libxl 或 libxls:前者是商业闭源库(C++ 接口好但需授权),后者只读 .xls(旧格式)。libxlsxwriter 是 MIT 开源,编译后仅一个静态库,libxlsxwriter.a 或 libxlsxwriter.lib,无运行时依赖。
- Windows 下推荐用 CMake + Visual Studio 编译源码,避免 MinGW 兼容问题
- Linux/macOS 直接
make && sudo make install即可,头文件在/usr/local/include/xlsxwriter.h - 使用前必须调用
lxw_workbook_new()创建工作簿,不能只 new 一个对象就开写
设置字体、背景色和边框要用 format 对象
所有样式必须通过 lxw_format 对象定义,再传给 lxw_worksheet_write_string() 等写入函数。不能像 Python 的 openpyxl 那样链式调用,也不能复用 format 对象修改属性——每个 lxw_format_new() 返回独立实例,改了就得重设。
例如加粗红色字体+灰色背景+双下边框:
lxw_format *fmt = lxw_format_new(); lxw_format_set_bold(fmt); lxw_format_set_font_color(fmt, LXW_COLOR_RED); lxw_format_set_bg_color(fmt, LXW_COLOR_GRAY_25); lxw_format_set_bottom(fmt, 2); // 2 表示双线 lxw_worksheet_write_string(worksheet, 0, 0, "Header", fmt);
-
LXW_COLOR_*是预定义宏,不是字符串,填"red"会静默失败 - 边框类型(
set_top/set_left等)和线型(1=实线,2=双线,3=虚线)要分开设,不设默认为 0(无边框) - 数字格式如货币、日期要用
lxw_format_set_num_format(fmt, "#,##0.00"),格式字符串遵循 Excel 规则,非 printf 风格
合并单元格必须用 write_blank + set_merge_range
libxlsxwriter 没有直接的 “merge_cells” 函数。正确做法是:先用 lxw_worksheet_write_blank() 写一个空值占位,再用 lxw_worksheet_merge_range() 指定范围并绑定 format。
比如合并 A1:C1 并应用标题样式:
lxw_worksheet_write_blank(worksheet, 0, 0, "", fmt); lxw_worksheet_merge_range(worksheet, 0, 0, 0, 2, "Total", fmt);
- 四个坐标参数顺序是
first_row, first_col, last_row, last_col,不是左上+宽高 - 合并后内容必须传给
merge_range,不能传给write_blank,否则内容不显示 - 如果只调用
merge_range不配write_blank,Excel 打开会报“已修复文档错误”,内容丢失
中文乱码要关掉 UTF-8 BOM 并确认 locale
默认生成的文件是 UTF-8 编码,但 Excel for Windows 对无 BOM 的 UTF-8 支持差,常显示方块。解决方法不是加 BOM(libxlsxwriter 不支持),而是改用系统本地编码(如 GB2312)——但这需要手动转码,且跨平台不可靠。更稳的方式是:保持 UTF-8,但确保写入前字符串已正确转换,且 Excel 启动时使用 UTF-8 兼容模式(Win10+ 默认开启)。
- Linux/macOS 下一般无问题;Windows 用户若看到乱码,先检查是否用
std::string直接传入含中文的字面量(GCC/Clang 默认 UTF-8,MSVC 默认 GBK) - CMake 中对 MSVC 加
/utf-8编译选项,或用u8"中文"前缀保证字面量编码 - 绝对不要用
setlocale(LC_ALL, "")试图干预,libxlsxwriter 内部不依赖 locale
样式逻辑本身不复杂,但 format 生命周期、合并单元格的两步约束、以及编码隐含路径,是实际集成时最容易卡住的三个点。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











