一、概述
在 c++ 开发场景中,程序化生成与写入 excel 文档是企业级应用的常见需求,涵盖报表导出、数据归档、自动化报告生成等领域。然而,标准 c++ 本身并不具备直接读写 excel 文件的能力——.xlsx 文件本质上是 zip 封装的 xml 结构,无法通过标准 fstream 库直接解析。因此,开发者必须借助第三方库或平台特定的 api 来实现这一功能。
根据项目需求、平台环境和预算约束,目前主流的技术方案可分为以下几类:
- 开源第三方库(跨平台、免费、功能各异)
- 商业第三方库(功能完善、技术支持、需付费)
- com 接口(windows 平台、依赖 office、功能全面)
- csv 等替代格式(轻量方案、无需额外依赖)
二、开源第三方库方案
开源库是目前 c++ 开发者操作 excel 最常用的方案,具有跨平台、免费、社区活跃等优势。
2.1 xlnt
xlnt 是一个基于 c++14 的开源库,用于创建、操作和读写 excel 文件,支持 .xlsx 格式-。其设计以零依赖架构和跨平台支持为特色。
安装方式(windows 下使用 vcpkg):
vcpkg install xlnt
基本用法示例:
#include <xlnt/xlnt.hpp>
void export_data(const std::string &file_path) {
// 创建一个新的工作簿
xlnt::workbook wb;
// 获取当前活动工作表
xlnt::worksheet ws = wb.active_sheet();
// 向单元格写入数据
ws.cell("a1").value("hello");
ws.cell("b1").value("world");
ws.cell("a2").value(42);
ws.cell("b2").value(3.14);
// 保存工作簿
wb.save(file_path);
}xlnt 支持 c++11 及以上版本,适合需要读写双向操作且对依赖项有严格要求的项目。
2.2 openxlsx
openxlsx 是一个开源、轻量级、跨平台的 c++ 库,专为高效、无依赖地读写符合 office open xml(ooxml)标准的 excel 文件(.xlsx 格式)而设计-。其核心设计理念是 “零外部运行时依赖” ——不依赖 microsoft com。
该库采用 c++17 标准,提供现代化的 c++ 接口,支持 unicode 文本、公式、单元格格式等高级功能。注意:openxlsx 项目已从 github 迁移至 codeberg。
安装方式(linux/macos):
git clone https://github.com/troldal/openxlsx.git cd openxlsx mkdir build && cd build cmake .. && make sudo make install
windows 下使用 vcpkg:
vcpkg install openxlsx
基本用法示例:
#include <openxlsx.hpp>
int main() {
// 创建新的 excel 文件
openxlsx::xldocument doc;
doc.create("example.xlsx");
// 获取工作表
auto wks = doc.workbook().worksheet("sheet1");
// 写入数据
wks.cell("a1").value() = "hello, openxlsx!";
wks.cell("b1").value() = 42;
// 保存文件
doc.save();
return 0;
}编译命令:
g++ -std=c++17 -o converter main.cpp -lopenxlsx
openxlsx 适合需要完整读写功能且追求轻量无依赖的现代 c++ 项目。但需要注意,它不支持旧的 .xls 格式,也不支持公式计算-。
2.3 libxlsxwriter
libxlsxwriter 是一个用于生成 excel xlsx 文件的 c 语言库(可在 c++ 项目中使用),支持丰富的格式化选项、公式、图表等功能,且无需依赖 microsoft excel。
关键特点:
- 纯 c 编写,跨平台,零依赖(仅需 zlib)
- 只写(write-only) ,不支持读取或修改现有文件
- 流式写入,适合百万行级大数据量导出-
- 需调用
lxw_workbook_close()才能生成完整文件
基本用法示例(参考-):
#include <xlsxwriter.h>
int main() {
lxw_workbook *workbook = workbook_new("output.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, null);
worksheet_write_string(worksheet, 0, 0, "hello", null);
worksheet_write_number(worksheet, 1, 0, 123.45, null);
workbook_close(workbook);
return 0;
}libxlsxwriter 适合只需要导出数据、追求高性能和轻量级的场景。
2.4 其他开源库
- xlsxio:支持读取和写入
.xlsx文件,功能较全,适合中小型项目 - simplexlsxwriter:轻量、易用,适合简单的读写需求
- excelformat:功能丰富,支持创建、读写 excel 文件,可写入文本、数字、日期等多种类型数据
三、商业第三方库方案
对于企业级项目,商业库通常提供更完善的功能、更稳定的性能和专业技术支持。
3.1 aspose.cells for c++
aspose.cells for c++ 是一个原生 c++ 库,使 c++ 开发人员能够以编程方式创建、操作和转换电子表格,无需 office 自动化或 microsoft excel 应用程序。
支持格式-:
- ms excel 97-2003(xls)
- ms excel 2007-2013/2016(xlsx、xlsm、xlsb 等)
- open office xml 等
基本用法(参考--):
// 创建 workbook 类的对象 // 将第一个工作表放入 worksheet 对象 // 使用 worksheet.getcells() 方法获取单元格 // 使用 cells.get() 方法访问目标单元格
3.2 spire.xls for c++
spire.xls for c++ 是一个专业的 excel c++ api,可用于在任何类型的 c++ 应用程序中创建、读取、写入和转换 excel 文件。
环境配置:
通过 nuget 包管理器安装:搜索 spire.xls.cpp 并安装。
核心对象模型:
workbook:表示整个 excel 工作簿,是操作的顶层入口worksheet:表示工作簿中的单个工作表cellrange:表示一个单元格或单元格区域
写入数据示例:
// 写入文本 worksheet->getrange(1, 1)->settext(l"姓名"); // 写入数值 worksheet->getrange(2, 2)->setnumbervalue(25);
批量写入:
spire.xls 提供了 worksheet->insertarray() 方法,可将 std::vector 中的数据一次性写入指定单元格范围,显著提升大批量数据写入的效率。
注意事项:
- 行号和列号均从 1 开始计数
- 所有文本参数需使用宽字符串类型(
l"..."或std::wstring) - 支持通过
excelversion枚举指定输出格式(.xls或.xlsx)
3.3 libxl
libxl 是 c++ 领域最成熟的商业级 excel 操作库之一(提供免费试用版与付费授权版),封装了对 .xls(biff8)和 .xlsx(office open xml)双格式的读写能力。
其 c++ api 设计简洁直观,支持单元格样式、公式、多工作表、字体颜色、合并单元格等高级功能。libxl 的最大优势是无需安装 microsoft office 或 .net framework。
四、com 接口方案(windows 平台)
如果项目运行在 windows 平台且已安装 microsoft office,可以使用 com(component object model)接口来操作 excel 文件。这需要使用 active template library(atl)或 microsoft foundation classes(mfc)等库与 com 接口交互。
技术原理-:
c++ 通过 com 机制启动 excel 进程(进程外服务器),以 idispatch 接口为桥梁,动态调用 application、workbook、worksheet、range 等对象的方法与属性。
核心技巧-:
若要填充多单元格区域,而无需一次填充一个单元格,可以将 range 对象的 value 属性设置为二维数组。同样,也可以使用 value 属性一次性检索多个单元格的二维值数组。
基本步骤(参考):
- 创建 excel 自动化客户端
- 导入 excel 类型库(如
excel.exe或mso.dll) - 由编译器自动生成智能指针包装类(如
_applicationptr、_workbookptr、_worksheetptr、rangeptr) - 通过智能指针调用 excel 对象的方法
注意事项:
- 必须安装 microsoft office(依赖 excel 应用程序)
- 适合需要完整 excel 功能(公式、图表、宏等)的场景
- 性能相对较低(进程间通信开销)
- 部署复杂(需确保目标机器安装有匹配版本的 office)
五、轻量替代方案:csv 格式
如果业务需求仅是导出结构化数据,而不强求 .xlsx 格式,csv(逗号分隔值)是最轻量的选择。
优势:
- 标准 c++ 的
fstream库即可处理,无需任何第三方依赖 - 文件体积小,通用性强(excel 可直接打开)
- 跨平台,无任何环境依赖
示例代码:
#include <fstream>
#include <vector>
#include <string>
void export_to_csv(const std::string& filename,
const std::vector<std::vector<std::string>>& data) {
std::ofstream file(filename);
for (const auto& row : data) {
for (size_t i = 0; i < row.size(); ++i) {
file << row[i];
if (i < row.size() - 1) file << ",";
}
file << "\n";
}
}六、方案选型建议
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| xlnt | 跨平台、需要读写、零依赖 | 开源免费、c++14、功能完善 | 仅支持 .xlsx |
| openxlsx | 现代 c++、轻量无依赖 | 开源、c++17、无 com 依赖 | 仅支持 .xlsx、不支持公式计算 |
| libxlsxwriter | 大数据量导出、仅需写入 | 高性能、流式写入、轻量 | 只写不读 |
| aspose.cells | 企业级、功能全面 | 功能最完善、多格式支持 | 需付费 |
| spire.xls | 企业级、易集成 | nuget 集成方便、功能完整 | 需付费 |
| com 接口 | windows + office 环境 | 功能最全、无需额外库 | 依赖 office、性能较低 |
| csv | 简单数据导出 | 零依赖、实现简单 | 功能有限、无格式 |
选型速查:
- 预算有限、需要读写 → xlnt 或 openxlsx
- 只需导出大量数据 → libxlsxwriter
- 企业级项目、预算充足 → aspose.cells 或 spire.xls
- windows 平台、已装 office → com 接口
- 仅需导出表格数据 → csv(最简单)
七、总结
c++ 写入 excel 表格并非原生支持的功能,但通过丰富的第三方库和平台 api,开发者可以根据具体需求选择最合适的方案。
从开源免费的 xlnt、openxlsx、libxlsxwriter,到功能完备的商业库 aspose.cells、spire.xls、libxl,再到 windows 平台原生的 com 接口,以及最简单的 csv 替代方案——每种技术路线都有其适用的场景和权衡。
在实际项目选型时,建议综合考虑以下因素:是否需要读取现有文件、数据量大小、跨平台需求、预算约束、是否依赖 office 环境等,选择最适合项目长期发展的方案。
到此这篇关于如何通过c++ 写入数据到excel 表格的文章就介绍到这了,更多相关c++ 写入数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论