使用 oosxl 高效读写 Excel 文件

6 阅读5分钟

使用 oosxl 高效读写 Excel 文件

在软件开发中,Excel 文件的读写与操作已成为许多应用程序不可或缺的功能。一个简洁高效、易于集成的库显得尤为重要。oosxl 提供了一套轻量、跨平台且功能完备的 Excel 文件操作解决方案,无需安装 Microsoft Excel,即可轻松处理 .xlsx 格式的文件。

通过本文,你将了解 oosxl 的核心特性、快速上手指南以及应用示例。


1. oosxl 是什么?

oosxl 是一个用 C++ 实现的 Excel 文件读写库,不依赖 Excel 或其他外部组件,可在 Windows、Linux、macOS 等多个平台上运行,具备简单易用、高效可靠、易于集成等特点。开发者可以在应用程序中使用 C/C++ 及其他编程语言集成 oosxl,实现对 Excel 文件的灵活控制。

oosxl 既适合个人开发者和小规模项目,也能满足企业级应用中对 Excel 集成的高性能需求。

主要特点:

  • 跨平台支持:支持 Windows、macOS 和 Linux 等多种操作系统及架构。
  • 多语言支持:原生 C/C++ 实现,支持多种编程语言绑定。
  • 无外部依赖:无需 Microsoft Excel 或其他第三方库。
  • 高性能:高速读写、低内存占用,适合处理大型 Excel 文件。
  • 功能丰富:满足多样的 Excel 操作需求,包括:
    • 读写 .xlsx 格式文件
    • 同时操作多个文档
    • 单元格支持文本、数字、布尔值、日期等多种数据类型
    • 样式自定义(字体、颜色、边框、对齐方式、数字格式等)
    • 支持公式嵌入
    • 支持插入 PNG、JPG 等图片
    • 提供工作表保护功能
    • 优化算法,适合处理大数据集

性能指标:

  • 在 3.7 GHz CPU 上,每秒可写入超过 8,000,000 个数字单元格。
  • 读取一个 100 万行、22 列的 Excel 文件,内存占用仅约 121 MB(视文件内容会有浮动)。

2. 下载 oosxl

2.1 下载步骤

  1. 访问 oosxl 官方网站 下载对应平台的压缩包。
  2. 解压到指定目录。

2.2 目录结构(以 oosxl 1.0.0 为例)

oosxl-platform-1.0.0/
├── doc/           # 文档(可打开 html 文件查看)
├── examples/      # 多语言示例代码
└── oosxl/         # 库文件及 C/C++ 头文件

2.3 示例代码说明

Python 和 Swift 示例已生成对应语言的 oosxl 库,可直接集成。虽然示例仅包含 C/C++、Python 和 Swift,但由于 oosxl 提供了 C 语言接口,因此也可在 C#、Fortran、Delphi 等其他语言中使用。


3. 快速开始(以 C++ 为例)

3.1 示例代码

以下代码演示了如何创建 Excel 文档、写入数据、设置公式和样式。

#include <iostream>
#include <vector>

// Step 1: 包含头文件
#include "oosxl.hxx"


using namespace oo;

int main()
{
    // Step 2: 创建空白文档
    Document* doc = create_document();
    if (!doc) {
        std::cout << "Error creating document: " << run_msg() << std::endl;
        return -1;
    }

    // Step 3: 获取工作簿
    Workbook* wb = doc->get_workbook();

    // Step 4: 添加工作表
    Worksheet* ws = wb->add_worksheet();
    
    // Step 5: 添加数据

    int row = 3, col = 3;

    // 设置标题
    std::vector<std::string> titles = {"Item", "Units", "Unit Cost", "Total"};
    for (int i = 0; i < titles.size(); ++i)
        ws->set_text(row, row + i, titles[i].c_str());

    // 第一列:商品名称
    std::vector<std::string> items = {"Baby doll", "Kite", "Toy guitar"};
    for (int i = 0; i < 3; ++i)
        ws->set_text(row + i, col, items[i].c_str());

    // 第二列:数量
    std::vector<int> units = {95, 60, 75};
    for (int i = 0; i < 3; ++i)
        ws->set_num(row + i, col + 1, units[i]);

    // 第三列:单价
    std::vector<double> costs = {1.99, 2.99, 6.99};
    for (int i = 0; i < 3; ++i)
        ws->set_num(row + i, col + 2, costs[i]);

    // 第四列:总价(公式)
    ws->set_formula(row, col + 3, "=D3*E3");
    ws->set_formula(row + 1, col + 3, "=D4*E4");
    ws->set_formula(row + 2, col + 3, "=D5*E5");

    // 合并单元格并设置 “总计” 标签
    ws->merge(row + 3, col, row + 3, col + 2);
    ws->set_text(row + 3, col, "Total");

    // 总计公式
    ws->set_formula(row + 3, col + 3, "=SUM(F3:F5)");

    // 设置边框样式
    Style* fmt = wb->get_named_style("normal");
    fmt->set_border(BORDERINDEX_EDGE, BORDER_THICK);
    fmt->set_border(BORDERINDEX_INSIDE, BORDER_THIN);
    ws->set_range_style(row, col, row + 3, col + 3, fmt);
    fmt->release();

    // Step 6: 保存文件
    if (!doc->save("example.xlsx"))
        std::cout << "Error saving file: " << run_msg() << std::endl;

    // Step 7: 释放内存
    doc->release();

    return 0;
}

