C++读写Excel(xlnt库的使用)

扫测资讯 2024-03-11 06:07   1049 0

一、简介

官网:https://github.com/tfussell/xlnt
Cross-platform user-friendly xlsx library for C++11+

xlnt is a modern C++ library for manipulating spreadsheets in memory and reading/writing them from/to XLSX files as described in ECMA 376 4th edition. The first public release of xlnt version 1.0 was on May 10th, 2017. Current work is focused on increasing compatibility, improving performance, and brainstorming future development goals. For a high-level summary of what you can do with this library, see the feature list. Contributions are welcome in the form of pull requests or discussions on the repository’s Issues page.

xlnt 是一个现代 C++ 库,用于在内存中操作电子表格,并按照 ECMA 376 第 4 版中的描述,从 XLSX 文件中读取/写入电子表格。xlnt 1.0 版本于 2017 年 5 月 10 日首次公开发布。目前的工作重点是增强兼容性、提高性能,以及集思广益制定未来的开发目标。

二、基本用法

1. 生成excel

#include <xlnt/xlnt.hpp>

int main()
{
    xlnt::workbook wb;
    xlnt::worksheet ws = wb.active_sheet();
    ws.cell("A1").value(5);				// 写入数值
    ws.cell("B2").value("string data");	// 写入字符串
    ws.cell("C3").formula("=RAND()");	// 写入公式
    ws.merge_cells("C3:C4");			// 合并C3:C4单元格
    ws.freeze_panes("B2");				// 冻结B2
    wb.save("example.xlsx");
    return 0;
}

2. 读取指定表单

xlnt::workbook wb;
wb.load("example.xlsx"); // 加载 Excel 文件

// 通过名称获取指定的工作表
xlnt::worksheet ws = wb.sheet_by_title("Sheet1");
// xlnt::worksheet ws = wb.sheet_by_title(u8"中文");

// 也可以通过索引获取指定的工作表,索引从 0 开始
// xlnt::worksheet ws = wb.sheet_by_index(0);
// xlnt::worksheet ws = wb.sheet_by_id(0);


std::cout << "正在读取工作表: " << ws.title() << std::endl;

3. 读取指定单元格

// 读取 A1 单元格的值
auto cell_value = ws.cell("A1").value();
auto cell_value = ws.cell(xlnt::cell_reference(1, 1)).value();
auto cell_value = ws.cell(1, 1).value();

4. 获取行数或列数

// 获取所有行
auto rows = ws.rows();
// 计算行数
std::size_t row_count = std::distance(rows.begin(), rows.end());

// 获取所有列
auto columns = ws.columns();
// 计算行数
std::size_t row_count = std::distance(columns.begin(), columns.end());

5. 读取指定范围

#include <xlnt/xlnt.hpp>
#include <iostream>
#include <vector>

int main() {
    xlnt::workbook wb;
    wb.load("example.xlsx"); // 加载 Excel 文件

    auto ws = wb.active_sheet();

    std::vector<std::string> row_data;

    // 读取第1行的数据
    for (const auto& cell : ws.range("1:1")) {
        row_data.push_back(cell.to_string());
    }

    // 打印第1行的数据
    for (const auto& data : row_data) {
        std::cout << data << " ";
    }
	
	// 打印所有行
	for (auto row : ws.rows(true)) { // or false, see above
    	for (auto cell : row) { // no need for reference, cell/row are just wrappers around pointers
        // the following are three different ways to print the content of the cell
        	std::cout << cell.value<std::string>() << std::endl; // write the text content of the cell
        	std::cout << cell.value<double>() << std::endl; // write the number content of the cell
        	std::cout << cell.to_string() << std::endl; // convert to a string according to number formatting
    	}
	}
    return 0;
}

6. 设置属性

// 设置表单名称
ws.title("test");

// 设置单元格文本的属性
ws.cell("A1").font(xlnt::font().color(xlnt::color::red()));
ws.cell("A1").font(xlnt::font().name("SimSun"));
ws.cell("A1").font(xlnt::font().bold(true));
ws.cell("A1").font(xlnt::font().size(13));

// 同时设置单元格的多个属性
ws.cell("A1").font(xlnt::font()
	.color(xlnt::color::green())
	.name("SimSun")
	.bold(true)
	.size(20));

// 设置单元格的背景颜色为绿色
ws.cell("A1").fill(xlnt::fill::solid(xlnt::color::green()));
ws.cell("A2").fill(xlnt::fill::solid(xlnt::rgb_color(0, 255, 0)));

// 设置行高(1.5发布版不可用, 如需使用此功能,需修改源代码再编译)
ws.row_properties(1).height = 30;	// 设置第1行高度为30 
// 设置列宽
ws.column_properties(1).width = 20; // 设置第1列宽度为20

// 设置对齐方式
cell.alignment(xlnt::alignment().horizontal(xlnt::horizontal_alignment::center));
cell.alignment(xlnt::alignment().vertical(xlnt::vertical_alignment::top));


// 合并C3:C4单元格
ws.merge_cells("C3:C4");

三、进阶用法

1. xlsx表格与xlnt库对象关系

xlsx对象 xlnt对象 说明
表格文件 xlnt::workbook
表单 xlnt::worksheet 表单的标题在最下面
行row row_t 从1开始
列column column_t 从A开始
单元cell xlnt::cell 包含内容和字体等属性

https://www.cpp-prog.com/编程/xlnt/