QXlsx是Qt导出带样式Excel的最可行方案,纯C++跨平台,支持.xlsx格式及字体、边框、背景色等基础样式,无需Office环境。

Qt 本身不支持直接生成带样式的 Excel 文件
Qt 的 QTableWidget 或 QTableView 只能导出纯文本(如 CSV),没有内置能力写入 .xlsx 文件并保留字体、边框、背景色等样式。想导出带样式的 Excel,必须借助第三方库或系统级组件。
最常用且稳定的选择是:QXlsx 库(纯 C++ 实现,无需 Office 环境,跨平台,支持 .xlsx 格式和基础样式);其次是 COM(仅 Windows)、libreoffice SDK(重且复杂)或调用外部命令(不可靠)。QXlsx 是实际项目中最可行的路径。
用 QXlsx 导出带样式的表格数据
QXlsx 提供 Document、Worksheet、Format 等类,可逐单元格写入 + 设置样式。注意它不读取 Qt 视图控件的样式,需手动映射。
-
QXlsx::Document构造后,用addSheet()获取QXlsx::Worksheet* - 用
write(row, col, value)写入内容(行/列从 1 开始计数) - 用
QXlsx::Format设置字体、对齐、边框、背景色,再传给write(row, col, value, format) - 表头建议单独设置加粗+背景色,正文可统一设置边框(
setBorderStyle()配合setBorderColor())
示例片段(导出 QTableWidget 内容并设表头样式):
立即学习“C++免费学习笔记(深入)”;
QXlsx::Document xlsx;
QXlsx::Worksheet *sheet = xlsx.addSheet("Data");
QXlsx::Format headerFmt;
headerFmt.setFontBold(true);
headerFmt.setPatternBackgroundColor(QColor("#e0e0e0"));
headerFmt.setHorizontalAlignment(QXlsx::Format::AlignHCenter);
for (int col = 0; col < table->columnCount(); ++col) {
QString text = table->horizontalHeaderItem(col)->text();
sheet->write(1, col + 1, text, headerFmt); // 行号从 1 起
}
QXlsx::Format cellFmt;
cellFmt.setBorderStyle(QXlsx::Format::BorderThin);
for (int row = 0; row < table->rowCount(); ++row) {
for (int col = 0; col < table->columnCount(); ++col) {
QTableWidgetItem *item = table->item(row, col);
QString text = item ? item->text() : "";
sheet->write(row + 2, col + 1, text, cellFmt); // 表头占第 1 行
}
}
xlsx.saveAs("output.xlsx");
常见样式失效原因和绕过方式
QXlsx 的样式能力有限:不支持合并单元格后整体设背景、不支持条件格式、不支持 Excel 函数。某些样式(如渐变填充、阴影)根本无法写入。
- 边框只支持单线型(
BorderThin/BorderMedium),无法设上下左右独立边框 —— 只能靠多次write()覆盖相邻单元格来模拟 - 字体大小单位是“点”,但中文显示可能偏小,建议显式调用
setFontPointSize(10) - 背景色设为透明(
QColor(Qt::transparent))会写成白色,需用setPatternBackgroundColor(QColor())清空 - 导出含中文的 Excel 时,务必确认构建 QXlsx 时启用了 UTF-8 支持(默认已开),否则乱码
QXlsx 编译与链接注意事项
QXlsx 是 header-only 库,但部分功能(如 ZIP 压缩)依赖 zlib。Windows 下若用 MSVC,容易因运行时库不一致导致崩溃。
- 推荐使用
qmake直接包含源码:include(path/to/QXlsx/src/xlsx/qxlsx.pri) - 若用 CMake,需确保
zlib已找到(find_package(ZLIB)),否则导出大文件会失败 - Qt6 用户注意:QXlsx 官方尚未完全适配 Qt6,需打补丁(主要是
QTextCodec替换为QStringDecoder)或改用 fork 版本(如QXlsx-Qt6) - 不要把 QXlsx 的
.cpp文件直接拖进 Qt Creator 工程 —— 它内部有模板特化,必须按 pri/cmake 方式集成
样式不是“自动继承”的,每一处格式都要显式指定;导出性能随行数增长明显下降,超过 5000 行建议分页或禁用边框批量写入。


















