Skip to main content

logisheets_workbook/ooxml/
external_links.rs

1use super::{
2    complex_types::PlainTextString,
3    defaults::*,
4    simple_types::{StCellRef, StCellType},
5};
6use xmlserde_derives::{XmlDeserialize, XmlSerialize};
7
8#[derive(Debug, XmlSerialize, XmlDeserialize)]
9#[xmlserde(root = b"externalLink")]
10#[xmlserde(with_ns = b"http://schemas.openxmlformats.org/spreadsheetml/2006/main")]
11pub struct ExternalLinkPart {
12    #[xmlserde(name = b"externalBook", ty = "child")]
13    pub external_book: Option<CtExternalBook>,
14    // pub dde_link: Option<CtDdeLink>,
15    // pub ole_link: Option<CtOleLink>,
16}
17
18#[derive(Debug, XmlSerialize, XmlDeserialize)]
19pub struct CtExternalBook {
20    #[xmlserde(name = b"sheetNames", ty = "child")]
21    pub sheet_names: Option<CtExternalSheetNames>,
22    #[xmlserde(name = b"definedNames", ty = "child")]
23    pub defined_names: Option<CtExternalDefinedNames>,
24    #[xmlserde(name = b"sheetDataSet", ty = "child")]
25    pub sheet_data_set: Option<CtExternalSheetDataSet>,
26    #[xmlserde(name = b"r:id", ty = "attr")]
27    pub id: String,
28}
29
30#[derive(Debug, XmlSerialize, XmlDeserialize)]
31pub struct CtExternalSheetNames {
32    #[xmlserde(name = b"sheetName", ty = "child")]
33    pub names: Vec<CtExternalSheetName>,
34}
35
36#[derive(Debug, XmlSerialize, XmlDeserialize)]
37pub struct CtExternalSheetName {
38    #[xmlserde(name = b"val", ty = "attr")]
39    pub val: String,
40}
41
42#[derive(Debug, XmlSerialize, XmlDeserialize)]
43pub struct CtExternalDefinedNames {
44    #[xmlserde(name = b"definedName", ty = "child")]
45    pub names: Vec<CtExternalDefinedName>,
46}
47
48#[derive(Debug, XmlSerialize, XmlDeserialize)]
49pub struct CtExternalDefinedName {
50    #[xmlserde(name = b"name", ty = "attr")]
51    pub name: String,
52    #[xmlserde(name = b"refersTo", ty = "attr")]
53    pub refers_to: Option<String>,
54    #[xmlserde(name = b"sheetId", ty = "attr")]
55    pub sheet_id: Option<u32>,
56}
57
58#[derive(Debug, XmlSerialize, XmlDeserialize)]
59pub struct CtExternalSheetDataSet {
60    #[xmlserde(name = b"sheetData", ty = "child")]
61    pub data: Vec<CtExternalSheetData>,
62}
63
64#[derive(Debug, XmlSerialize, XmlDeserialize)]
65pub struct CtExternalSheetData {
66    #[xmlserde(name = b"row", ty = "child")]
67    pub rows: Vec<CtExternalRow>,
68    #[xmlserde(name = b"sheetId", ty = "attr")]
69    pub sheet_id: u32,
70    #[xmlserde(name = b"refreshError", ty = "attr", default = "default_false")]
71    pub refresh_error: bool,
72}
73
74#[derive(Debug, XmlSerialize, XmlDeserialize)]
75pub struct CtExternalRow {
76    #[xmlserde(name = b"cell", ty = "child")]
77    pub cells: Vec<CtExternalCell>,
78    #[xmlserde(name = b"r", ty = "attr")]
79    pub r: u32,
80}
81
82#[derive(Debug, XmlSerialize, XmlDeserialize)]
83pub struct CtExternalCell {
84    #[xmlserde(name = b"v", ty = "child")]
85    pub v: Option<PlainTextString>,
86    #[xmlserde(name = b"r", ty = "attr")]
87    pub r: Option<StCellRef>,
88    #[xmlserde(name = b"t", ty = "attr", default = "st_cell_type_n")]
89    pub t: StCellType,
90    #[xmlserde(name = b"vm", ty = "attr", default = "default_zero_u32")]
91    pub vm: u32,
92}
93
94#[cfg(test)]
95mod tests {
96    use super::ExternalLinkPart;
97    use crate::xml_deserialize_from_str;
98    #[test]
99    fn test1() {
100        let xml = include_str!("../../examples/external_link.xml");
101        let r = xml_deserialize_from_str::<ExternalLinkPart>(xml);
102        match r {
103            Ok(external_link) => {
104                let book = external_link.external_book.unwrap();
105                assert_eq!(book.sheet_names.unwrap().names.len(), 12);
106                // Used the site and the code below to check the diff manually.
107                // Basically pass.
108                // https://www.diffchecker.com/diff
109                // use crate::xml_serialize_with_decl;
110                // use crate::test_utils::*;
111                // let expected = to_tree(&in_one_line(xml));
112                // let actual = xml_serialize_with_decl(b"externalLink", external_link);
113                // let r =  to_tree(&in_one_line(&actual));
114                // println!("{:?}", actual);
115                // use std::io::Write;
116                // let mut file1 = std::fs::File::create("data1.txt").expect("create failed");
117                // file1.write_all(expected.as_bytes()).expect("write failed");
118                // let mut file2 = std::fs::File::create("data2.txt").expect("create failed");
119                // file2.write_all(r.as_bytes()).expect("write failed");
120                // assert_eq!(actual, r);
121            }
122            Err(e) => panic!("{:?}", e),
123        }
124    }
125}