1use std::collections::HashMap;
2use json::{array, JsonValue, object};
3use umya_spreadsheet::{Alignment, EnumTrait};
4use crate::Head;
5
6
7pub struct Read {}
8
9impl Read {
10 pub fn export(filename: &str, page: usize, header_line: u32, headers: Vec<Head>) -> JsonValue {
12 let path = std::path::Path::new(filename);
13 let book = match umya_spreadsheet::reader::xlsx::read(path) {
14 Ok(e) => e,
15 Err(e) => {
16 println!("加载xlsx错误: {}", e);
17 return array![];
18 }
19 };
20 let total_row = book.get_sheet(&page).unwrap().get_highest_row();
21 let total_col = book.get_sheet(&page).unwrap().get_highest_column();
22
23 let mut head = HashMap::new();
24 for row in header_line..=header_line {
25 let row_info = book.get_sheet(&page).unwrap().get_row_dimension(&row).is_none();
26 if row_info {
27 continue;
28 }
29 for col in 1..=total_col {
30 let value = book.get_sheet(&page).unwrap().get_value((col, row));
31 for header in headers.iter() {
32 if header.title == value {
33 head.insert(col, header.clone());
34 }
35 }
36 }
37 }
38 let mut list = array![];
39 for row in header_line + 1..=total_row {
40 let row_info = book.get_sheet(&page).unwrap().get_row_dimension(&row).is_none();
41 if row_info {
42 continue;
43 }
44 let mut data = object! {};
45 for col in 1..=total_col {
46 let value = book.get_sheet(&page).unwrap().get_value((col, row));
47 let info = head.get(&col).unwrap().clone();
48 data[info.field] = JsonValue::from(value);
49 }
50 list.push(data).unwrap();
51 }
52 list
53 }
54
55
56 pub fn export_array(filename: &str, page: usize) -> JsonValue {
58 let path = std::path::Path::new(filename);
59
60 let book = match umya_spreadsheet::reader::xlsx::read(path) {
61 Ok(e) => e,
62 Err(e) => {
63 println!("加载xlsx错误: {}", e);
64 return array![];
65 }
66 };
67 let total_row = book.get_sheet(&page).unwrap().get_highest_row();
68 let total_col = book.get_sheet(&page).unwrap().get_highest_column();
69
70 let mut data = array![];
71
72 for row in 1..=total_row {
73 let row_info = book.get_sheet(&page).unwrap().get_row_dimension(&row).is_none();
74 if row_info {
75 continue;
76 }
77
78 let row_info = book.get_sheet(&page).unwrap().get_row_dimension(&row).unwrap();
79 let row_height = row_info.clone().get_height().clone();
80 let mut row_data = array![];
81 for col in 1..=total_col {
82 let value = book.get_sheet(&page).unwrap().get_value((col, row));
83
84 let mut col_width = 20.0;
85
86 let tt = book.get_sheet(&page).unwrap().get_column_dimension_by_number(&col).is_none();
87 if !tt {
88 let col_info = book.get_sheet(&page).unwrap().get_column_dimension_by_number(&col).unwrap();
89 col_width = col_info.clone().get_width().clone();
90 }
91
92
93 let mut style_left = false;
94 let mut style_right = false;
95 let mut style_top = false;
96 let mut style_bottom = false;
97
98 let mut style_size = 0;
99 let background_color = "";
100
101
102 let style = book.get_sheet(&page).unwrap().get_style((col, row)).clone();
103
104 let alignment = style.get_alignment().clone().unwrap_or(Alignment::default());
105 let alignment = alignment.get_horizontal().clone();
106 let alignment = alignment.get_value_string().clone();
107 let horizontal = if alignment == "general" { "" } else { alignment };
108
109
110 let alignment = style.get_alignment().clone().unwrap_or(Alignment::default());
111 let alignment = alignment.get_vertical().clone();
112 let vertical = alignment.get_value_string();
113
114 let alignment = style.get_alignment().clone().unwrap_or(Alignment::default());
115 let alignment = alignment.get_wrap_text().clone();
116 let wrap_text = if alignment { "normal" } else { "none" };
117
118 let is_borders = style.get_borders().is_none();
125 if !is_borders {
126 let borders = style.get_borders().clone().unwrap();
127 style_left = if borders.get_left().get_color().get_indexed().clone() == 8 as u32 { true } else { false };
128 if !style_left {
129 style_left = if borders.get_left().get_color().get_indexed().clone() == 64 as u32 { true } else { false };
130 }
131 style_right = if borders.get_right().get_color().get_indexed().clone() == 8 as u32 { true } else { false };
132 if !style_right {
133 style_right = if borders.get_right().get_color().get_indexed().clone() == 64 as u32 { true } else { false };
134 }
135 style_top = if borders.get_top().get_color().get_indexed().clone() == 8 as u32 { true } else { false };
136 if !style_top {
137 style_top = if borders.get_top().get_color().get_indexed().clone() == 64 as u32 { true } else { false };
138 }
139 style_bottom = if borders.get_bottom().get_color().get_indexed().clone() == 8 as u32 { true } else { false };
140 if !style_bottom {
141 style_bottom = if borders.get_bottom().get_color().get_indexed().clone() == 64 as u32 { true } else { false };
142 }
143
144 style_size = style.get_font().clone().unwrap().get_size().clone() as i32;
145 }
146
147
148 let col_data = object! {
149 value:value,
150 row:row,
151 col:col,
152 style:object!{
153 height:row_height,
154 width:col_width,
155 "font-size":style_size.clone(),
156 "background-color":background_color.clone(),
157 "text-align":horizontal.clone(),
158 "vertical-align":vertical.clone(),
159 "text-wrap":wrap_text.clone()
160 },
161 rowspan:0,
162 colspan:0,
163 border:object! {
164 left:style_left.clone(),
165 top:style_top.clone(),
166 bottom:style_bottom.clone(),
167 right:style_right.clone()
168 },
169 state:1
170 };
171 row_data.push(col_data).unwrap();
172 }
173 data.push(row_data).unwrap();
174 }
175
176
177 let merge = book.get_sheet(&page).unwrap().get_merge_cells().clone().clone();
178 for item in merge.iter() {
179 let start_row = item.get_coordinate_start_row().clone().unwrap().get_num().clone();
180 let start_col = item.get_coordinate_start_col().clone().unwrap().get_num().clone();
181 let end_row = item.get_coordinate_end_row().clone().unwrap().get_num().clone();
182 let end_col = item.get_coordinate_end_col().clone().unwrap().get_num().clone();
183 for row in start_row..=end_row {
184 for col in start_col..=end_col {
185 data[row as usize - 1][col as usize - 1]["state"] = 0.into();
186 }
187 }
188 data[start_row as usize - 1][start_col as usize - 1]["rowspan"] = JsonValue::from(end_row - start_row + 1);
189 data[start_row as usize - 1][start_col as usize - 1]["colspan"] = JsonValue::from(if end_col == start_col { 1 } else { end_col - start_col + 1 });
190 data[start_row as usize - 1][start_col as usize - 1]["state"] = 1.into();
191 }
192
193 return data;
194 }
195}