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 在 命令行界面 中
276,462 每月下载量
在 604 个 crate 中使用 (429 个直接使用)
125KB
2.5K SLoC
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"] }
依赖项
~2–10MB
~72K SLoC