14个版本 (5个破坏性版本)
0.6.2 | 2024年3月24日 |
---|---|
0.5.0 | 2024年3月6日 |
0.4.3 | 2023年12月8日 |
0.4.2 | 2023年10月11日 |
0.2.1 | 2023年7月16日 |
#44 in 值格式化
每月下载量:189
在csvpp中使用
98KB
2.5K SLoC
a1_notation
A1电子表格符号解析库。A1符号使用A-Z字母表示列,使用基于1的数字表示行。例如,在电子表格的位置(0, 0)
(左上角)是"A1"。(1, 1)
是"B2",(1, 0)
是"B1",等等。
功能
对于serde或rkyv支持,您可以通过相应的功能启用它(在您的Cargo.toml
中指定features = ["serde"]
或features = ["rkyv"]
)。
实例化A1
最常见的需求是解析一个字符串
let a1 = A1::from_str("A1").unwrap();
// it parses it into an instance:
assert_eq!(a1,
A1 {
sheet_name: None,
reference: RangeOrCell::Cell(Address {
column: Column { absolute: false, x: 0 },
row: Row { absolute: false, y: 0 },
}),
});
// and can display it back:
assert_eq!(&a1.to_string(), "A1");
// you can also just call `a1_notation::new`:
let from_col_a_to_d = a1_notation::new("Foo!A:D").unwrap();
assert_eq!(from_col_a_to_d,
A1 {
sheet_name: Some("Foo".to_string()),
reference: RangeOrCell::ColumnRange {
from: Column { absolute: false, x: 0 },
to: Column { absolute: false, x: 3 },
},
});
assert_eq!(&from_col_a_to_d.to_string(), "Foo!A:D");
如果您有基于0的坐标并且想以A1的形式表示它们,有多个函数可以实例化
// to create a reference to a specific cell:
assert_eq!(&a1_notation::cell(2, 2).to_string(), "C3");
// a reference to an entire column
assert_eq!(&a1_notation::column(5).to_string(), "F:F");
// or an entire row
assert_eq!(&a1_notation::row(5).to_string(), "6:6");
// and finally a range between two cells:
assert_eq!(&a1_notation::range((0, 0), (4, 4)).to_string(), "A1:E5");
包含
考虑到所有不同的单元格、范围、行范围、列范围和非连续范围的各种组合,您可以计算一个引用是否包含另一个引用。
// a column contains any cell in that column:
let col_a = a1_notation::new("A:A").unwrap();
let a1 = a1_notation::new("A1").unwrap();
assert!(col_a.contains(&a1));
// likewise, a row range contains anything between it:
let top_5_rows = a1_notation::new("1:5").unwrap();
let b2 = a1_notation::new("B2").unwrap();
assert!(top_5_rows.contains(&b2));
// and a range between two points works as you'd expect (it forms a rectangle)
let c3_to_j20 = a1_notation::new("C3:J20").unwrap();
let d5 = a1_notation::new("D5").unwrap();
assert!(c3_to_j20.contains(&d5));
Into/From/AsRef实现
尽可能实现Into
/From
和AsRef
,以在各种结构体之间进行转换。通常,您可以从更具体的类型转换为更不具体的类型,但不能反过来。您通常应使用A1
结构体,但您也可以使用这些特质来处理这些更低级别的结构体并将它们向上转换。
// an address can act as a column or row using AsRef:
let a1 = Address::new(0, 0);
assert_eq!(&Column::new(0), a1.as_ref());
assert_eq!(&Row::new(0), a1.as_ref());
// addresses, columns and rows can `into()` "upwards" to an A1 or RangeOrCell
let col_b = Column::new(1);
assert_eq!(
RangeOrCell::ColumnRange {
from: Column::new(1),
to: Column::new(1),
},
col_b.into());
assert_eq!(
A1 {
sheet_name: None,
reference: RangeOrCell::ColumnRange {
from: Column::new(1),
to: Column::new(1),
},
},
col_b.into());
位移
您可以移动引用(和范围)
// A1 -> D1 -> D3 -> C3
assert_eq!(
&a1_notation::cell(0, 0)
.shift_right(3)
.shift_down(2)
.shift_left(1)
.to_string(),
"C3");
迭代器
您可以遍历各种类型的范围。
// a cell just emits itself (once)
assert_eq!(
a1_notation::cell(0, 0)
.iter().map(|r| r.to_string()).collect::<Vec<_>>(),
vec!["A1"]);
// a column range iterates column-wise
assert_eq!(
a1_notation::new("D:G").unwrap()
.iter().map(|r| r.to_string()).collect::<Vec<_>>(),
vec!["D:D", "E:E", "F:F", "G:G"]);
// and a row range goes row-wise
assert_eq!(
a1_notation::new("3:6").unwrap()
.iter().map(|r| r.to_string()).collect::<Vec<_>>(),
vec!["3:3", "4:4", "5:5", "6:6"]);
// a grid-based range goes row-by-row
assert_eq!(
a1_notation::new("A1:C3").unwrap()
.iter().map(|r| r.to_string()).collect::<Vec<_>>(),
vec![
"A1", "B1", "C1",
"A2", "B2", "C2",
"A3", "B3", "C3",
]);
A1引用示例
以下表格说明了A1引用
引用 | 含义 |
---|---|
"A1" |
单元格A1 |
"A1:B5" |
A1到B5的单元格 |
"C5:D9,G9:H16" |
多区域选择 |
"A:A" |
列A |
"1:1" |
第1行 |
"A:C" |
A到C的列 |
"1:5" |
第1行到第5行 |
"1:1,3:3,8:8" |
第1行、第3行和第8行 |
"A:A,C:C,F:F" |
A、C和F列 |
更多信息,请查看crates.io上的包及其Rust文档。
阅读更多
依赖项
~0–355KB