21 个版本

0.10.0 2022年12月27日
0.9.0 2022年8月15日
0.8.0 2018年9月27日
0.7.0 2018年5月4日
0.1.2 2015年7月9日

#17命令行界面

Download history 66879/week @ 2024-03-14 61988/week @ 2024-03-21 90082/week @ 2024-03-28 54808/week @ 2024-04-04 59864/week @ 2024-04-11 64388/week @ 2024-04-18 58667/week @ 2024-04-25 57767/week @ 2024-05-02 59575/week @ 2024-05-09 74939/week @ 2024-05-16 68398/week @ 2024-05-23 59093/week @ 2024-05-30 75603/week @ 2024-06-06 66711/week @ 2024-06-13 66455/week @ 2024-06-20 56820/week @ 2024-06-27

276,462 每月下载量
604 个 crate 中使用 (429 个直接使用)

BSD-3-Clause

125KB
2.5K SLoC

License Build Status Build status codecov Crates.io Doc.rs Doc.rs

prettytable-rs

Rust 开发的格式化和对齐的表格打印库。

版权所有 © 2022 Pierre-Henri Symoneaux

本软件分发时不附带任何保证
有关更多信息,请参阅 LICENSE.txt 文件。

如何使用

包括

通过将以下行添加到您的 Cargo.toml 文件中,将库作为依赖项包含到您的项目中

[dependencies]
prettytable-rs = "^0.10"

该库需要至少 rust v1.56

对 MSRV 的任何更改都将通过小版本号升级来完成。

SemVer 策略

  • 1.0.0 之前的预版本 breaking changes 将遵循小版本号升级
  • 1.0.0 之后 本库的所有默认功能都受 SemVer 保护
  • 如上所述,MSRV 被视为 SemVer 之外

基本使用

开始使用它

#[macro_use] extern crate prettytable;
use prettytable::{Table, Row, Cell};

fn main() {
    // Create the table
    let mut table = Table::new();

    // Add a row per time
    table.add_row(row!["ABC", "DEFG", "HIJKLMN"]);
    table.add_row(row!["foobar", "bar", "foo"]);
    // A more complicated way to add a row:
    table.add_row(Row::new(vec![
        Cell::new("foobar2"),
        Cell::new("bar2"),
        Cell::new("foo2")]));

    // Print the table to stdout
    table.printstd();
}

上面的代码将输出

+---------+------+---------+
| ABC     | DEFG | HIJKLMN |
+---------+------+---------+
| foobar  | bar  | foo     |
+---------+------+---------+
| foobar2 | bar2 | foo2    |
+---------+------+---------+

使用宏

对于日常使用,请考虑使用 table! 宏。此代码将产生与上面相同的输出

#[macro_use] extern crate prettytable;

fn main() {
    let table = table!(["ABC", "DEFG", "HIJKLMN"],
                       ["foobar", "bar", "foo"],
                       ["foobar2", "bar2", "foo2"]);

    table.printstd();
}

ptable! 宏结合了创建和打印表格的功能

#[macro_use] extern crate prettytable;

fn main() {
    let table = ptable!(["ABC", "DEFG", "HIJKLMN"],
                        ["foobar", "bar", "foo"],
                        ["foobar2", "bar2", "foo2"]);
}

表格还支持多行单元格内容。因此,您可以打印一个表格到另一个表格中(yo dawg ;)。例如

let table1 = table!(["ABC", "DEFG", "HIJKLMN"],
                    ["foobar", "bar", "foo"],
                    ["foobar2", "bar2", "foo2"]);

let table2 = table!(["Title 1", "Title 2"],
                    ["This is\na multiline\ncell", "foo"],
                    ["Yo dawg ;) You can even\nprint tables\ninto tables", table1]);

table2.printstd();

将打印

