优雅地使用 C++ 制作表格:tabulate

发表于:2020-2-26 11:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:削微寒    来源:博客园

  0x00 介绍 tabulate
  tabulate 是一个使用 C++ 17 编写的库,它可以制作表格。使用它,把表格对齐、格式化和着色,不在话下!你甚至可以使用 tabulate,将你的表格导出为 Markdown 代码。下图是一个使用 tabulate 制作的表格输出在命令行的样例:
  当然,除了表格,你还可以玩出花样。看见下面这个马里奥了吗?这也是用 tabulate 制作的!
  0x10 准备
  首先你需要安装 CMake。
  创建一个文件夹(下文用 X 代替),作为你使用 tabulate 的地方。再将 include 这个文件夹下载到 X 里。然后在 X 里创建 main.cpp 以及一个 CMakeLists.txt。
  注意:需要下载 include 整个文件夹而不是仅仅下载 tabulate 文件夹
  你可以点击 这里 下载 tabulate 项目,然后将 include 文件夹复制到 X 中。
  将下面的代码复制进 CMakeLists.txt :
cmake_minimum_required(VERSION 3.8)
# 这里的 tabulateDemo 可以换为你喜欢的名字
project(tabulateDemo)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
include_directories(include)
add_executable(main main.cpp)
  最后 X 文件夹的结构应该是这样的:
.
├── CMakeLists.txt
├── include
│   └── tabulate
└── main.cpp
  请认真核对好 X 的结构!
  可前往 ChungZH/tabulatedemo 核对文件结构。
  0x20 小试身手
  将下面这段代码复制进 main.cpp 中:
#include "tabulate/table.hpp"
using namespace std;
using namespace tabulate;
int main()
{
Table hellogithub; // 创建一个叫做 hellogithub 的 Table 对象
hellogithub.add_row({"HelloGitHub"});
hellogithub.add_row({"hellogithub.com"});
hellogithub[1][0].format()
.font_style({FontStyle::underline});
hellogithub.add_row({"github.com/521xueweihan/HelloGitHub"});
hellogithub[2][0].format()
.font_style({FontStyle::underline});
hellogithub.add_row({"xueweihan NB!!!"});
cout << hellogithub << endl;
return 0;
}
  如果你使用的是 Linux/MacOS 系统,请在终端进入 X 文件夹并输入以下命令:
mkdir build
cd build
cmake ..
make
./main
  如果你使用的是 Windows 系统和 MinGW,请检查是否安装 mingw32-make.exe,并在终端中进入 X 文件夹,输入:
mkdir build
cd build
cmake ..
mingw32-make
./main.exe
  如果你使用 Windows 以及 MSVC,在终端中输入:
mkdir build
cd build
cmake ..
  然后使用 Visual Studio 打开 build 文件夹下的 tabulateDemo.sln 来运行。
  如果没有问题,那么你应该会在终端里看到:
  0x30 格式化表格
  请先认真分析 0x20 小试身手 章节中的代码并尝试着修改一下它!
  0x31 Word Wrapping
  为了防止表格中的内容过长导致不整齐,你可以指定表格每一列的宽度,tabulate 就会自动帮你换行。语法如下:
// 将表格第 0 行第 0 列的宽度设为20
table[0][0].format().width(20);
  除了自动换行,你也可以在内容中使用 \n 来手动设置换行。
  这是一个 Word Wrapping 的例子:
#include "tabulate/table.hpp"
using namespace std;
using namespace tabulate;
int main()
{
Table table;
table.add_row({"This paragraph contains a veryveryveryveryveryverylong word. The long word will break and word wrap to the next line.",
"This paragraph \nhas embedded '\\n' \ncharacters and\n will break\n exactly where\n you want it\n to\n break."});
table[0][0].format().width(20); // 设置第 0 行第 0 列的宽度为 20
table[0][1].format().width(50); // 设置第 0 行第 1 列的宽度为 50
cout << table << endl;
return 0;
}
return 0;
}
  第 0 行第 0 列的文字是不是很长?但是设置了它的宽度后,就不用担心了。tabulate 将会帮你自动换行。如果不设置的话,表格就会变得很不整齐,你也可以尝试一下。
  第 0 行第 1 列的内容里运用了\n 的换行符,所以即使我们给它设置了 50 的宽度,也会先根据内容里的 \n 换行符来换行。
  值得注意的是,tabulate 会自动删除每一行内容两边的空白字符。
  0x32 字体对齐
  tabulate 支持三种对齐设置:左、中和右。默认情况下,全部内容都会靠左对齐。
  要手动设置对齐方式,可以使用 .format().font_align(方向)。
  举一个例子:
#include "tabulate/table.hpp"
using namespace std;
using namespace tabulate;
int main()
{
Table hellogithub;
hellogithub.add_row({"HelloGitHub"});
hellogithub[0][0].format()
.font_align(FontAlign::center); // 设置居中对齐
hellogithub.add_row({"hellogithub.com"});
hellogithub[1][0].format()
.font_align(FontAlign::left); // 设置靠左对齐
hellogithub.add_row({"github.com/521xueweihan/HelloGitHub"});
hellogithub[2][0].format()
.font_align(FontAlign::center); // 设置居中对齐
hellogithub.add_row({"xueweihan NB!!!"});
hellogithub[3][0].format()
.font_align(FontAlign::right); // 设置靠右对齐
hellogithub[0][0].format().width(50);
cout << hellogithub << endl;
return 0;
}
  0x33 字体样式
  tabulate 支持以下八种字体样式:
  粗体 bold
  深色 dark
  斜体 italic
  下划线 underline
  闪烁 blink
  翻转 reverse
  隐藏 concealed
  删除线 crossed
  某些样式可能会因为终端的原因而无法显示。
  如:粗体、深色、斜体、闪烁等样式,请慎用。
  要使用这些样式,可以调用 .format().font_style({...})。样式也可以叠加使用。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号