rsv_lib/excel/
flatten.rs

1use crate::{
2    args::Flatten,
3    utils::{cli_result::CliResult, reader::ExcelReader, table::Table},
4};
5
6impl Flatten {
7    pub fn excel_run(&self) -> CliResult {
8        let path = &self.path();
9
10        // open file and header
11        let mut range = ExcelReader::new(path, self.sheet)?;
12
13        // columns
14        let columns: Vec<String> = if self.no_header {
15            (1..=range.column_n())
16                .map(|i| format!("col{i}"))
17                .collect::<Vec<_>>()
18        } else {
19            let Some(r) = range.next() else { return Ok(()) };
20            r.iter().map(|i| i.to_string()).collect::<Vec<_>>()
21        };
22
23        // read file
24        let n = self.n as usize; // overflow is allowed when self.n is negative.
25        range
26            .iter()
27            .skip(range.next_called)
28            .take(n)
29            .enumerate()
30            .for_each(|(i, l)| {
31                println!(" {}row{}", &self.delimiter, i + 1);
32                let r = l
33                    .iter()
34                    .zip(&columns)
35                    .map(|(v, k)| [k.to_owned(), v.to_string()])
36                    .collect::<Vec<_>>();
37                Table::from_records(r).print_blank().unwrap();
38            });
39
40        Ok(())
41    }
42}