+-------------------------+------------------------------+
| Title 1                 | Title 2                      |
+-------------------------+------------------------------+
| This is                 | foo                          |
| a multiline             |                              |
| cell                    |                              |
+-------------------------+------------------------------+
| Yo dawg ;) You can even | +---------+------+---------+ |
| print tables            | | ABC     | DEFG | HIJKLMN | |
| into tables             | +---------+------+---------+ |
|                         | | foobar  | bar  | foo     | |
|                         | +---------+------+---------+ |
|                         | | foobar2 | bar2 | foo2    | |
|                         | +---------+------+---------+ |
+-------------------------+------------------------------+

行可能有不同数量的单元格。表格将自动适应最大行,通过在较小的行中打印额外的空单元格。

以风格化方式使用!

表格可以具有带背景和前景颜色、粗体和斜体的样式化输出,这要归功于 term crate。还可以设置单元格的对齐方式(左、右、居中),并且单元格可以跨越多列。

term 样式属性被重新导出

  • 直接

    use prettytable::{Attr, color};
    
    /* ... */
    
    table.add_row(Row::new(vec![
        Cell::new("foobar")
            .with_style(Attr::Bold)
            .with_style(Attr::ForegroundColor(color::GREEN)),
        Cell::new("bar")
            .with_style(Attr::BackgroundColor(color::RED))
            .with_style(Attr::Italic(true))
            .with_hspan(2),
        Cell::new("foo")
        ]));
    
  • 通过样式字符串

    table.add_row(Row::new(vec![
        Cell::new("foobar").style_spec("bFg"),
        Cell::new("bar").style_spec("BriH2"),
        Cell::new("foo")]));
    
  • 使用 row!

    table.add_row(row![bFg->"foobar", BriH2->"bar", "foo"]);
    
  • 使用 table! 宏(此宏创建一个新表,与之前的示例不同)

    table!([bFg->"foobar", BriH2->"bar", "foo"]);
    

这里

  • bFg 表示 加粗,前景:绿色
  • BriH2 表示 背景红色斜体水平跨距2

另一个例子: FrBybc 表示 前景红色背景黄色加粗居中

宏中所有单元格样式的示例

  • 使用 row!,为每个单元格单独设置
    row![FrByb->"ABC", FrByb->"DEFG", "HIJKLMN"];
    
  • 使用 row!,为整行设置
    row![FY => "styled", "bar", "foo"];
    
  • 使用 table!,为每个单元格单独设置
    table!([FrBybl->"A", FrBybc->"B", FrBybr->"C"], [123, 234, 345, 456]);
    
  • 使用 table!,为整行设置
    table!([Frb => "A", "B", "C"], [Frb => 1, 2, 3, 4], [1, 2, 3]);
    
  • 使用 table!,混合样式
    table!([Frb => "A", "B", "C"], [Frb->1, Fgi->2, 3, 4], [1, 2, 3]);
    

样式指定符列表

  • F : 前景(必须后跟颜色指定符)
  • B : 背景(必须后跟颜色指定符)
  • H : 水平跨距(必须后跟一个数字)
  • b : 加粗
  • i : 斜体
  • u : 下划线
  • c : 居中对齐
  • l : 左对齐
  • r : 右对齐
  • d : 默认样式

颜色指定符列表

小写字母代表 普通 颜色

  • r : 红色
  • b : 蓝色
  • g : 绿色
  • y : 黄色
  • c : 青色
  • m : 品红色
  • w : 白色
  • d : 黑色

大写字母代表上述颜色的 亮色 对应色

  • R : 亮红色
  • B : 亮蓝色
  • ...等等...

切片

表可以被分割成不可变的借用子表。切片的类型是 prettytable::TableSlice<'a>.

例如,

use prettytable::Slice;
/* ... */
let slice = table.slice(2..5);
table.printstd();

将打印出只包含 table 中第 2、3 和 4 行的表。

支持其他 Range 语法。例如

table.slice(..); // Returns a borrowed immutable table with all rows
table.slice(2..); // Returns a table with rows starting at index 2
table.slice(..3); // Returns a table with rows until the one at index 3

自定义表格的外观和感觉

