pub mod cell;
pub mod column_information;
pub mod hyperlink;
pub mod merge_cell;
pub mod row;
pub mod sheet_data;
pub mod sheet_dimension;
pub mod sheet_view;
pub mod table_part;
use anyhow::bail;
use column_information::{load_column_infos, XlsxColumnInformations};
use hyperlink::{load_hyperlinks, XlsxHyperlinks};
use merge_cell::{load_merge_cells, XlsxMergeCells};
use quick_xml::events::Event;
use sheet_data::XlsxSheetData;
use sheet_dimension::{load_sheet_dimension, XlsxSheetDimension};
use std::io::{Read, Seek};
use table_part::{load_table_parts, XlsxTableParts};
use zip::ZipArchive;
use super::{drawing::XlsxDrawing, sheet_format_properties::XlsxSheetFormatProperties};
use crate::{
excel::xml_reader,
raw::spreadsheet::{
filter::auto_filter::XlsxAutoFilter,
string_item::phonetic_properties::XlsxPhoneticProperties,
},
};
#[derive(Debug, Clone, PartialEq, Default)]
pub struct XlsxWorksheet {
pub auto_filter: Option<XlsxAutoFilter>,
pub column_infos: Option<XlsxColumnInformations>,
pub dimension: Option<XlsxSheetDimension>,
pub drawing: Option<XlsxDrawing>,
pub hyperlinks: Option<XlsxHyperlinks>,
pub merge_cells: Option<XlsxMergeCells>,
pub phonetic_properties: Option<XlsxPhoneticProperties>,
pub sheet_data: Option<XlsxSheetData>,
pub sheet_format_properties: Option<XlsxSheetFormatProperties>,
pub table_parts: Option<XlsxTableParts>, }
impl XlsxWorksheet {
pub(crate) fn load(zip: &mut ZipArchive<impl Read + Seek>, path: &str) -> anyhow::Result<Self> {
let mut worksheet = Self {
auto_filter: None,
column_infos: None,
dimension: None,
drawing: None,
hyperlinks: None,
merge_cells: None,
phonetic_properties: None,
sheet_data: None,
sheet_format_properties: None,
table_parts: None,
};
let Some(mut reader) = xml_reader(zip, path) else {
return Ok(worksheet);
};
let mut buf = Vec::new();
loop {
buf.clear();
match reader.read_event_into(&mut buf) {
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"extLst" => {
let _ = reader.read_to_end_into(e.to_end().to_owned().name(), &mut Vec::new());
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"autoFilter" => {
worksheet.auto_filter = Some(XlsxAutoFilter::load(&mut reader, e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"cols" => {
worksheet.column_infos = Some(load_column_infos(&mut reader)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"dimension" => {
worksheet.dimension = load_sheet_dimension(e)?;
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"drawing" => {
worksheet.drawing = Some(XlsxDrawing::load(e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"hyperlinks" => {
worksheet.hyperlinks = Some(load_hyperlinks(&mut reader)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"mergeCells" => {
worksheet.merge_cells = Some(load_merge_cells(&mut reader)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"phoneticPr" => {
worksheet.phonetic_properties = Some(XlsxPhoneticProperties::load(e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"sheetData" => {
worksheet.sheet_data = Some(XlsxSheetData::load(&mut reader)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"sheetFormatPr" => {
worksheet.sheet_format_properties = Some(XlsxSheetFormatProperties::load(e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"tableParts" => {
worksheet.table_parts = Some(load_table_parts(&mut reader)?);
}
Ok(Event::End(ref e)) if e.local_name().as_ref() == b"worksheet" => break,
Ok(Event::Eof) => break,
Err(e) => bail!(e.to_string()),
_ => (),
}
}
return Ok(worksheet);
}
}