0x34 颜色
你可以对表格的字体、边框、角以及列分隔符号设置它们的前景或背景颜色。
tabulate 支持 8 种颜色:
灰色 gray
红色 red
绿色 green
黄色 yellow
蓝色 blue
洋红色 magenta
青色 cyan
白色 white
可以通过 .format().<element>_color(颜色) 的方式定义前景色或通过 .format().<element>_background_color(颜色) 的方式定义背景色。
#include "tabulate/table.hpp" using namespace tabulate; using namespace std; int main() { Table colors; colors.add_row({"Font Color is Red", "Font Color is Blue", "Font Color is Green"}); colors.add_row({"Everything is Red", "Everything is Blue", "Everything is Green"}); colors.add_row({"Font Background is Red", "Font Background is Blue", "Font Background is Green"}); colors[0][0].format() .font_color(Color::red) .font_style({FontStyle::bold}); colors[0][1].format() .font_color(Color::blue) .font_style({FontStyle::bold}); colors[0][2].format() .font_color(Color::green) .font_style({FontStyle::bold}); colors[1][0].format() .border_left_color(Color::red) .border_left_background_color(Color::red) .font_background_color(Color::red) .font_color(Color::red); colors[1][1].format() .border_left_color(Color::blue) .border_left_background_color(Color::blue) .font_background_color(Color::blue) .font_color(Color::blue); colors[1][2].format() .border_left_color(Color::green) .border_left_background_color(Color::green) .font_background_color(Color::green) .font_color(Color::green) .border_right_color(Color::green) .border_right_background_color(Color::green); colors[2][0].format() .font_background_color(Color::red) .font_style({FontStyle::bold}); colors[2][1].format() .font_background_color(Color::blue) .font_style({FontStyle::bold}); colors[2][2].format() .font_background_color(Color::green) .font_style({FontStyle::bold}); cout << colors << endl; return 0; } |
0x35 边框、角
你可以对表格的边框和角的文本、颜色或背景颜色进行自定义。
你可以使用 .corner(..)、.corner_color(..) 和 corner_background_color(..) 来对所有的角设置一个共同的样式。你也可以使用 .border(..) 、.border_color(..) 和 .border_background_color(..) 来对所有的边框设置一个共同的样式。
这是一个单独设定所有边框和角的示例:
#include <tabulate/table.hpp> using namespace tabulate; int main() { Table table; table.add_row({"ᛏᚺᛁᛊ ᛁᛊ ᚨ ᛊᛏᛟᚱy ᛟᚠᚨ ᛒᛖᚨᚱ ᚨᚾᛞ\n" "ᚨ ᚹᛟᛚᚠ, ᚹᚺᛟ ᚹᚨᚾᛞᛖᚱᛖᛞ ᛏᚺᛖ\n"
"ᚱᛖᚨᛚᛗᛊ ᚾᛁᚾᛖ ᛏᛟ ᚠᚢᛚᚠᛁᛚᛚ ᚨ ᛈᚱᛟᛗᛁᛊᛖ\n"
"ᛏᛟ ᛟᚾᛖ ᛒᛖᚠᛟᚱᛖ; ᛏᚺᛖy ᚹᚨᛚᚲ ᛏᚺᛖ\n"
"ᛏᚹᛁᛚᛁᚷᚺᛏ ᛈᚨᛏᚺ, ᛞᛖᛊᛏᛁᚾᛖᛞ ᛏᛟ\n" "ᛞᛁᛊcᛟᚹᛖᚱ ᛏᚺᛖ ᛏᚱᚢᛏᚺ\nᛏᚺᚨᛏ ᛁᛊ ᛏᛟ cᛟᛗᛖ."}); table.format() .multi_byte_characters(true) // Font styling .font_style({FontStyle::bold, FontStyle::dark}) .font_align(FontAlign::center) .font_color(Color::red) .font_background_color(Color::yellow) // Corners .corner_top_left(" ") .corner_top_right(" ") .corner_bottom_left(" ") .corner_bottom_right(" ") .corner_top_left_color(Color::cyan) .corner_top_right_color(Color::yellow) .corner_bottom_left_color(Color::green) .corner_bottom_right_color(Color::red) // Borders .border_top(" ") .border_bottom(" ") .border_left(" ") .border_right(" ") .border_left_color(Color::yellow) .border_right_color(Color::green) .border_top_color(Color::cyan) .border_bottom_color(Color::red); std::cout << table << std::endl; return 0; } |
0x36 基于范围的迭代
一个一个设置表格的样式是不是很麻烦?tabulate 提供了迭代器,支持对表、行和列的迭代,更方便地格式化表格。
#include <tabulate/table.hpp> using namespace tabulate; int main() { Table table; table.add_row({"Company", "Contact", "Country"}); table.add_row({"Alfreds Futterkiste", "Maria Anders", "Germany"}); table.add_row({"Centro comercial Moctezuma", "Francisco Chang", "Mexico"}); table.add_row({"Ernst Handel", "Roland Mendel", "Austria"}); table.add_row({"Island Trading", "Helen Bennett", "UK"}); table.add_row({"Laughing Bacchus Winecellars", "Yoshi Tannamuri", "Canada"}); table.add_row({"Magazzini Alimentari Riuniti", "Giovanni Rovelli", "Italy"}); // 设置每一行的宽度 table.column(0).format().width(40); table.column(1).format().width(30); table.column(2).format().width(30); // 遍历第一行中的单元格 for (auto& cell : table[0]) { cell.format() .font_style({FontStyle::underline}) .font_align(FontAlign::center); } // 遍历第一列中的单元格 for (auto& cell : table.column(0)) { if (cell.get_text() != "Company") { cell.format() .font_align(FontAlign::right); } } // 遍历表格中的行 size_t index = 0; for (auto& row : table) { row.format() .font_style({FontStyle::bold}); // 轮流把整行的背景设为蓝色 if (index > 0 && index % 2 == 0) { for (auto& cell : row) { cell.format() .font_background_color(Color::blue); } } index += 1; } std::cout << table << std::endl; } |
0x37 嵌套表格
在 tabulate 中嵌套表格很容易,因为 Table.add_row(...) 这个函数可以接受 std::string 类型和 tabulate::Table。下面是一个嵌套表格的例子:
#include "tabulate/table.hpp" using namespace tabulate; using namespace std; int main() { Table hellogithub; hellogithub.add_row({"HelloGitHub"}); hellogithub[0][0] .format() .font_background_color(Color::blue) .font_align(FontAlign::center); Table hglink; hglink.add_row({"GitHub repo", "Website"}); hglink.add_row({"github.com/521xueweihan/HelloGitHub", "hellogithub.com"}); hellogithub.add_row({hglink}); // 嵌套! cout << hellogithub << endl; return 0; } |
0x40 导出
0x41 Markdown
可以使用 MarkdownExporter 来将一个表格导出为 GFM 风格的 Markdown。
#include "tabulate/markdown_exporter.hpp" // 注意这个头文件 #include "tabulate/table.hpp" using namespace tabulate; using namespace std; int main() { Table hellogithub; hellogithub.add_row({"HelloGitHub"}); hellogithub[0][0].format().font_style({FontStyle::bold}); // 加粗样式,在 Markdown 中可以表现出来 hellogithub.add_row({"GitHub repo: github.com/521xueweihan/HelloGitHub"}); hellogithub.add_row({"Website: hellogithub.com"}); // 导出为 Markdown MarkdownExporter exporter; auto markdown = exporter.dump(hellogithub); cout << hellogithub << endl << endl; cout << "Markdown Source:\n\n" << markdown << endl; return 0; } |
导出效果如下:
HelloGitHub GitHub repo: github.com/521xueweihan/HelloGitHub Website: hellogithub.com |
注意:Markdown 不能指定每一个单元格的对齐样式,只能指定一列的对齐样式,像这样 hg.column(1).format().font_align(FontAlign::center);。
0x50 尾声
如果想要更详细地了解 tabulate 的用法,请查看官方文档 https://github.com/p-ranav/tabulate 。
本文是作者的第一次关于此类型文章的尝试,如有不足之处,请指正,谢谢!
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。