1 小试牛刀
libxlsxwriter可以控制所生成表格中的字体格式。
我们首先来看一下libxlsxwriter官方提供的例程,小白将关键注释翻译出来:
#include "xlsxwriter.h"
int main() {
/* 生成一个新的数据表. */
lxw_workbook* workbook = workbook_new("format_font.xlsx");
/* 添加一个sheet. */
lxw_worksheet* worksheet = workbook_add_worksheet(workbook, NULL);
/* 增宽单元格的宽度 */
worksheet_set_column(worksheet, 0, 0, 20, NULL);
/* 添加一些格式 */
lxw_format* format1 = workbook_add_format(workbook);
lxw_format* format2 = workbook_add_format(workbook);
lxw_format* format3 = workbook_add_format(workbook);
/* 为格式1加粗字体. */
format_set_bold(format1);
/* 为格式2使用斜体. */
format_set_italic(format2);
/* 为格式3使用加粗斜体. */
format_set_bold(format3);
format_set_italic(format3);
/* 以三种格式书写文字 */
worksheet_write_string(worksheet, 0, 0, "This is bold", format1);
worksheet_write_string(worksheet, 1, 0, "This is italic", format2);
worksheet_write_string(worksheet, 2, 0, "Bold and italic", format3);
/* 关闭工作表,释放内存. */
workbook_close(workbook);
return 0;
}
生成的表格如下所示,可以看到这是默认的Calibri字体的粗体、意大利斜体、粗体加意大利斜体。
2 进阶
如果我们想使用其他的字体,例如中文字体,或者是自己安装的第三方变体,那么我们首先要弄清这些字体的英文名称。
分享以下博客给大家对照:CSS font-family 各名称一览表
小白写了以下一些典型中文字体,以及小白自己下载安装的阿里巴巴普惠体作为示例:
(出于中文显示的需要,使用了硬转码的方式,详情可参看小白的另一篇博客libxlsxwriter中文报错问题
#include "xlsxwriter.h"
#include <iostream>
#include <wchar.h>
#include <windows.h>
using std::string;
string GBKToUTF8(const char* strGBK)
{
int len = MultiByteToWideChar(CP_ACP, 0, strGBK, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, strGBK, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
string strTemp = str;
if (wstr) delete[] wstr;
if (str) delete[] str;
return strTemp;
}
int main()
{
lxw_workbook* workbook = workbook_new("hello_world.xlsx");
lxw_worksheet* worksheet = workbook_add_worksheet(workbook, NULL);
lxw_format* formatFont1 = workbook_add_format(workbook);
format_set_bold(formatFont1);
lxw_format* formatFont2 = workbook_add_format(workbook);
format_set_italic(formatFont2);
lxw_format* formatFont3 = workbook_add_format(workbook);
format_set_font_name(formatFont3, "Alibaba PuHuiTi");
lxw_format* formatFont4 = workbook_add_format(workbook);
format_set_font_name(formatFont4, "Alibaba PuHuiTi Heavy");
lxw_format* formatFont5 = workbook_add_format(workbook);
format_set_font_name(formatFont5, "SimHei");
lxw_format* formatFont6 = workbook_add_format(workbook);
format_set_font_name(formatFont6, "SimSun");
lxw_format* formatFont7 = workbook_add_format(workbook);
format_set_font_name(formatFont7, "Kaiti");
lxw_format* formatFont8 = workbook_add_format(workbook);
format_set_font_size(formatFont8, 16);
lxw_format* formatFont9 = workbook_add_format(workbook);
format_set_font_color(formatFont9, LXW_COLOR_RED);
/* 增宽单元格的宽度 */
worksheet_set_column(worksheet, 0, 0, 25, NULL);
worksheet_write_string(worksheet, 0, 0, GBKToUTF8("原始的字体").data(), NULL);
worksheet_write_string(worksheet, 1, 0, GBKToUTF8("加粗的字体").data(), formatFont1);
worksheet_write_string(worksheet, 2, 0, GBKToUTF8("意大利斜体").data(), formatFont2);
worksheet_write_string(worksheet, 3, 0, GBKToUTF8("阿里巴巴普惠体").data(), formatFont3);
worksheet_write_string(worksheet, 4, 0, GBKToUTF8("阿里巴巴普惠体Heavy").data(), formatFont4);
worksheet_write_string(worksheet, 5, 0, GBKToUTF8("黑体").data(), formatFont5);
worksheet_write_string(worksheet, 6, 0, GBKToUTF8("宋体").data(), formatFont6);
worksheet_write_string(worksheet, 7, 0, GBKToUTF8("楷体").data(), formatFont7);
worksheet_write_string(worksheet, 8, 0, GBKToUTF8("16号字体").data(), formatFont8);
worksheet_write_string(worksheet, 9, 0, GBKToUTF8("红色字体").data(), formatFont9);
workbook_close(workbook);
return 0;
}
上述代码中,核心就是
- 创建一个
lxw_format
格式对象 - 使用
format_set_font_name
设置字体名称 - 使用
format_set_font_size
设置字体大小 - 使用
format_set_font_color
设置字体颜色
上述代码的显示效果如下:
这样就基于libxlsxwriter实现了“字体自由”。