小白很容易挖一个技术的坑,然后填得特别慢。这不,libxlsxwriter这样一个很实用的工具,小白从开始研究到第二次接触已经有两个多月的时间。今天为了写一个测试工具,想要通过代码自动生成结果数据表格,又开始临时使用这个库,深感它的强大。于是想到什么就记录点什么,因此有了本篇博客。
1 libxlsxwriter之合并单元格
小白今天遇到的一个问题是如何进行单元格的合并。其实在libxlsxwriter的文档页上,有一系列的例程,其中有一篇例程,名为merge_range.c
。小白相信这则例程已经很完整地演示了如何进行单元格的合并以及合并后单元格的格式设置。因此小白把关键注释写入代码,分享如下:
#include "xlsxwriter.h"
int main() {
lxw_workbook* workbook = workbook_new("merge_range.xlsx");
lxw_worksheet* worksheet = workbook_add_worksheet(workbook, NULL);
lxw_format* merge_format = workbook_add_format(workbook);
/* 为合并后的单元格文本指定一种格式. */
format_set_align(merge_format, LXW_ALIGN_CENTER); // 水平居中
format_set_align(merge_format, LXW_ALIGN_VERTICAL_CENTER); // 垂直居中
format_set_bold(merge_format); // 字体加粗
format_set_bg_color(merge_format, LXW_COLOR_YELLOW); // 黄色底色背景
format_set_border(merge_format, LXW_BORDER_THIN); // 细边框
/* 出于强调的考虑增大合并后单元格的大小. */
worksheet_set_column(worksheet, 1, 3, 12, NULL); // 指定第1到第3列的单元格列宽为12
worksheet_set_row(worksheet, 3, 30, NULL); // 指定第3行的行高为30
worksheet_set_row(worksheet, 6, 30, NULL); // 指定第6行的行高为30
worksheet_set_row(worksheet, 7, 30, NULL); // 指定第7行的行高为30
// 注意是从第0列开始计算
/* 从第3行第1列到第3行第3列进行合并,合并后按照merge_format格式设置单元格. */
worksheet_merge_range(worksheet, 3, 1, 3, 3, "Merged Range", merge_format);
/* 从第6行第1列一直到第7行第3列进行合并,合并后按照merge_format格式设置单元格. */
worksheet_merge_range(worksheet, 6, 1, 7, 3, "Merged Range", merge_format);
workbook_close(workbook);
return 0;
}
如图所示为上述代码的效果,其中红色的字和箭头是小白标注的3行1列的位置。合并单元格的核心函数就是worksheet_merge_range
函数,参数中首先指定表格名称,然后是合并的起始位置、终点位置,填充进合并单元格中的内容,以及单元格的格式。
设置单元格格式的有关函数均以format_set_**
为前缀。
2. 富文本合并单元格
另一个例程,名为merge_rich_string.c
,也值得顺带学习一下,与上一个例程不同的是,这个例程演示了如何在一个合并后的单元格内实现多种字体格式的混编。
#include "xlsxwriter.h"
int main() {
lxw_workbook* workbook = workbook_new("merge_rich_string.xlsx");
lxw_worksheet* worksheet = workbook_add_worksheet(workbook, NULL);
/* 为合并后的单元格指定一种格式 */
lxw_format* merge_format = workbook_add_format(workbook);
format_set_align(merge_format, LXW_ALIGN_CENTER); // 水平居中
format_set_align(merge_format, LXW_ALIGN_VERTICAL_CENTER); // 垂直居中
format_set_border(merge_format, LXW_BORDER_THIN); // 细边框
/* 为富文本设置格式类型. */
lxw_format* red = workbook_add_format(workbook);
format_set_font_color(red, LXW_COLOR_RED); // 红色字体
lxw_format* blue = workbook_add_format(workbook);
format_set_font_color(blue, LXW_COLOR_BLUE); // 蓝色字体
/* 为富文本创建不同的片段 */
lxw_rich_string_tuple fragment1 = { NULL, "This is " };
lxw_rich_string_tuple fragment2 = { red, "red" };
lxw_rich_string_tuple fragment3 = { NULL, " and this is " };
lxw_rich_string_tuple fragment4 = { blue, "blue" };
// 合并整段文本(带格式)
lxw_rich_string_tuple* rich_string[] = { &fragment1, &fragment2,
&fragment3, &fragment4, NULL };
/* 合并单元格,此处用空字符串先暂时填充. */
worksheet_merge_range(worksheet, 1, 1, 4, 3, "", merge_format);
/* 覆写合并单元格中的内容,使用富文本字符串填充. */
worksheet_write_rich_string(worksheet, 1, 1, rich_string, merge_format);
workbook_close(workbook);
return 0;
}
该例程生成的表格结果如图所示。可以看到这种方式可以组合出比较复杂的显示效果。
今天分享就到这里,虽然简单,但是也算有点用。