Skip to main content

excel_cli/excel/
sheet.rs

1use crate::excel::Cell;
2use crate::utils::cell_reference;
3
4pub const EXCEL_MAX_COLS: usize = 16_384;
5pub const EXCEL_MAX_ROWS: usize = 1_048_576;
6
7#[derive(Clone)]
8pub struct FreezePanes {
9    pub rows: usize,
10    pub cols: usize,
11}
12
13impl FreezePanes {
14    #[must_use]
15    pub fn none() -> Self {
16        Self { rows: 0, cols: 0 }
17    }
18
19    #[must_use]
20    pub fn from_split_cell(row: usize, col: usize) -> Self {
21        Self {
22            rows: row.saturating_sub(1),
23            cols: col.saturating_sub(1),
24        }
25    }
26
27    #[must_use]
28    pub fn is_frozen(&self) -> bool {
29        self.rows > 0 || self.cols > 0
30    }
31
32    #[must_use]
33    pub fn split_cell(&self) -> (usize, usize) {
34        (self.rows + 1, self.cols + 1)
35    }
36
37    #[must_use]
38    pub fn split_cell_ref(&self) -> String {
39        cell_reference(self.split_cell())
40    }
41}
42
43impl Default for FreezePanes {
44    fn default() -> Self {
45        Self::none()
46    }
47}
48
49#[derive(Clone)]
50pub struct Sheet {
51    pub name: String,
52    pub data: Vec<Vec<Cell>>,
53    pub max_rows: usize,
54    pub max_cols: usize,
55    pub is_loaded: bool,
56    pub freeze_panes: FreezePanes,
57}
58
59impl Sheet {
60    #[must_use]
61    pub fn blank(name: String) -> Self {
62        Self {
63            name,
64            data: vec![vec![Cell::empty(); 2]; 2],
65            max_rows: 1,
66            max_cols: 1,
67            is_loaded: true,
68            freeze_panes: FreezePanes::none(),
69        }
70    }
71}