使用 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 下载步骤
- 访问 oosxl 官方网站 下载对应平台的压缩包。
- 解压到指定目录。
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 打开,效果如下图所示:
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 文件的处理变得更加简单、可靠。