df_excel/
read.rs

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    /// 导出指定头内容的对象组
11    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    /// 导出表结构
57    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 get_fill = book.get_sheet(&page).unwrap().get_style((col, row)).get_fill().clone();
119                // let get_fill = get_fill.unwrap().get_pattern_fill().clone();
120                // let get_fill = get_fill.unwrap().get_background_color().clone();
121                // let get_fill = get_fill.unwrap_or(Color::default());
122                // get_fill = get_fill.get_indexed().clone().to_string().as_str().clone();
123
124                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}