Skip to main content

worksheet_views/
worksheet_views.rs

1//! Streaming view creation, source read/export and repeatable original-package editing.
2use crabxl::{
3    Cell, CellValue, Pane, PanePosition, PaneState, Result, Row, RowIndex, SaveOptions, SheetView,
4    SheetViews, StyleId, ViewMode, WorkbookEditor, WorkbookReader, WorkbookWriter, WriteOptions,
5};
6use std::{fs::File, io::BufWriter};
7fn views() -> Result<SheetViews> {
8    let mut result = SheetViews::default();
9    let view = &mut result.views[0];
10    view.freeze_at(Some("B3".parse()?))?;
11    view.window_protection = Some(false);
12    view.show_formulas = Some(true);
13    view.show_grid_lines = Some(false);
14    view.show_row_column_headers = Some(false);
15    view.show_zeros = Some(false);
16    view.right_to_left = Some(true);
17    view.tab_selected = Some(true);
18    view.show_ruler = Some(false);
19    view.show_outline_symbols = Some(false);
20    view.default_grid_color = Some(false);
21    view.show_white_space = Some(false);
22    view.zoom_to_fit = Some(true);
23    view.mode = Some(ViewMode::PageLayout);
24    view.top_left_cell = Some("B3".into());
25    view.color_id = Some(12);
26    view.zoom_scale = Some(145);
27    view.zoom_scale_normal = Some(80);
28    view.zoom_scale_sheet_layout = Some(90);
29    view.zoom_scale_page_layout = Some(95);
30    view.selections[2].active_cell_id = Some(2);
31    view.selections[2].ranges = Some("A1 C3:D4".into());
32    result.views.push(SheetView {
33        workbook_view_id: 2,
34        pane: Some(Box::new(Pane {
35            x_split: Some(-1.5),
36            y_split: Some(2.5),
37            top_left_cell: Some("opaque".into()),
38            active_pane: PanePosition::BottomRight,
39            state: PaneState::FrozenSplit,
40        })),
41        ..SheetView::default()
42    });
43    Ok(result)
44}
45fn run() -> Result<()> {
46    let args: Vec<_> = std::env::args().collect();
47    if args.len() != 5 {
48        return Err(crabxl::Error::new(
49            crabxl::ErrorKind::InvalidData,
50            "Usage: worksheet_views create|copy|edit SOURCE OUTPUT ROWS",
51        ));
52    }
53    let mut writer = WorkbookWriter::new(WriteOptions::default())?;
54    match args[1].as_str() {
55        "create" => {
56            let rows: u32 = args[4].parse().map_err(|error| {
57                crabxl::Error::caused_by(crabxl::ErrorKind::InvalidData, "Invalid row count", error)
58            })?;
59            let settings = views()?;
60            println!("VIEW_BYTES={}", settings.memory_bytes());
61            writer.start_sheet_with_views("Sheet", &settings)?;
62            for index in 0..rows {
63                writer.write_row(&Row {
64                    index: RowIndex::new(index)?,
65                    cells: vec![Cell {
66                        address: crabxl::CellAddress::new(index, 0)?,
67                        value: CellValue::Integer(i64::from(index)),
68                        style: StyleId::new(0),
69                    }],
70                })?;
71            }
72            writer.close_sheet()?;
73            println!("TEMP_BYTES={}", writer.stats().peak_temp_bytes);
74            writer.finish(BufWriter::new(File::create(&args[3]).map_err(|error| {
75                crabxl::Error::caused_by(crabxl::ErrorKind::Io, "Cannot create view fixture", error)
76            })?))?;
77        }
78        "copy" => {
79            let mut reader = WorkbookReader::open(&args[2])?;
80            let settings = reader.sheet_views("Sheet")?;
81            println!("VIEW_BYTES={}", settings.memory_bytes());
82            writer.start_sheet_with_views("Sheet", &settings)?;
83            let mut rows = reader.rows("Sheet")?;
84            while let Some(row) = rows.next_row()? {
85                writer.write_row(&row)?;
86            }
87            writer.close_sheet()?;
88            println!("TEMP_BYTES={}", writer.stats().peak_temp_bytes);
89            writer.finish(BufWriter::new(File::create(&args[3]).map_err(|error| {
90                crabxl::Error::caused_by(crabxl::ErrorKind::Io, "Cannot create view fixture", error)
91            })?))?;
92        }
93        "edit" => {
94            let mut editor = WorkbookEditor::open(&args[2])?;
95            editor.set_sheet_views("Sheet", views()?)?;
96            println!("VIEW_BYTES={}", editor.patch_bytes());
97            editor.save(
98                BufWriter::new(File::create(&args[3]).map_err(|error| {
99                    crabxl::Error::caused_by(
100                        crabxl::ErrorKind::Io,
101                        "Cannot create view fixture",
102                        error,
103                    )
104                })?),
105                SaveOptions::default(),
106            )?;
107            println!("TEMP_BYTES=0");
108        }
109        _ => {
110            return Err(crabxl::Error::new(
111                crabxl::ErrorKind::InvalidData,
112                "Unknown view operation",
113            ));
114        }
115    }
116    Ok(())
117}
118fn main() {
119    if let Err(error) = run() {
120        eprintln!("{error}");
121        std::process::exit(1);
122    }
123}