3.2 编译说明

请参考压缩包中的 examples/c++/readme.txt 文件。

3.3 运行结果

生成的 example.xlsx 文件可使用 Excel 或 LibreOffice 打开,效果如下图所示:

picture1.png


4. 在项目中集成 oosxl

以 CMake 为例,集成 oosxl 非常简单:

cmake_minimum_required(VERSION 3.16)
project("examples")

set(CMAKE_CXX_STANDARD 17)

# 使用 find_package 的 CONFIG 模式
find_package(oosxl REQUIRED CONFIG PATHS ${CMAKE_CURRENT_SOURCE_DIR}/../.. NO_DEFAULT_PATH)

set(SRC_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")
include_directories("${SRC_ROOT}/include")

file(GLOB_RECURSE SOURCE "main/main.cpp" "src/*.cpp")

add_executable(${PROJECT_NAME} ${SOURCE})
target_compile_definitions(${PROJECT_NAME} PRIVATE PROJECT_ROOT_DIR="${CMAKE_SOURCE_DIR}")
target_include_directories(${PROJECT_NAME} PRIVATE include)
target_link_libraries(${PROJECT_NAME} oosxl::oosxl)

if (WIN32)
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OOSXL_DLL_PATH}" $<TARGET_FILE_DIR:${PROJECT_NAME}>
    )
endif()

5. 最佳实践建议

5.1 使用 run_msg() 调试错误

检查返回值并输出错误信息,便于定位问题。

Document* doc = load_document("path/to/file.xlsx");
if (!doc) {
    std::cerr << "Error: " << run_msg() << std::endl;
    return -1;
}

5.2 重复使用样式对象

一次定义样式,多处应用,提升性能。

Style* fmt = wb->cell_style(1, 1);
fmt->set_bold();
sheet->set_cell_style(1, 1, fmt);
sheet->set_cell_style(1, 2, fmt);

5.3 及时释放对象

使用完毕后调用 release() 释放不再使用的对象,优化内存使用。

Style* fmt = wb->get_named_style("normal");
fmt->set_bold();
sheet->set_cell_style(1, 1, fmt);
fmt->release();

6. 文件格式与功能限制

6.1 格式支持

目前仅支持 .xlsx 格式。

6.2 功能限制

部分 Excel 高级功能暂不支持,如:

  • 公式自动计算
  • 数据透视表
  • 图表操作
  • 部分较新功能

具体支持范围请参考官方文档。


7. 总结

oosxl 是一款专为 C++ 开发者设计的高性能 Excel 文件处理库,凭借其跨平台能力、无外部依赖、低内存占用以及对多种编程语言的良好支持,为个人项目与企业级应用提供了灵活可靠的解决方案。它支持 .xlsx 格式的读写、单元格样式定制、公式嵌入、图片插入、多文档操作等丰富功能,同时在处理大规模数据时仍能保持优异的性能表现。

通过简洁的 API 设计和详尽的示例代码,开发者可以快速上手并将 oosxl 无缝集成到现有项目中。无论是需要生成报表、导入导出数据,还是构建复杂的 Excel 交互功能,oosxl 都能显著降低开发成本,提升工作效率。

如果您正在寻找一个轻量、高效且易于维护的 Excel 操作工具,oosxl 无疑是一个值得认真考虑的选择。开始使用它,让 Excel 文件的处理变得更加简单、可靠。