use std::borrow::Cow;
use crate::packaging::element::*;
use crate::packaging::namespace::Namespaces;
use quick_xml::events::attributes::Attribute;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", rename = "fileVersion")]
pub struct FileVersion {
pub app_name: Option<String>,
pub last_edited: Option<usize>,
pub lowest_edited: Option<usize>,
pub run_build: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", rename = "workbookPr")]
pub struct WorkbookPr {}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", rename = "workbookView")]
pub struct WorkbookView {
pub window_width: Option<usize>,
pub window_height: Option<usize>,
pub active_tab: Option<usize>,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", rename = "bookViews")]
pub struct BookViews {
pub workbook_view: WorkbookView,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", rename = "sheet")]
pub struct Sheet {
pub name: String,
pub sheet_id: usize,
#[serde(rename = "r:id")]
pub r_id: String,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", rename = "sheets")]
pub struct Sheets {
#[serde(rename = "sheet")]
pub sheets: Vec<Sheet>,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", rename = "calcPr")]
pub struct CalcPr {
calc_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkbookPart {
pub file_version: FileVersion,
pub book_views: BookViews,
pub workbook_pr: WorkbookPr,
pub sheets: Sheets,
pub calc_pr: CalcPr,
#[serde(flatten)]
namespaces: Namespaces,
}
impl WorkbookPart {
pub fn sheet_names(&self) -> Vec<&String> {
self.sheets.sheets.iter().map(|sheet| &sheet.name).collect()
}
}
impl OpenXmlElementInfo for WorkbookPart {
fn tag_name() -> &'static str {
"workbook"
}
}
impl OpenXmlDeserializeDefault for WorkbookPart {}
impl OpenXmlSerialize for WorkbookPart {
fn namespaces(&self) -> Option<Cow<Namespaces>> {
Some(Cow::Borrowed(&self.namespaces))
}
fn attributes(&self) -> Option<Vec<Attribute>> {
None
}
fn write_inner<W: std::io::Write>(&self, writer: W) -> Result<(), crate::error::OoxmlError> {
let mut xml = quick_xml::Writer::new(writer);
quick_xml::se::to_writer(xml.inner(), &self.file_version)?;
quick_xml::se::to_writer(xml.inner(), &self.book_views)?;
quick_xml::se::to_writer(xml.inner(), &self.workbook_pr)?;
quick_xml::se::to_writer(xml.inner(), &self.sheets)?;
quick_xml::se::to_writer(xml.inner(), &self.calc_pr)?;
Ok(())
}
}
#[test]
fn serde() {
let workbook =
WorkbookPart::from_xml_file("examples/simple-spreadsheet/xl/workbook.xml").unwrap();
println!("{:?}", workbook);
let str = workbook.to_xml_string().unwrap();
println!("{}", str);
let _sheet_names = workbook.sheet_names();
let workbook2: WorkbookPart = quick_xml::de::from_str(&str).unwrap();
println!("{:?}", workbook2);
assert_eq!(workbook, workbook2);
}