请选择 进入手机版 | 继续访问电脑版

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

C++  / 只看大图  / 倒序浏览   © 著作权归作者本人所有

#楼主# 2020-4-9

跳转到指定楼层
优雅地使用 C++ 制作表格:tabulate-1.jpg

作者:HelloGitHub-ChungZH

博客:https://chungzh.cn/
0x00 介绍 tabulate

tabulate 是一个使用 C++ 17 编写的库,它可以制作表格。使用它,把表格对齐、格式化和着色,不在话下!你甚至可以使用 tabulate,将你的表格导出为 Markdown 代码。下图是一个使用 tabulate 制作的表格输出在命令行的样例:

优雅地使用 C++ 制作表格:tabulate-2.jpg

当然,除了表格,你还可以玩出花样。看见下面这个马里奥了吗?这也是用 tabulate 制作的!。

优雅地使用 C++ 制作表格:tabulate-3.jpg

0x10 准备

首先你需要安装 CMake

创建一个文件夹(下文用 X 代替),作为你使用 tabulate 的地方。再将 include这个文件夹下载到 X 里。然后在 X 里创建 main.cpp 以及一个 CMakeLists.txt。

注意:需要下载 include 整个文件夹而不是仅仅下载 tabulate 文件夹

你可以下载 tabulate 项目,然后将 include 文件夹复制到 X 中。

将下面的代码复制进 CMakeLists.txt :

优雅地使用 C++ 制作表格:tabulate-4.jpg

最后 X 文件夹的结构应该是这样的:
.
├── CMakeLists.txt
├── include
│   └── tabulate
└── main.cpp

认真核对好 X 的结构!

可前往 ChungZH/tabulatedemo核对文件结构。
0x20 小试身手

将下面这段代码复制进 main.cpp 中:

优雅地使用 C++ 制作表格:tabulate-5.jpg

    如果你使用的是 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 来运行。

如果没有问题,那么你应该会在终端里看到:

优雅地使用 C++ 制作表格:tabulate-6.jpg

0x30 格式化表格


请先认真分析 0x20 小试身手 章节中的代码并尝试着修改一下它!
0x31 Word Wrapping

为了防止表格中的内容过长导致不整齐,你可以指定表格每一列的宽度,tabulate 就会自动帮你换行。语法如下:
// 将表格第 0 行第 0 列的宽度设为20
table[0][0].format().width(20);

除了自动换行,你也可以在内容中使用 \\n 来手动设置换行。

这是一个 Word Wrapping 的例子:

优雅地使用 C++ 制作表格:tabulate-7.jpg

    第 0 行第 0 列的文字是不是很长?但是设置了它的宽度后,就不用担心了。tabulate 将会帮你自动换行。如果不设置的话,表格就会变得很不整齐,你也可以尝试一下。第 0 行第 1 列的内容里运用了\\n 的换行符,所以即使我们给它设置了 50 的宽度,也会先根据内容里的 \\n 换行符来换行。值得注意的是,tabulate 会自动删除每一行内容两边的空白字符。

优雅地使用 C++ 制作表格:tabulate-8.jpg

0x32 字体对齐

tabulate 支持三种对齐设置:左、中和右。默认情况下,全部内容都会靠左对齐。

要手动设置对齐方式,可以使用 .format().font_align(方向)。

举一个例子:

优雅地使用 C++ 制作表格:tabulate-9.jpg

优雅地使用 C++ 制作表格:tabulate-10.jpg

0x33 字体样式

tabulate 支持以下八种字体样式:
    粗体 bold深色 dark斜体 italic下划线 underline闪烁 blink翻转 reverse隐藏 concealed删除线 crossed

某些样式可能会因为终端的原因而无法显示。

如:粗体、深色、斜体、闪烁等样式,请慎用。

要使用这些样式,可以调用 .format().font_style({...})。样式也可以叠加使用。

优雅地使用 C++ 制作表格:tabulate-11.jpg

0x34 颜色

你可以对表格的字体、边框、角以及列分隔符号设置它们的前景或背景颜色。

tabulate 支持 8 种颜色:
    灰色 gray红色 red绿色 green黄色 yellow蓝色 blue洋红色 magenta青色 cyan白色 white

可以通过 .format()._color(颜色) 的方式定义前景色或通过 .format()._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
转播转播 分享淘帖
回复

使用道具

1

主题

67

帖子

145

积分

注册会员

Rank: 2

积分
145
真无牙泛 发表于 2020-4-9 21:54:28
转发了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则