如何通过C++ 写入数据到Excel 表格

 更新时间:2026年07月23日 08:56:53   作者:deepseek  
本文基于Spire.XLS for C++ 库,系统讲解从环境集成到各类数据写入的完整技术实现,覆盖单单元格写入、批量数据填充、样式格式化等核心场景,感兴趣的朋友跟随小编一起看看吧

一、概述

在 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 接口为桥梁,动态调用 ApplicationWorkbookWorksheetRange 等对象的方法与属性。

核心技巧-:

若要填充多单元格区域,而无需一次填充一个单元格,可以将 Range 对象的 Value 属性设置为二维数组。同样,也可以使用 Value 属性一次性检索多个单元格的二维值数组。

基本步骤(参考):

  • 创建 Excel 自动化客户端
  • 导入 Excel 类型库(如 excel.exe 或 mso.dll
  • 由编译器自动生成智能指针包装类(如 _ApplicationPtr_WorkbookPtr_WorksheetPtrRangePtr
  • 通过智能指针调用 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++ 写入数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解数组指针与指针数组的区别

    深入理解数组指针与指针数组的区别

    本篇文章是对数组指针与指针数组的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 生成随机数rand函数的用法详解

    生成随机数rand函数的用法详解

    本篇文章是对生成随机数rand函数的用法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++编译器Clion的使用详解(总结)

    C++编译器Clion的使用详解(总结)

    Clion有一个比较让人郁闷的地方就是必须要把编译环境配置好了,IDE才去做代码分析等动作,但是还是有很多优点,本文重点给大家介绍C++编译器Clion的使用,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • C++ DFS算法实现走迷宫自动寻路

    C++ DFS算法实现走迷宫自动寻路

    这篇文章主要为大家详细介绍了C++ DFS算法实现走迷宫自动寻路,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++设计模式之观察者模式(Observer)

    C++设计模式之观察者模式(Observer)

    这篇文章主要为大家详细介绍了C++设计模式之观察者模式Observer,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • C语言超详细讲解队列的实现及代码

    C语言超详细讲解队列的实现及代码

    队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。在队尾添加元素,在队头删除元素
    2022-04-04
  • C++中set/multiset与map/multimap的使用详解

    C++中set/multiset与map/multimap的使用详解

    这篇文章主要为大家详细介绍了C++中set/multiset与map/multimap的使用,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02
  • C语言结构体的一些理解

    C语言结构体的一些理解

    这篇文章主要给大家介绍了关于C语言结构体的一些理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • c语言snprintf函数的用法详解

    c语言snprintf函数的用法详解

    这篇文章主要给大家介绍了关于c语言snprintf函数用法的相关资料,snprintf()函数用于将格式化的数据写入字符串,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • C++程序设计-五子棋

    C++程序设计-五子棋

    本文将以简单的存储结构及简单的运算,条件语句,分支语句,循环语句结合,带来一个双人对战版五子棋,这是一个简单的模型,实现了五子棋最最基本的功能。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02

最新评论