df-excel 0.1.10

This is an Excel
Documentation
use std::collections::HashMap;
use json::{array, JsonValue, object};
use umya_spreadsheet::{Alignment, EnumTrait};
use crate::Head;


pub struct Read {}

impl Read {
    /// 导出指定头内容的对象组
    pub fn export(filename: &str, page: usize, header_line: u32, headers: Vec<Head>) -> JsonValue {
        let path = std::path::Path::new(filename);
        let book = match umya_spreadsheet::reader::xlsx::read(path) {
            Ok(e) => e,
            Err(e) => {
                println!("加载xlsx错误: {}", e);
                return array![];
            }
        };
        let total_row = book.get_sheet(&page).unwrap().get_highest_row();
        let total_col = book.get_sheet(&page).unwrap().get_highest_column();

        let mut head = HashMap::new();
        for row in header_line..=header_line {
            let row_info = book.get_sheet(&page).unwrap().get_row_dimension(&row).is_none();
            if row_info {
                continue;
            }
            for col in 1..=total_col {
                let value = book.get_sheet(&page).unwrap().get_value((col, row));
                for header in headers.iter() {
                    if header.title == value {
                        head.insert(col, header.clone());
                    }
                }
            }
        }
        let mut list = array![];
        for row in header_line + 1..=total_row {
            let row_info = book.get_sheet(&page).unwrap().get_row_dimension(&row).is_none();
            if row_info {
                continue;
            }
            let mut data = object! {};
            for col in 1..=total_col {
                let value = book.get_sheet(&page).unwrap().get_value((col, row));
                let info = head.get(&col).unwrap().clone();
                data[info.field] = JsonValue::from(value);
            }
            list.push(data).unwrap();
        }
        list
    }


    /// 导出表结构
    pub fn export_array(filename: &str, page: usize) -> JsonValue {
        let path = std::path::Path::new(filename);

        let book = match umya_spreadsheet::reader::xlsx::read(path) {
            Ok(e) => e,
            Err(e) => {
                println!("加载xlsx错误: {}", e);
                return array![];
            }
        };
        let total_row = book.get_sheet(&page).unwrap().get_highest_row();
        let total_col = book.get_sheet(&page).unwrap().get_highest_column();

        let mut data = array![];

        for row in 1..=total_row {
            let row_info = book.get_sheet(&page).unwrap().get_row_dimension(&row).is_none();
            if row_info {
                continue;
            }

            let row_info = book.get_sheet(&page).unwrap().get_row_dimension(&row).unwrap();
            let row_height = row_info.clone().get_height().clone();
            let mut row_data = array![];
            for col in 1..=total_col {
                let value = book.get_sheet(&page).unwrap().get_value((col, row));

                let mut col_width = 20.0;

                let tt = book.get_sheet(&page).unwrap().get_column_dimension_by_number(&col).is_none();
                if !tt {
                    let col_info = book.get_sheet(&page).unwrap().get_column_dimension_by_number(&col).unwrap();
                    col_width = col_info.clone().get_width().clone();
                }


                let mut style_left = false;
                let mut style_right = false;
                let mut style_top = false;
                let mut style_bottom = false;

                let mut style_size = 0;
                let background_color = "";


                let style = book.get_sheet(&page).unwrap().get_style((col, row)).clone();

                let alignment = style.get_alignment().clone().unwrap_or(Alignment::default());
                let alignment = alignment.get_horizontal().clone();
                let alignment = alignment.get_value_string().clone();
                let horizontal = if alignment == "general" { "" } else { alignment };


                let alignment = style.get_alignment().clone().unwrap_or(Alignment::default());
                let alignment = alignment.get_vertical().clone();
                let vertical = alignment.get_value_string();

                let alignment = style.get_alignment().clone().unwrap_or(Alignment::default());
                let alignment = alignment.get_wrap_text().clone();
                let wrap_text = if alignment { "normal" } else { "none" };

                // let get_fill = book.get_sheet(&page).unwrap().get_style((col, row)).get_fill().clone();
                // let get_fill = get_fill.unwrap().get_pattern_fill().clone();
                // let get_fill = get_fill.unwrap().get_background_color().clone();
                // let get_fill = get_fill.unwrap_or(Color::default());
                // get_fill = get_fill.get_indexed().clone().to_string().as_str().clone();

                let is_borders = style.get_borders().is_none();
                if !is_borders {
                    let borders = style.get_borders().clone().unwrap();
                    style_left = if borders.get_left().get_color().get_indexed().clone() == 8 as u32 { true } else { false };
                    if !style_left {
                        style_left = if borders.get_left().get_color().get_indexed().clone() == 64 as u32 { true } else { false };
                    }
                    style_right = if borders.get_right().get_color().get_indexed().clone() == 8 as u32 { true } else { false };
                    if !style_right {
                        style_right = if borders.get_right().get_color().get_indexed().clone() == 64 as u32 { true } else { false };
                    }
                    style_top = if borders.get_top().get_color().get_indexed().clone() == 8 as u32 { true } else { false };
                    if !style_top {
                        style_top = if borders.get_top().get_color().get_indexed().clone() == 64 as u32 { true } else { false };
                    }
                    style_bottom = if borders.get_bottom().get_color().get_indexed().clone() == 8 as u32 { true } else { false };
                    if !style_bottom {
                        style_bottom = if borders.get_bottom().get_color().get_indexed().clone() == 64 as u32 { true } else { false };
                    }

                    style_size = style.get_font().clone().unwrap().get_size().clone() as i32;
                }


                let col_data = object! {
                    value:value,
                    row:row,
                    col:col,
                    style:object!{
                        height:row_height,
                        width:col_width,
                        "font-size":style_size.clone(),
                        "background-color":background_color.clone(),
                        "text-align":horizontal.clone(),
                        "vertical-align":vertical.clone(),
                        "text-wrap":wrap_text.clone()
                    },
                    rowspan:0,
                    colspan:0,
                    border:object! {
                        left:style_left.clone(),
                        top:style_top.clone(),
                        bottom:style_bottom.clone(),
                        right:style_right.clone()
                    },
                    state:1
                };
                row_data.push(col_data).unwrap();
            }
            data.push(row_data).unwrap();
        }


        let merge = book.get_sheet(&page).unwrap().get_merge_cells().clone().clone();
        for item in merge.iter() {
            let start_row = item.get_coordinate_start_row().clone().unwrap().get_num().clone();
            let start_col = item.get_coordinate_start_col().clone().unwrap().get_num().clone();
            let end_row = item.get_coordinate_end_row().clone().unwrap().get_num().clone();
            let end_col = item.get_coordinate_end_col().clone().unwrap().get_num().clone();
            for row in start_row..=end_row {
                for col in start_col..=end_col {
                    data[row as usize - 1][col as usize - 1]["state"] = 0.into();
                }
            }
            data[start_row as usize - 1][start_col as usize - 1]["rowspan"] = JsonValue::from(end_row - start_row + 1);
            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 });
            data[start_row as usize - 1][start_col as usize - 1]["state"] = 1.into();
        }

        return data;
    }
}