1use std::path::Path;
2use json::{JsonValue, object};
3use umya_spreadsheet::{new_file, Spreadsheet, writer};
4use crate::Head;
5
6pub struct Write {
7 path: String,
8 page: usize,
9 excel: Spreadsheet,
10}
11
12impl Write {
13 pub fn new(filepath: &str) -> Self {
14 let book = new_file();
15 Self {
16 path: filepath.to_string(),
17 page: 0,
18 excel: book,
19 }
20 }
21 pub fn set_page(&mut self, page: usize, name: &str, headers: Vec<Head>, data: JsonValue) -> &mut Self {
24 self.page = page - 1;
25 if self.page > 0 {
26 self.excel.new_sheet(name).unwrap();
27 }
28 self.excel.get_sheet_mut(&self.page).unwrap().set_name(name);
29 let mut row_line = 1;
30 let mut col_line = 1;
31 let mut header_key_value = object! {};
32 for header in headers.iter() {
33 self.excel.get_sheet_mut(&self.page).unwrap().get_cell_mut((col_line, row_line)).set_value_string(header.clone().title);
34 header_key_value[header.clone().field] = JsonValue::from(col_line);
35 col_line += 1;
36 }
37 for row in data.members() {
38 row_line += 1;
39 for (key, value) in row.entries() {
40 col_line = header_key_value[key].as_u32().unwrap();
41 self.excel.get_sheet_mut(&self.page).unwrap().get_cell_mut((col_line, row_line)).set_value_string(value.to_string().clone());
42 }
43 }
44 self
45 }
46
47 pub fn save(&mut self) -> bool {
48 let path = Path::new(self.path.as_str().clone());
49 match writer::xlsx::write(&self.excel, path) {
50 Ok(_) => true,
51 Err(_) => false
52 }
53 }
54}