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 值格式化

Download history 8/week @ 2024-04-11 2/week @ 2024-04-18 7/week @ 2024-04-25 80/week @ 2024-05-02 7/week @ 2024-05-16 3/week @ 2024-05-23 4/week @ 2024-05-30 7/week @ 2024-06-06 7/week @ 2024-06-13 2/week @ 2024-06-20 9/week @ 2024-06-27 80/week @ 2024-07-04 1/week @ 2024-07-11 101/week @ 2024-07-25

每月下载量:189
csvpp中使用

MIT授权

98KB
2.5K SLoC

crates.io github workflow dependency status codecov

a1_notation

A1电子表格符号解析库。A1符号使用A-Z字母表示列,使用基于1的数字表示行。例如,在电子表格的位置(0, 0)(左上角)是"A1"。(1, 1)是"B2",(1, 0)是"B1",等等。

功能

对于serderkyv支持,您可以通过相应的功能启用它(在您的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/FromAsRef,以在各种结构体之间进行转换。通常,您可以从更具体的类型转换为更不具体的类型,但不能反过来。您通常应使用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