可以使用 prettytable::format::TableFormat 来自定义表的外观和感觉。

可配置的设置包括

  • 边框(左和右)
  • 连接点
  • 列分隔符
  • 行分隔符
  • 标题(使用 table.set_titles()

为此,可以

  • 创建一个新的 TableFormat 对象,然后调用设置器,直到获得所需的配置;
  • 或使用方便的 FormatBuilder 和 Builder 模式,如下所示
let mut table = Table::new();
let format = format::FormatBuilder::new()
    .column_separator('|')
    .borders('|')
    .separators(&[format::LinePosition::Top,
                  format::LinePosition::Bottom],
                format::LineSeparator::new('-', '+', '+', '+'))
    .padding(1, 1)
    .build();
table.set_format(format);

table.set_titles(row!["Title 1", "Title 2"]);
table.add_row(row!["Value 1", "Value 2"]);
table.add_row(row!["Value three", "Value four"]);

上面的代码将使表看起来像

+-------------+------------+
| Title 1     | Title 2    |
| Value 1     | Value 2    |
| Value three | Value four |
+-------------+------------+

为了方便,预定义了几个格式在 prettytable::format::consts 模块中。

一些格式及其相应的输出

  • use prettytable::format;
    
    table.set_format(*format::consts::FORMAT_NO_LINESEP_WITH_TITLE);
    
    +-------------+------------+
    | Title 1     | Title 2    |
    +-------------+------------+
    | Value 1     | Value 2    |
    | Value three | Value four |
    +-------------+------------+
    
  • use prettytable::format;
    
    table.set_format(*format::consts::FORMAT_NO_BORDER_LINE_SEPARATOR);
    
    Title 1     | Title 2
    ------------+------------
    Value 1     | Value 2
    Value three | Value four
    

请检查 API 文档以获取可用的预定义格式的完整列表。

CSV 导入/导出

表可以从和导出到 CSV。这归功于默认和可选功能 csv

在未来的主要版本中,csv 功能可能会默认禁用。

导入

可以从字符串导入 Table

let table = Table::from_csv_string("ABC,DEFG,HIJKLMN\n\
                                    foobar,bar,foo\n\
                                    foobar2,bar2,foo2")?;

或从 CSV 文件导入

let table = Table::from_csv_file("input_csv.txt")?;

这两种导入 CSV 的方式假设 CSV 格式没有 标题,并且用 逗号 分隔

还可以从 CSV 读取器导入,这允许对 CSV 格式进行更多自定义

let reader = /* create a reader */;
/* do something with the reader */
let table = Table::from_csv(reader);

导出

导出到通用的 Write

let out = File::create("output_csv.txt")?;
table.to_csv(out)?;

或到 csv::Writer<W: Write>

let writer = /* create a writer */;
/* do something with the writer */
table.to_csv_writer(writer)?;

关于行结束符的说明

默认情况下,该库会以平台特定的行结束符打印表格。这意味着在 Windows 上,换行符将用 \r\n 来渲染,而在其他平台上将用 \n 来渲染。从 v0.6.3 开始,平台特定的行结束符通过默认功能 win_crlf 被激活,但可以被禁用。当此功能被禁用(例如,使用 cargo 的 --no-default-features 标志)时,在任何平台上行结束符都将用 \n 来渲染。

这种自定义功能可能会在未来版本中移动到格式化 API。

文档和 示例目录 中提供了额外的示例。

Evcxr 集成

Evcxr 是一个 Rust REPL 和一个 Jupyter notebook 内核。这个包使用 evcxr 功能标志集成到 Evcxr 和 Jupyter notebook 中,该标志允许以原生方式显示表格。这包括对显示颜色和多种格式的支持。

您可以使用以下行将 prettytable 包含为依赖项

:dep prettytable = { git = "https://github.com/phsym/prettytable-rs", package = "prettytable-rs", features = ["evcxr"] }

prettytable being used in a Jupyter notebook with Evcxr Rust kernel.

依赖项

~2–10MB
~72K SLoC