Skip to main content

excelize_rs/xml/
worksheet.rs

1//! Worksheet part (`xl/worksheets/sheet*.xml`).
2//!
3//! Ported from Go `xmlWorksheet.go`.
4
5use serde::{Deserialize, Serialize};
6
7use super::common::{XlsxColor, XlsxExtLst, XlsxInnerXml, XlsxPhoneticPr};
8use super::shared_strings::XlsxSi;
9use super::table::XlsxAutoFilter;
10use super::workbook::XlsxAlternateContent;
11
12/// Returns `true` when an optional boolean is `None` or `Some(false)`, so that
13/// serialized x14 rules omit attributes that default to false.
14fn is_false(v: &Option<bool>) -> bool {
15    !v.unwrap_or(false)
16}
17
18/// Worksheet root element.
19#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
20#[serde(rename = "worksheet")]
21pub struct XlsxWorksheet {
22    #[serde(rename = "sheetPr", default, skip_serializing_if = "Option::is_none")]
23    pub sheet_pr: Option<XlsxSheetPr>,
24    #[serde(rename = "dimension", default, skip_serializing_if = "Option::is_none")]
25    pub dimension: Option<XlsxDimension>,
26    #[serde(
27        rename = "sheetViews",
28        default,
29        skip_serializing_if = "Option::is_none"
30    )]
31    pub sheet_views: Option<XlsxSheetViews>,
32    #[serde(
33        rename = "sheetFormatPr",
34        default,
35        skip_serializing_if = "Option::is_none"
36    )]
37    pub sheet_format_pr: Option<XlsxSheetFormatPr>,
38    #[serde(rename = "cols", default, skip_serializing_if = "Option::is_none")]
39    pub cols: Option<XlsxCols>,
40    #[serde(rename = "sheetData", default)]
41    pub sheet_data: XlsxSheetData,
42    #[serde(
43        rename = "sheetCalcPr",
44        default,
45        skip_serializing_if = "Option::is_none"
46    )]
47    pub sheet_calc_pr: Option<XlsxInnerXml>,
48    #[serde(
49        rename = "sheetProtection",
50        default,
51        skip_serializing_if = "Option::is_none"
52    )]
53    pub sheet_protection: Option<XlsxSheetProtection>,
54    #[serde(
55        rename = "protectedRanges",
56        default,
57        skip_serializing_if = "Option::is_none"
58    )]
59    pub protected_ranges: Option<XlsxInnerXml>,
60    #[serde(rename = "scenarios", default, skip_serializing_if = "Option::is_none")]
61    pub scenarios: Option<XlsxInnerXml>,
62    #[serde(
63        rename = "autoFilter",
64        default,
65        skip_serializing_if = "Option::is_none"
66    )]
67    pub auto_filter: Option<XlsxAutoFilter>,
68    #[serde(rename = "sortState", default, skip_serializing_if = "Option::is_none")]
69    pub sort_state: Option<XlsxSortState>,
70    #[serde(
71        rename = "dataConsolidate",
72        default,
73        skip_serializing_if = "Option::is_none"
74    )]
75    pub data_consolidate: Option<XlsxInnerXml>,
76    #[serde(
77        rename = "customSheetViews",
78        default,
79        skip_serializing_if = "Option::is_none"
80    )]
81    pub custom_sheet_views: Option<XlsxCustomSheetViews>,
82    #[serde(
83        rename = "mergeCells",
84        default,
85        skip_serializing_if = "Option::is_none"
86    )]
87    pub merge_cells: Option<XlsxMergeCells>,
88    #[serde(
89        rename = "phoneticPr",
90        default,
91        skip_serializing_if = "Option::is_none"
92    )]
93    pub phonetic_pr: Option<XlsxPhoneticPr>,
94    #[serde(rename = "conditionalFormatting", default)]
95    pub conditional_formatting: Vec<XlsxConditionalFormatting>,
96    #[serde(
97        rename = "dataValidations",
98        default,
99        skip_serializing_if = "Option::is_none"
100    )]
101    pub data_validations: Option<XlsxDataValidations>,
102    #[serde(
103        rename = "hyperlinks",
104        default,
105        skip_serializing_if = "Option::is_none"
106    )]
107    pub hyperlinks: Option<XlsxHyperlinks>,
108    #[serde(
109        rename = "printOptions",
110        default,
111        skip_serializing_if = "Option::is_none"
112    )]
113    pub print_options: Option<XlsxPrintOptions>,
114    #[serde(
115        rename = "pageMargins",
116        default,
117        skip_serializing_if = "Option::is_none"
118    )]
119    pub page_margins: Option<XlsxPageMargins>,
120    #[serde(rename = "pageSetup", default, skip_serializing_if = "Option::is_none")]
121    pub page_setup: Option<XlsxPageSetUp>,
122    #[serde(
123        rename = "headerFooter",
124        default,
125        skip_serializing_if = "Option::is_none"
126    )]
127    pub header_footer: Option<XlsxHeaderFooter>,
128    #[serde(rename = "rowBreaks", default, skip_serializing_if = "Option::is_none")]
129    pub row_breaks: Option<XlsxRowBreaks>,
130    #[serde(rename = "colBreaks", default, skip_serializing_if = "Option::is_none")]
131    pub col_breaks: Option<XlsxColBreaks>,
132    #[serde(
133        rename = "customProperties",
134        default,
135        skip_serializing_if = "Option::is_none"
136    )]
137    pub custom_properties: Option<XlsxInnerXml>,
138    #[serde(
139        rename = "cellWatches",
140        default,
141        skip_serializing_if = "Option::is_none"
142    )]
143    pub cell_watches: Option<XlsxInnerXml>,
144    #[serde(
145        rename = "ignoredErrors",
146        default,
147        skip_serializing_if = "Option::is_none"
148    )]
149    pub ignored_errors: Option<XlsxIgnoredErrors>,
150    #[serde(rename = "smartTags", default, skip_serializing_if = "Option::is_none")]
151    pub smart_tags: Option<XlsxInnerXml>,
152    #[serde(rename = "drawing", default, skip_serializing_if = "Option::is_none")]
153    pub drawing: Option<XlsxDrawing>,
154    #[serde(
155        rename = "legacyDrawing",
156        default,
157        skip_serializing_if = "Option::is_none"
158    )]
159    pub legacy_drawing: Option<XlsxLegacyDrawing>,
160    #[serde(
161        rename = "legacyDrawingHF",
162        default,
163        skip_serializing_if = "Option::is_none"
164    )]
165    pub legacy_drawing_hf: Option<XlsxLegacyDrawingHF>,
166    #[serde(rename = "drawingHF", default, skip_serializing_if = "Option::is_none")]
167    pub drawing_hf: Option<XlsxDrawingHF>,
168    #[serde(rename = "picture", default, skip_serializing_if = "Option::is_none")]
169    pub picture: Option<XlsxPicture>,
170    #[serde(
171        rename = "oleObjects",
172        default,
173        skip_serializing_if = "Option::is_none"
174    )]
175    pub ole_objects: Option<XlsxInnerXml>,
176    #[serde(rename = "controls", default, skip_serializing_if = "Option::is_none")]
177    pub controls: Option<XlsxInnerXml>,
178    #[serde(
179        rename = "webPublishItems",
180        default,
181        skip_serializing_if = "Option::is_none"
182    )]
183    pub web_publish_items: Option<XlsxInnerXml>,
184    #[serde(
185        rename = "mc:AlternateContent",
186        default,
187        skip_serializing_if = "Option::is_none"
188    )]
189    pub alternate_content: Option<XlsxAlternateContent>,
190    #[serde(
191        rename = "tableParts",
192        default,
193        skip_serializing_if = "Option::is_none"
194    )]
195    pub table_parts: Option<XlsxTableParts>,
196    #[serde(rename = "extLst", default, skip_serializing_if = "Option::is_none")]
197    pub ext_lst: Option<XlsxExtLst>,
198    #[serde(
199        rename = "http://schemas.openxmlformats.org/markup-compatibility/2006 AlternateContent",
200        default,
201        skip_serializing
202    )]
203    pub decode_alternate_content: Option<XlsxInnerXml>,
204}
205
206/// Drawing reference on a worksheet.
207#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
208#[serde(rename = "drawing")]
209pub struct XlsxDrawing {
210    #[serde(
211        rename = "@r:id",
212        alias = "@id",
213        default,
214        skip_serializing_if = "Option::is_none"
215    )]
216    pub rid: Option<String>,
217}
218
219/// Header and footer settings.
220#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
221#[serde(rename = "headerFooter")]
222pub struct XlsxHeaderFooter {
223    #[serde(
224        rename = "@differentOddEven",
225        default,
226        skip_serializing_if = "Option::is_none"
227    )]
228    pub different_odd_even: Option<bool>,
229    #[serde(
230        rename = "@differentFirst",
231        default,
232        skip_serializing_if = "Option::is_none"
233    )]
234    pub different_first: Option<bool>,
235    #[serde(
236        rename = "@scaleWithDoc",
237        default,
238        skip_serializing_if = "Option::is_none"
239    )]
240    pub scale_with_doc: Option<bool>,
241    #[serde(
242        rename = "@alignWithMargins",
243        default,
244        skip_serializing_if = "Option::is_none"
245    )]
246    pub align_with_margins: Option<bool>,
247    #[serde(rename = "oddHeader", default, skip_serializing_if = "Option::is_none")]
248    pub odd_header: Option<String>,
249    #[serde(rename = "oddFooter", default, skip_serializing_if = "Option::is_none")]
250    pub odd_footer: Option<String>,
251    #[serde(
252        rename = "evenHeader",
253        default,
254        skip_serializing_if = "Option::is_none"
255    )]
256    pub even_header: Option<String>,
257    #[serde(
258        rename = "evenFooter",
259        default,
260        skip_serializing_if = "Option::is_none"
261    )]
262    pub even_footer: Option<String>,
263    #[serde(
264        rename = "firstHeader",
265        default,
266        skip_serializing_if = "Option::is_none"
267    )]
268    pub first_header: Option<String>,
269    #[serde(
270        rename = "firstFooter",
271        default,
272        skip_serializing_if = "Option::is_none"
273    )]
274    pub first_footer: Option<String>,
275}
276
277/// Drawing reference in header/footer.
278#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
279pub struct XlsxDrawingHF {
280    #[serde(rename = "$value", default)]
281    pub content: String,
282}
283
284/// Page setup settings for the worksheet.
285#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
286#[serde(rename = "pageSetup")]
287pub struct XlsxPageSetUp {
288    #[serde(
289        rename = "@blackAndWhite",
290        default,
291        skip_serializing_if = "Option::is_none"
292    )]
293    pub black_and_white: Option<bool>,
294    #[serde(
295        rename = "@cellComments",
296        default,
297        skip_serializing_if = "Option::is_none"
298    )]
299    pub cell_comments: Option<String>,
300    #[serde(rename = "@copies", default, skip_serializing_if = "Option::is_none")]
301    pub copies: Option<i64>,
302    #[serde(rename = "@draft", default, skip_serializing_if = "Option::is_none")]
303    pub draft: Option<bool>,
304    #[serde(rename = "@errors", default, skip_serializing_if = "Option::is_none")]
305    pub errors: Option<String>,
306    #[serde(
307        rename = "@firstPageNumber",
308        default,
309        skip_serializing_if = "Option::is_none"
310    )]
311    pub first_page_number: Option<String>,
312    #[serde(
313        rename = "@fitToHeight",
314        default,
315        skip_serializing_if = "Option::is_none"
316    )]
317    pub fit_to_height: Option<i64>,
318    #[serde(
319        rename = "@fitToWidth",
320        default,
321        skip_serializing_if = "Option::is_none"
322    )]
323    pub fit_to_width: Option<i64>,
324    #[serde(
325        rename = "@horizontalDpi",
326        default,
327        skip_serializing_if = "Option::is_none"
328    )]
329    pub horizontal_dpi: Option<String>,
330    #[serde(rename = "@r:id", default, skip_serializing_if = "Option::is_none")]
331    pub rid: Option<String>,
332    #[serde(
333        rename = "@orientation",
334        default,
335        skip_serializing_if = "Option::is_none"
336    )]
337    pub orientation: Option<String>,
338    #[serde(
339        rename = "@pageOrder",
340        default,
341        skip_serializing_if = "Option::is_none"
342    )]
343    pub page_order: Option<String>,
344    #[serde(
345        rename = "@paperHeight",
346        default,
347        skip_serializing_if = "Option::is_none"
348    )]
349    pub paper_height: Option<String>,
350    #[serde(
351        rename = "@paperSize",
352        default,
353        skip_serializing_if = "Option::is_none"
354    )]
355    pub paper_size: Option<i64>,
356    #[serde(
357        rename = "@paperWidth",
358        default,
359        skip_serializing_if = "Option::is_none"
360    )]
361    pub paper_width: Option<String>,
362    #[serde(rename = "@scale", default, skip_serializing_if = "Option::is_none")]
363    pub scale: Option<i64>,
364    #[serde(
365        rename = "@useFirstPageNumber",
366        default,
367        skip_serializing_if = "Option::is_none"
368    )]
369    pub use_first_page_number: Option<bool>,
370    #[serde(
371        rename = "@usePrinterDefaults",
372        default,
373        skip_serializing_if = "Option::is_none"
374    )]
375    pub use_printer_defaults: Option<bool>,
376    #[serde(
377        rename = "@verticalDpi",
378        default,
379        skip_serializing_if = "Option::is_none"
380    )]
381    pub vertical_dpi: Option<String>,
382}
383
384/// Print options for the sheet.
385#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
386#[serde(rename = "printOptions")]
387pub struct XlsxPrintOptions {
388    #[serde(
389        rename = "@gridLines",
390        default,
391        skip_serializing_if = "Option::is_none"
392    )]
393    pub grid_lines: Option<bool>,
394    #[serde(
395        rename = "@gridLinesSet",
396        default,
397        skip_serializing_if = "Option::is_none"
398    )]
399    pub grid_lines_set: Option<bool>,
400    #[serde(rename = "@headings", default, skip_serializing_if = "Option::is_none")]
401    pub headings: Option<bool>,
402    #[serde(
403        rename = "@horizontalCentered",
404        default,
405        skip_serializing_if = "Option::is_none"
406    )]
407    pub horizontal_centered: Option<bool>,
408    #[serde(
409        rename = "@verticalCentered",
410        default,
411        skip_serializing_if = "Option::is_none"
412    )]
413    pub vertical_centered: Option<bool>,
414}
415
416/// Page margins for a sheet.
417#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
418#[serde(rename = "pageMargins")]
419pub struct XlsxPageMargins {
420    #[serde(rename = "@left")]
421    pub left: f64,
422    #[serde(rename = "@right")]
423    pub right: f64,
424    #[serde(rename = "@top")]
425    pub top: f64,
426    #[serde(rename = "@bottom")]
427    pub bottom: f64,
428    #[serde(rename = "@header")]
429    pub header: f64,
430    #[serde(rename = "@footer")]
431    pub footer: f64,
432}
433
434/// Sheet formatting properties.
435#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
436#[serde(rename = "sheetFormatPr")]
437pub struct XlsxSheetFormatPr {
438    #[serde(
439        rename = "@baseColWidth",
440        default,
441        skip_serializing_if = "Option::is_none"
442    )]
443    pub base_col_width: Option<u8>,
444    #[serde(
445        rename = "@defaultColWidth",
446        default,
447        skip_serializing_if = "Option::is_none"
448    )]
449    pub default_col_width: Option<f64>,
450    #[serde(rename = "@defaultRowHeight")]
451    pub default_row_height: f64,
452    #[serde(
453        rename = "@customHeight",
454        default,
455        skip_serializing_if = "Option::is_none"
456    )]
457    pub custom_height: Option<bool>,
458    #[serde(
459        rename = "@zeroHeight",
460        default,
461        skip_serializing_if = "Option::is_none"
462    )]
463    pub zero_height: Option<bool>,
464    #[serde(rename = "@thickTop", default, skip_serializing_if = "Option::is_none")]
465    pub thick_top: Option<bool>,
466    #[serde(
467        rename = "@thickBottom",
468        default,
469        skip_serializing_if = "Option::is_none"
470    )]
471    pub thick_bottom: Option<bool>,
472    #[serde(
473        rename = "@outlineLevelRow",
474        default,
475        skip_serializing_if = "Option::is_none"
476    )]
477    pub outline_level_row: Option<u8>,
478    #[serde(
479        rename = "@outlineLevelCol",
480        default,
481        skip_serializing_if = "Option::is_none"
482    )]
483    pub outline_level_col: Option<u8>,
484}
485
486/// Worksheet views collection.
487#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
488#[serde(rename = "sheetViews")]
489pub struct XlsxSheetViews {
490    #[serde(rename = "sheetView", default)]
491    pub sheet_view: Vec<XlsxSheetView>,
492}
493
494/// A single sheet view definition.
495#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
496#[serde(rename = "sheetView")]
497pub struct XlsxSheetView {
498    #[serde(
499        rename = "@windowProtection",
500        default,
501        skip_serializing_if = "Option::is_none"
502    )]
503    pub window_protection: Option<bool>,
504    #[serde(
505        rename = "@showFormulas",
506        default,
507        skip_serializing_if = "Option::is_none"
508    )]
509    pub show_formulas: Option<bool>,
510    #[serde(
511        rename = "@showGridLines",
512        default,
513        skip_serializing_if = "Option::is_none"
514    )]
515    pub show_grid_lines: Option<bool>,
516    #[serde(
517        rename = "@showRowColHeaders",
518        default,
519        skip_serializing_if = "Option::is_none"
520    )]
521    pub show_row_col_headers: Option<bool>,
522    #[serde(
523        rename = "@showZeros",
524        default,
525        skip_serializing_if = "Option::is_none"
526    )]
527    pub show_zeros: Option<bool>,
528    #[serde(
529        rename = "@rightToLeft",
530        default,
531        skip_serializing_if = "Option::is_none"
532    )]
533    pub right_to_left: Option<bool>,
534    #[serde(
535        rename = "@tabSelected",
536        default,
537        skip_serializing_if = "Option::is_none"
538    )]
539    pub tab_selected: Option<bool>,
540    #[serde(
541        rename = "@showRuler",
542        default,
543        skip_serializing_if = "Option::is_none"
544    )]
545    pub show_ruler: Option<bool>,
546    #[serde(
547        rename = "@showWhiteSpace",
548        default,
549        skip_serializing_if = "Option::is_none"
550    )]
551    pub show_white_space: Option<bool>,
552    #[serde(
553        rename = "@showOutlineSymbols",
554        default,
555        skip_serializing_if = "Option::is_none"
556    )]
557    pub show_outline_symbols: Option<bool>,
558    #[serde(
559        rename = "@defaultGridColor",
560        default,
561        skip_serializing_if = "Option::is_none"
562    )]
563    pub default_grid_color: Option<bool>,
564    #[serde(rename = "@view", default, skip_serializing_if = "Option::is_none")]
565    pub view: Option<String>,
566    #[serde(
567        rename = "@topLeftCell",
568        default,
569        skip_serializing_if = "Option::is_none"
570    )]
571    pub top_left_cell: Option<String>,
572    #[serde(rename = "@colorId", default, skip_serializing_if = "Option::is_none")]
573    pub color_id: Option<i64>,
574    #[serde(
575        rename = "@zoomScale",
576        default,
577        skip_serializing_if = "Option::is_none"
578    )]
579    pub zoom_scale: Option<f64>,
580    #[serde(
581        rename = "@zoomScaleNormal",
582        default,
583        skip_serializing_if = "Option::is_none"
584    )]
585    pub zoom_scale_normal: Option<f64>,
586    #[serde(
587        rename = "@zoomScalePageLayoutView",
588        default,
589        skip_serializing_if = "Option::is_none"
590    )]
591    pub zoom_scale_page_layout_view: Option<f64>,
592    #[serde(
593        rename = "@zoomScaleSheetLayoutView",
594        default,
595        skip_serializing_if = "Option::is_none"
596    )]
597    pub zoom_scale_sheet_layout_view: Option<f64>,
598    #[serde(rename = "@workbookViewId")]
599    pub workbook_view_id: i64,
600    #[serde(rename = "pane", default, skip_serializing_if = "Option::is_none")]
601    pub pane: Option<XlsxPane>,
602    #[serde(rename = "selection", default)]
603    pub selection: Vec<XlsxSelection>,
604}
605
606/// Worksheet view selection.
607#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
608#[serde(rename = "selection")]
609pub struct XlsxSelection {
610    #[serde(
611        rename = "@activeCell",
612        default,
613        skip_serializing_if = "Option::is_none"
614    )]
615    pub active_cell: Option<String>,
616    #[serde(
617        rename = "@activeCellId",
618        default,
619        skip_serializing_if = "Option::is_none"
620    )]
621    pub active_cell_id: Option<i64>,
622    #[serde(rename = "@pane", default, skip_serializing_if = "Option::is_none")]
623    pub pane: Option<String>,
624    #[serde(rename = "@sqref", default, skip_serializing_if = "Option::is_none")]
625    pub sqref: Option<String>,
626}
627
628/// Worksheet view pane.
629#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
630#[serde(rename = "pane")]
631pub struct XlsxPane {
632    #[serde(
633        rename = "@activePane",
634        default,
635        skip_serializing_if = "Option::is_none"
636    )]
637    pub active_pane: Option<String>,
638    #[serde(rename = "@state", default, skip_serializing_if = "Option::is_none")]
639    pub state: Option<String>,
640    #[serde(
641        rename = "@topLeftCell",
642        default,
643        skip_serializing_if = "Option::is_none"
644    )]
645    pub top_left_cell: Option<String>,
646    #[serde(rename = "@xSplit", default, skip_serializing_if = "Option::is_none")]
647    pub x_split: Option<f64>,
648    #[serde(rename = "@ySplit", default, skip_serializing_if = "Option::is_none")]
649    pub y_split: Option<f64>,
650}
651
652/// Sheet-level properties.
653#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
654#[serde(rename = "sheetPr")]
655pub struct XlsxSheetPr {
656    #[serde(
657        rename = "@syncHorizontal",
658        default,
659        skip_serializing_if = "Option::is_none"
660    )]
661    pub sync_horizontal: Option<bool>,
662    #[serde(
663        rename = "@syncVertical",
664        default,
665        skip_serializing_if = "Option::is_none"
666    )]
667    pub sync_vertical: Option<bool>,
668    #[serde(rename = "@syncRef", default, skip_serializing_if = "Option::is_none")]
669    pub sync_ref: Option<String>,
670    #[serde(
671        rename = "@transitionEvaluation",
672        default,
673        skip_serializing_if = "Option::is_none"
674    )]
675    pub transition_evaluation: Option<bool>,
676    #[serde(
677        rename = "@transitionEntry",
678        default,
679        skip_serializing_if = "Option::is_none"
680    )]
681    pub transition_entry: Option<bool>,
682    #[serde(
683        rename = "@published",
684        default,
685        skip_serializing_if = "Option::is_none"
686    )]
687    pub published: Option<bool>,
688    #[serde(rename = "@codeName", default, skip_serializing_if = "Option::is_none")]
689    pub code_name: Option<String>,
690    #[serde(
691        rename = "@filterMode",
692        default,
693        skip_serializing_if = "Option::is_none"
694    )]
695    pub filter_mode: Option<bool>,
696    #[serde(
697        rename = "@enableFormatConditionsCalculation",
698        default,
699        skip_serializing_if = "Option::is_none"
700    )]
701    pub enable_format_conditions_calculation: Option<bool>,
702    #[serde(rename = "tabColor", default, skip_serializing_if = "Option::is_none")]
703    pub tab_color: Option<XlsxColor>,
704    #[serde(rename = "outlinePr", default, skip_serializing_if = "Option::is_none")]
705    pub outline_pr: Option<XlsxOutlinePr>,
706    #[serde(
707        rename = "pageSetUpPr",
708        default,
709        skip_serializing_if = "Option::is_none"
710    )]
711    pub page_set_up_pr: Option<XlsxPageSetUpPr>,
712}
713
714/// Outline properties.
715#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
716#[serde(rename = "outlinePr")]
717pub struct XlsxOutlinePr {
718    #[serde(
719        rename = "@applyStyles",
720        default,
721        skip_serializing_if = "Option::is_none"
722    )]
723    pub apply_styles: Option<bool>,
724    #[serde(
725        rename = "@summaryBelow",
726        default,
727        skip_serializing_if = "Option::is_none"
728    )]
729    pub summary_below: Option<bool>,
730    #[serde(
731        rename = "@summaryRight",
732        default,
733        skip_serializing_if = "Option::is_none"
734    )]
735    pub summary_right: Option<bool>,
736    #[serde(
737        rename = "@showOutlineSymbols",
738        default,
739        skip_serializing_if = "Option::is_none"
740    )]
741    pub show_outline_symbols: Option<bool>,
742}
743
744/// Page setup properties of the worksheet.
745#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
746#[serde(rename = "pageSetUpPr")]
747pub struct XlsxPageSetUpPr {
748    #[serde(
749        rename = "@autoPageBreaks",
750        default,
751        skip_serializing_if = "Option::is_none"
752    )]
753    pub auto_page_breaks: Option<bool>,
754    #[serde(
755        rename = "@fitToPage",
756        default,
757        skip_serializing_if = "Option::is_none"
758    )]
759    pub fit_to_page: Option<bool>,
760}
761
762/// Column width and formatting definitions.
763#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
764#[serde(rename = "cols")]
765pub struct XlsxCols {
766    #[serde(rename = "col", default)]
767    pub col: Vec<XlsxCol>,
768}
769
770/// Column width and formatting for one or more columns.
771#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
772#[serde(rename = "col")]
773pub struct XlsxCol {
774    #[serde(rename = "@bestFit", default, skip_serializing_if = "Option::is_none")]
775    pub best_fit: Option<bool>,
776    #[serde(
777        rename = "@collapsed",
778        default,
779        skip_serializing_if = "Option::is_none"
780    )]
781    pub collapsed: Option<bool>,
782    #[serde(
783        rename = "@customWidth",
784        default,
785        skip_serializing_if = "Option::is_none"
786    )]
787    pub custom_width: Option<bool>,
788    #[serde(rename = "@hidden", default, skip_serializing_if = "Option::is_none")]
789    pub hidden: Option<bool>,
790    #[serde(rename = "@max")]
791    pub max: i64,
792    #[serde(rename = "@min")]
793    pub min: i64,
794    #[serde(
795        rename = "@outlineLevel",
796        default,
797        skip_serializing_if = "Option::is_none"
798    )]
799    pub outline_level: Option<u8>,
800    #[serde(rename = "@phonetic", default, skip_serializing_if = "Option::is_none")]
801    pub phonetic: Option<bool>,
802    #[serde(rename = "@style", default, skip_serializing_if = "Option::is_none")]
803    pub style: Option<i64>,
804    #[serde(rename = "@width", default, skip_serializing_if = "Option::is_none")]
805    pub width: Option<f64>,
806}
807
808/// Used range of the worksheet.
809#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
810#[serde(rename = "dimension")]
811pub struct XlsxDimension {
812    #[serde(rename = "@ref")]
813    pub r#ref: String,
814}
815
816/// Cell table itself, grouped by rows.
817#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
818#[serde(rename = "sheetData")]
819pub struct XlsxSheetData {
820    #[serde(rename = "row", default)]
821    pub row: Vec<XlsxRow>,
822}
823
824/// A single row in the worksheet.
825#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
826#[serde(rename = "row")]
827pub struct XlsxRow {
828    #[serde(rename = "c", default)]
829    pub c: Vec<XlsxC>,
830    #[serde(rename = "@r", default, skip_serializing_if = "Option::is_none")]
831    pub r: Option<i64>,
832    #[serde(rename = "@spans", default, skip_serializing_if = "Option::is_none")]
833    pub spans: Option<String>,
834    #[serde(rename = "@s", default, skip_serializing_if = "Option::is_none")]
835    pub s: Option<i64>,
836    #[serde(
837        rename = "@customFormat",
838        default,
839        skip_serializing_if = "Option::is_none"
840    )]
841    pub custom_format: Option<bool>,
842    #[serde(rename = "@ht", default, skip_serializing_if = "Option::is_none")]
843    pub ht: Option<f64>,
844    #[serde(rename = "@hidden", default, skip_serializing_if = "Option::is_none")]
845    pub hidden: Option<bool>,
846    #[serde(
847        rename = "@customHeight",
848        default,
849        skip_serializing_if = "Option::is_none"
850    )]
851    pub custom_height: Option<bool>,
852    #[serde(
853        rename = "@outlineLevel",
854        default,
855        skip_serializing_if = "Option::is_none"
856    )]
857    pub outline_level: Option<u8>,
858    #[serde(
859        rename = "@collapsed",
860        default,
861        skip_serializing_if = "Option::is_none"
862    )]
863    pub collapsed: Option<bool>,
864    #[serde(rename = "@thickTop", default, skip_serializing_if = "Option::is_none")]
865    pub thick_top: Option<bool>,
866    #[serde(rename = "@thickBot", default, skip_serializing_if = "Option::is_none")]
867    pub thick_bot: Option<bool>,
868    #[serde(rename = "@ph", default, skip_serializing_if = "Option::is_none")]
869    pub ph: Option<bool>,
870}
871
872/// A single cell in the worksheet.
873#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
874#[serde(rename = "c")]
875pub struct XlsxC {
876    #[serde(
877        rename = "@xml:space",
878        default,
879        skip_serializing_if = "Option::is_none"
880    )]
881    pub xml_space: Option<String>,
882    #[serde(rename = "@r", default, skip_serializing_if = "Option::is_none")]
883    pub r: Option<String>,
884    #[serde(rename = "@s", default, skip_serializing_if = "Option::is_none")]
885    pub s: Option<i64>,
886    #[serde(rename = "@t", default, skip_serializing_if = "Option::is_none")]
887    pub t: Option<String>,
888    #[serde(rename = "@cm", default, skip_serializing_if = "Option::is_none")]
889    pub cm: Option<u64>,
890    #[serde(rename = "@vm", default, skip_serializing_if = "Option::is_none")]
891    pub vm: Option<u64>,
892    #[serde(rename = "@ph", default, skip_serializing_if = "Option::is_none")]
893    pub ph: Option<bool>,
894    #[serde(rename = "f", default, skip_serializing_if = "Option::is_none")]
895    pub f: Option<XlsxF>,
896    #[serde(rename = "v", default, skip_serializing_if = "Option::is_none")]
897    pub v: Option<String>,
898    #[serde(rename = "is", default, skip_serializing_if = "Option::is_none")]
899    pub is: Option<XlsxSi>,
900}
901
902/// Formula for a cell.
903#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
904#[serde(rename = "f")]
905pub struct XlsxF {
906    #[serde(rename = "$value", default)]
907    pub content: String,
908    #[serde(rename = "@t", default, skip_serializing_if = "Option::is_none")]
909    pub t: Option<String>,
910    #[serde(rename = "@aca", default, skip_serializing_if = "Option::is_none")]
911    pub aca: Option<bool>,
912    #[serde(rename = "@ref", default, skip_serializing_if = "Option::is_none")]
913    pub r#ref: Option<String>,
914    #[serde(rename = "@dt2D", default, skip_serializing_if = "Option::is_none")]
915    pub dt2_d: Option<bool>,
916    #[serde(rename = "@dtr", default, skip_serializing_if = "Option::is_none")]
917    pub dtr: Option<bool>,
918    #[serde(rename = "@del1", default, skip_serializing_if = "Option::is_none")]
919    pub del1: Option<bool>,
920    #[serde(rename = "@del2", default, skip_serializing_if = "Option::is_none")]
921    pub del2: Option<bool>,
922    #[serde(rename = "@r1", default, skip_serializing_if = "Option::is_none")]
923    pub r1: Option<String>,
924    #[serde(rename = "@r2", default, skip_serializing_if = "Option::is_none")]
925    pub r2: Option<String>,
926    #[serde(rename = "@ca", default, skip_serializing_if = "Option::is_none")]
927    pub ca: Option<bool>,
928    #[serde(rename = "@si", default, skip_serializing_if = "Option::is_none")]
929    pub si: Option<i64>,
930    #[serde(rename = "@bx", default, skip_serializing_if = "Option::is_none")]
931    pub bx: Option<bool>,
932}
933
934/// Sheet protection options.
935#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
936#[serde(rename = "sheetProtection")]
937pub struct XlsxSheetProtection {
938    #[serde(
939        rename = "@algorithmName",
940        default,
941        skip_serializing_if = "Option::is_none"
942    )]
943    pub algorithm_name: Option<String>,
944    #[serde(rename = "@password", default, skip_serializing_if = "Option::is_none")]
945    pub password: Option<String>,
946    #[serde(
947        rename = "@hashValue",
948        default,
949        skip_serializing_if = "Option::is_none"
950    )]
951    pub hash_value: Option<String>,
952    #[serde(
953        rename = "@saltValue",
954        default,
955        skip_serializing_if = "Option::is_none"
956    )]
957    pub salt_value: Option<String>,
958    #[serde(
959        rename = "@spinCount",
960        default,
961        skip_serializing_if = "Option::is_none"
962    )]
963    pub spin_count: Option<i64>,
964    #[serde(rename = "@sheet")]
965    pub sheet: bool,
966    #[serde(rename = "@objects")]
967    pub objects: bool,
968    #[serde(rename = "@scenarios")]
969    pub scenarios: bool,
970    #[serde(rename = "@formatCells")]
971    pub format_cells: bool,
972    #[serde(rename = "@formatColumns")]
973    pub format_columns: bool,
974    #[serde(rename = "@formatRows")]
975    pub format_rows: bool,
976    #[serde(rename = "@insertColumns")]
977    pub insert_columns: bool,
978    #[serde(rename = "@insertRows")]
979    pub insert_rows: bool,
980    #[serde(rename = "@insertHyperlinks")]
981    pub insert_hyperlinks: bool,
982    #[serde(rename = "@deleteColumns")]
983    pub delete_columns: bool,
984    #[serde(rename = "@deleteRows")]
985    pub delete_rows: bool,
986    #[serde(rename = "@selectLockedCells")]
987    pub select_locked_cells: bool,
988    #[serde(rename = "@sort")]
989    pub sort: bool,
990    #[serde(rename = "@autoFilter")]
991    pub auto_filter: bool,
992    #[serde(rename = "@pivotTables")]
993    pub pivot_tables: bool,
994    #[serde(rename = "@selectUnlockedCells")]
995    pub select_unlocked_cells: bool,
996}
997
998/// Sort state collection.
999#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1000#[serde(rename = "sortState")]
1001pub struct XlsxSortState {
1002    #[serde(
1003        rename = "@columnSort",
1004        default,
1005        skip_serializing_if = "Option::is_none"
1006    )]
1007    pub column_sort: Option<bool>,
1008    #[serde(
1009        rename = "@caseSensitive",
1010        default,
1011        skip_serializing_if = "Option::is_none"
1012    )]
1013    pub case_sensitive: Option<bool>,
1014    #[serde(
1015        rename = "@sortMethod",
1016        default,
1017        skip_serializing_if = "Option::is_none"
1018    )]
1019    pub sort_method: Option<String>,
1020    #[serde(rename = "@ref")]
1021    pub r#ref: String,
1022    #[serde(rename = "$value", default)]
1023    pub content: String,
1024}
1025
1026/// Custom sheet views collection.
1027#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1028#[serde(rename = "customSheetViews")]
1029pub struct XlsxCustomSheetViews {
1030    #[serde(rename = "customSheetView", default)]
1031    pub custom_sheet_view: Vec<XlsxCustomSheetView>,
1032}
1033
1034/// Row or column break for pagination.
1035#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1036#[serde(rename = "brk")]
1037pub struct XlsxBrk {
1038    #[serde(rename = "@id", default, skip_serializing_if = "Option::is_none")]
1039    pub id: Option<i64>,
1040    #[serde(rename = "@min", default, skip_serializing_if = "Option::is_none")]
1041    pub min: Option<i64>,
1042    #[serde(rename = "@max", default, skip_serializing_if = "Option::is_none")]
1043    pub max: Option<i64>,
1044    #[serde(rename = "@man", default, skip_serializing_if = "Option::is_none")]
1045    pub man: Option<bool>,
1046    #[serde(rename = "@pt", default, skip_serializing_if = "Option::is_none")]
1047    pub pt: Option<bool>,
1048}
1049
1050/// Collection of row or column breaks.
1051#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1052pub struct XlsxBreaks {
1053    #[serde(rename = "brk", default)]
1054    pub brk: Vec<XlsxBrk>,
1055    #[serde(rename = "@count", default, skip_serializing_if = "Option::is_none")]
1056    pub count: Option<i64>,
1057    #[serde(
1058        rename = "@manualBreakCount",
1059        default,
1060        skip_serializing_if = "Option::is_none"
1061    )]
1062    pub manual_break_count: Option<i64>,
1063}
1064
1065/// Collection of row breaks.
1066#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1067#[serde(rename = "rowBreaks")]
1068pub struct XlsxRowBreaks {
1069    #[serde(flatten)]
1070    pub breaks: XlsxBreaks,
1071}
1072
1073/// Collection of column breaks.
1074#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1075#[serde(rename = "colBreaks")]
1076pub struct XlsxColBreaks {
1077    #[serde(flatten)]
1078    pub breaks: XlsxBreaks,
1079}
1080
1081/// A single custom sheet view.
1082#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1083#[serde(rename = "customSheetView")]
1084pub struct XlsxCustomSheetView {
1085    #[serde(rename = "pane", default, skip_serializing_if = "Option::is_none")]
1086    pub pane: Option<XlsxPane>,
1087    #[serde(rename = "selection", default, skip_serializing_if = "Option::is_none")]
1088    pub selection: Option<XlsxSelection>,
1089    #[serde(rename = "rowBreaks", default, skip_serializing_if = "Option::is_none")]
1090    pub row_breaks: Option<XlsxBreaks>,
1091    #[serde(rename = "colBreaks", default, skip_serializing_if = "Option::is_none")]
1092    pub col_breaks: Option<XlsxBreaks>,
1093    #[serde(
1094        rename = "pageMargins",
1095        default,
1096        skip_serializing_if = "Option::is_none"
1097    )]
1098    pub page_margins: Option<XlsxPageMargins>,
1099    #[serde(
1100        rename = "printOptions",
1101        default,
1102        skip_serializing_if = "Option::is_none"
1103    )]
1104    pub print_options: Option<XlsxPrintOptions>,
1105    #[serde(rename = "pageSetup", default, skip_serializing_if = "Option::is_none")]
1106    pub page_setup: Option<XlsxPageSetUp>,
1107    #[serde(
1108        rename = "headerFooter",
1109        default,
1110        skip_serializing_if = "Option::is_none"
1111    )]
1112    pub header_footer: Option<XlsxHeaderFooter>,
1113    #[serde(
1114        rename = "autoFilter",
1115        default,
1116        skip_serializing_if = "Option::is_none"
1117    )]
1118    pub auto_filter: Option<XlsxAutoFilter>,
1119    #[serde(rename = "extLst", default, skip_serializing_if = "Option::is_none")]
1120    pub ext_lst: Option<XlsxExtLst>,
1121    #[serde(rename = "@guid")]
1122    pub guid: String,
1123    #[serde(rename = "@scale", default, skip_serializing_if = "Option::is_none")]
1124    pub scale: Option<i64>,
1125    #[serde(rename = "@colorId", default, skip_serializing_if = "Option::is_none")]
1126    pub color_id: Option<i64>,
1127    #[serde(
1128        rename = "@showPageBreaks",
1129        default,
1130        skip_serializing_if = "Option::is_none"
1131    )]
1132    pub show_page_breaks: Option<bool>,
1133    #[serde(
1134        rename = "@showFormulas",
1135        default,
1136        skip_serializing_if = "Option::is_none"
1137    )]
1138    pub show_formulas: Option<bool>,
1139    #[serde(
1140        rename = "@showGridLines",
1141        default,
1142        skip_serializing_if = "Option::is_none"
1143    )]
1144    pub show_grid_lines: Option<bool>,
1145    #[serde(
1146        rename = "@showRowCol",
1147        default,
1148        skip_serializing_if = "Option::is_none"
1149    )]
1150    pub show_row_col: Option<bool>,
1151    #[serde(
1152        rename = "@outlineSymbols",
1153        default,
1154        skip_serializing_if = "Option::is_none"
1155    )]
1156    pub outline_symbols: Option<bool>,
1157    #[serde(
1158        rename = "@zeroValues",
1159        default,
1160        skip_serializing_if = "Option::is_none"
1161    )]
1162    pub zero_values: Option<bool>,
1163    #[serde(
1164        rename = "@fitToPage",
1165        default,
1166        skip_serializing_if = "Option::is_none"
1167    )]
1168    pub fit_to_page: Option<bool>,
1169    #[serde(
1170        rename = "@printArea",
1171        default,
1172        skip_serializing_if = "Option::is_none"
1173    )]
1174    pub print_area: Option<bool>,
1175    #[serde(rename = "@filter", default, skip_serializing_if = "Option::is_none")]
1176    pub filter: Option<bool>,
1177    #[serde(
1178        rename = "@showAutoFilter",
1179        default,
1180        skip_serializing_if = "Option::is_none"
1181    )]
1182    pub show_auto_filter: Option<bool>,
1183    #[serde(
1184        rename = "@hiddenRows",
1185        default,
1186        skip_serializing_if = "Option::is_none"
1187    )]
1188    pub hidden_rows: Option<bool>,
1189    #[serde(
1190        rename = "@hiddenColumns",
1191        default,
1192        skip_serializing_if = "Option::is_none"
1193    )]
1194    pub hidden_columns: Option<bool>,
1195    #[serde(rename = "@state", default, skip_serializing_if = "Option::is_none")]
1196    pub state: Option<String>,
1197    #[serde(
1198        rename = "@filterUnique",
1199        default,
1200        skip_serializing_if = "Option::is_none"
1201    )]
1202    pub filter_unique: Option<bool>,
1203    #[serde(rename = "@view", default, skip_serializing_if = "Option::is_none")]
1204    pub view: Option<String>,
1205    #[serde(
1206        rename = "@showRuler",
1207        default,
1208        skip_serializing_if = "Option::is_none"
1209    )]
1210    pub show_ruler: Option<bool>,
1211    #[serde(
1212        rename = "@topLeftCell",
1213        default,
1214        skip_serializing_if = "Option::is_none"
1215    )]
1216    pub top_left_cell: Option<String>,
1217}
1218
1219/// A single merged cell.
1220#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1221#[serde(rename = "mergeCell")]
1222pub struct XlsxMergeCell {
1223    #[serde(rename = "@ref", default, skip_serializing_if = "Option::is_none")]
1224    pub r#ref: Option<String>,
1225}
1226
1227/// All merged cells in the sheet.
1228#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1229#[serde(rename = "mergeCells")]
1230pub struct XlsxMergeCells {
1231    #[serde(rename = "@count", default, skip_serializing_if = "Option::is_none")]
1232    pub count: Option<i64>,
1233    #[serde(rename = "mergeCell", default)]
1234    pub cells: Vec<XlsxMergeCell>,
1235}
1236
1237/// Data validations collection.
1238#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1239#[serde(rename = "dataValidations")]
1240pub struct XlsxDataValidations {
1241    #[serde(rename = "@count", default, skip_serializing_if = "Option::is_none")]
1242    pub count: Option<i64>,
1243    #[serde(
1244        rename = "@disablePrompts",
1245        default,
1246        skip_serializing_if = "Option::is_none"
1247    )]
1248    pub disable_prompts: Option<bool>,
1249    #[serde(rename = "@xWindow", default, skip_serializing_if = "Option::is_none")]
1250    pub x_window: Option<i64>,
1251    #[serde(rename = "@yWindow", default, skip_serializing_if = "Option::is_none")]
1252    pub y_window: Option<i64>,
1253    #[serde(rename = "dataValidation", default)]
1254    pub data_validation: Vec<XlsxDataValidation>,
1255}
1256
1257/// Single data validation rule.
1258#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1259#[serde(rename = "dataValidation")]
1260pub struct XlsxDataValidation {
1261    #[serde(
1262        rename = "@allowBlank",
1263        default,
1264        skip_serializing_if = "Option::is_none"
1265    )]
1266    pub allow_blank: Option<bool>,
1267    #[serde(rename = "@error", default, skip_serializing_if = "Option::is_none")]
1268    pub error: Option<String>,
1269    #[serde(
1270        rename = "@errorStyle",
1271        default,
1272        skip_serializing_if = "Option::is_none"
1273    )]
1274    pub error_style: Option<String>,
1275    #[serde(
1276        rename = "@errorTitle",
1277        default,
1278        skip_serializing_if = "Option::is_none"
1279    )]
1280    pub error_title: Option<String>,
1281    #[serde(rename = "@operator", default, skip_serializing_if = "Option::is_none")]
1282    pub operator: Option<String>,
1283    #[serde(rename = "@prompt", default, skip_serializing_if = "Option::is_none")]
1284    pub prompt: Option<String>,
1285    #[serde(
1286        rename = "@promptTitle",
1287        default,
1288        skip_serializing_if = "Option::is_none"
1289    )]
1290    pub prompt_title: Option<String>,
1291    #[serde(rename = "@showDropDown", default, skip_serializing_if = "is_false")]
1292    pub show_drop_down: Option<bool>,
1293    #[serde(
1294        rename = "@showErrorMessage",
1295        default,
1296        skip_serializing_if = "is_false"
1297    )]
1298    pub show_error_message: Option<bool>,
1299    #[serde(
1300        rename = "@showInputMessage",
1301        default,
1302        skip_serializing_if = "is_false"
1303    )]
1304    pub show_input_message: Option<bool>,
1305    #[serde(rename = "@sqref")]
1306    pub sqref: String,
1307    #[serde(rename = "@type", default, skip_serializing_if = "Option::is_none")]
1308    pub r#type: Option<String>,
1309    #[serde(rename = "formula1", default, skip_serializing_if = "Option::is_none")]
1310    pub formula1: Option<XlsxInnerXml>,
1311    #[serde(rename = "formula2", default, skip_serializing_if = "Option::is_none")]
1312    pub formula2: Option<XlsxInnerXml>,
1313    #[serde(rename = "sqref", default, skip_serializing_if = "Option::is_none")]
1314    pub xm_sqref: Option<String>,
1315}
1316
1317/// Single x14 data validation rule.
1318#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1319#[serde(rename = "x14:dataValidation")]
1320pub struct XlsxX14DataValidation {
1321    #[serde(
1322        rename = "@allowBlank",
1323        default,
1324        skip_serializing_if = "Option::is_none"
1325    )]
1326    pub allow_blank: Option<bool>,
1327    #[serde(rename = "@error", default, skip_serializing_if = "Option::is_none")]
1328    pub error: Option<String>,
1329    #[serde(
1330        rename = "@errorStyle",
1331        default,
1332        skip_serializing_if = "Option::is_none"
1333    )]
1334    pub error_style: Option<String>,
1335    #[serde(
1336        rename = "@errorTitle",
1337        default,
1338        skip_serializing_if = "Option::is_none"
1339    )]
1340    pub error_title: Option<String>,
1341    #[serde(rename = "@operator", default, skip_serializing_if = "Option::is_none")]
1342    pub operator: Option<String>,
1343    #[serde(rename = "@prompt", default, skip_serializing_if = "Option::is_none")]
1344    pub prompt: Option<String>,
1345    #[serde(
1346        rename = "@promptTitle",
1347        default,
1348        skip_serializing_if = "Option::is_none"
1349    )]
1350    pub prompt_title: Option<String>,
1351    #[serde(rename = "@showDropDown", default, skip_serializing_if = "is_false")]
1352    pub show_drop_down: Option<bool>,
1353    #[serde(
1354        rename = "@showErrorMessage",
1355        default,
1356        skip_serializing_if = "is_false"
1357    )]
1358    pub show_error_message: Option<bool>,
1359    #[serde(
1360        rename = "@showInputMessage",
1361        default,
1362        skip_serializing_if = "is_false"
1363    )]
1364    pub show_input_message: Option<bool>,
1365    #[serde(rename = "@sqref")]
1366    pub sqref: String,
1367    #[serde(rename = "@type", default, skip_serializing_if = "Option::is_none")]
1368    pub r#type: Option<String>,
1369    #[serde(
1370        rename = "x14:formula1",
1371        default,
1372        skip_serializing_if = "Option::is_none"
1373    )]
1374    pub formula1: Option<XlsxInnerXml>,
1375    #[serde(
1376        rename = "x14:formula2",
1377        default,
1378        skip_serializing_if = "Option::is_none"
1379    )]
1380    pub formula2: Option<XlsxInnerXml>,
1381    #[serde(rename = "xm:sqref", default, skip_serializing_if = "Option::is_none")]
1382    pub xm_sqref: Option<String>,
1383}
1384
1385/// x14 data validations collection.
1386#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1387#[serde(rename = "x14:dataValidations")]
1388pub struct XlsxX14DataValidations {
1389    #[serde(rename = "@xmlns:xm", default, skip_serializing_if = "Option::is_none")]
1390    pub xmlns_xm: Option<String>,
1391    #[serde(rename = "@count", default, skip_serializing_if = "Option::is_none")]
1392    pub count: Option<i64>,
1393    #[serde(
1394        rename = "@disablePrompts",
1395        default,
1396        skip_serializing_if = "Option::is_none"
1397    )]
1398    pub disable_prompts: Option<bool>,
1399    #[serde(rename = "@xWindow", default, skip_serializing_if = "Option::is_none")]
1400    pub x_window: Option<i64>,
1401    #[serde(rename = "@yWindow", default, skip_serializing_if = "Option::is_none")]
1402    pub y_window: Option<i64>,
1403    #[serde(rename = "x14:dataValidation", default)]
1404    pub data_validation: Vec<XlsxX14DataValidation>,
1405}
1406
1407/// Conditional formatting rules applied to a range.
1408#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1409#[serde(rename = "conditionalFormatting")]
1410pub struct XlsxConditionalFormatting {
1411    #[serde(rename = "@pivot", default, skip_serializing_if = "Option::is_none")]
1412    pub pivot: Option<bool>,
1413    #[serde(rename = "@sqref", default, skip_serializing_if = "Option::is_none")]
1414    pub sqref: Option<String>,
1415    #[serde(rename = "cfRule", default)]
1416    pub cf_rule: Vec<XlsxCfRule>,
1417}
1418
1419/// Conditional formatting rule.
1420#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1421#[serde(rename = "cfRule")]
1422pub struct XlsxCfRule {
1423    #[serde(rename = "@type", default, skip_serializing_if = "Option::is_none")]
1424    pub r#type: Option<String>,
1425    #[serde(rename = "@dxfId", default, skip_serializing_if = "Option::is_none")]
1426    pub dxf_id: Option<i64>,
1427    #[serde(rename = "@priority", default, skip_serializing_if = "Option::is_none")]
1428    pub priority: Option<i64>,
1429    #[serde(
1430        rename = "@stopIfTrue",
1431        default,
1432        skip_serializing_if = "Option::is_none"
1433    )]
1434    pub stop_if_true: Option<bool>,
1435    #[serde(
1436        rename = "@aboveAverage",
1437        default,
1438        skip_serializing_if = "Option::is_none"
1439    )]
1440    pub above_average: Option<bool>,
1441    #[serde(rename = "@percent", default, skip_serializing_if = "Option::is_none")]
1442    pub percent: Option<bool>,
1443    #[serde(rename = "@bottom", default, skip_serializing_if = "Option::is_none")]
1444    pub bottom: Option<bool>,
1445    #[serde(rename = "@operator", default, skip_serializing_if = "Option::is_none")]
1446    pub operator: Option<String>,
1447    #[serde(rename = "@text", default, skip_serializing_if = "Option::is_none")]
1448    pub text: Option<String>,
1449    #[serde(
1450        rename = "@timePeriod",
1451        default,
1452        skip_serializing_if = "Option::is_none"
1453    )]
1454    pub time_period: Option<String>,
1455    #[serde(rename = "@rank", default, skip_serializing_if = "Option::is_none")]
1456    pub rank: Option<i64>,
1457    #[serde(rename = "@stdDev", default, skip_serializing_if = "Option::is_none")]
1458    pub std_dev: Option<i64>,
1459    #[serde(
1460        rename = "@equalAverage",
1461        default,
1462        skip_serializing_if = "Option::is_none"
1463    )]
1464    pub equal_average: Option<bool>,
1465    #[serde(rename = "formula", default)]
1466    pub formula: Vec<String>,
1467    #[serde(
1468        rename = "colorScale",
1469        default,
1470        skip_serializing_if = "Option::is_none"
1471    )]
1472    pub color_scale: Option<XlsxColorScale>,
1473    #[serde(rename = "dataBar", default, skip_serializing_if = "Option::is_none")]
1474    pub data_bar: Option<XlsxDataBar>,
1475    #[serde(rename = "iconSet", default, skip_serializing_if = "Option::is_none")]
1476    pub icon_set: Option<XlsxIconSet>,
1477    #[serde(rename = "extLst", default, skip_serializing_if = "Option::is_none")]
1478    pub ext_lst: Option<XlsxExtLst>,
1479}
1480
1481/// Gradated color scale in a conditional formatting rule.
1482#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1483#[serde(rename = "colorScale")]
1484pub struct XlsxColorScale {
1485    #[serde(rename = "cfvo", default)]
1486    pub cfvo: Vec<XlsxCfvo>,
1487    #[serde(rename = "color", default)]
1488    pub color: Vec<XlsxColor>,
1489}
1490
1491/// Data bar conditional formatting rule.
1492#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1493#[serde(rename = "dataBar")]
1494pub struct XlsxDataBar {
1495    #[serde(
1496        rename = "@maxLength",
1497        default,
1498        skip_serializing_if = "Option::is_none"
1499    )]
1500    pub max_length: Option<i64>,
1501    #[serde(
1502        rename = "@minLength",
1503        default,
1504        skip_serializing_if = "Option::is_none"
1505    )]
1506    pub min_length: Option<i64>,
1507    #[serde(
1508        rename = "@showValue",
1509        default,
1510        skip_serializing_if = "Option::is_none"
1511    )]
1512    pub show_value: Option<bool>,
1513    #[serde(rename = "cfvo", default)]
1514    pub cfvo: Vec<XlsxCfvo>,
1515    #[serde(rename = "color", default)]
1516    pub color: Vec<XlsxColor>,
1517}
1518
1519/// Icon set conditional formatting rule.
1520#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1521#[serde(rename = "iconSet")]
1522pub struct XlsxIconSet {
1523    #[serde(rename = "cfvo", default)]
1524    pub cfvo: Vec<XlsxCfvo>,
1525    #[serde(rename = "@iconSet", default, skip_serializing_if = "Option::is_none")]
1526    pub icon_set: Option<String>,
1527    #[serde(
1528        rename = "@showValue",
1529        default,
1530        skip_serializing_if = "Option::is_none"
1531    )]
1532    pub show_value: Option<bool>,
1533    #[serde(rename = "@percent", default, skip_serializing_if = "Option::is_none")]
1534    pub percent: Option<bool>,
1535    #[serde(rename = "@reverse", default, skip_serializing_if = "Option::is_none")]
1536    pub reverse: Option<bool>,
1537}
1538
1539/// Conditional format value object.
1540#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1541#[serde(rename = "cfvo")]
1542pub struct XlsxCfvo {
1543    #[serde(rename = "@gte", default, skip_serializing_if = "Option::is_none")]
1544    pub gte: Option<bool>,
1545    #[serde(rename = "@type", default, skip_serializing_if = "Option::is_none")]
1546    pub r#type: Option<String>,
1547    #[serde(rename = "@val", default, skip_serializing_if = "Option::is_none")]
1548    pub val: Option<String>,
1549    #[serde(rename = "extLst", default, skip_serializing_if = "Option::is_none")]
1550    pub ext_lst: Option<XlsxExtLst>,
1551}
1552
1553/// Hyperlinks collection.
1554#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1555#[serde(rename = "hyperlinks")]
1556pub struct XlsxHyperlinks {
1557    #[serde(rename = "hyperlink", default)]
1558    pub hyperlink: Vec<XlsxHyperlink>,
1559}
1560
1561/// A single hyperlink.
1562#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1563#[serde(rename = "hyperlink")]
1564pub struct XlsxHyperlink {
1565    #[serde(rename = "@ref")]
1566    pub r#ref: String,
1567    #[serde(rename = "@location", default, skip_serializing_if = "Option::is_none")]
1568    pub location: Option<String>,
1569    #[serde(rename = "@display", default, skip_serializing_if = "Option::is_none")]
1570    pub display: Option<String>,
1571    #[serde(rename = "@tooltip", default, skip_serializing_if = "Option::is_none")]
1572    pub tooltip: Option<String>,
1573    #[serde(rename = "@r:id", default, skip_serializing_if = "Option::is_none")]
1574    pub rid: Option<String>,
1575}
1576
1577/// Table part references in the worksheet.
1578#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1579#[serde(rename = "tableParts")]
1580pub struct XlsxTableParts {
1581    #[serde(rename = "@count", default, skip_serializing_if = "Option::is_none")]
1582    pub count: Option<i64>,
1583    #[serde(rename = "tablePart", default)]
1584    pub table_part: Vec<XlsxTablePart>,
1585}
1586
1587/// Single table part reference.
1588#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1589#[serde(rename = "tablePart")]
1590pub struct XlsxTablePart {
1591    #[serde(rename = "@r:id", default, skip_serializing_if = "Option::is_none")]
1592    pub rid: Option<String>,
1593}
1594
1595/// Background sheet image reference.
1596#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1597#[serde(rename = "picture")]
1598pub struct XlsxPicture {
1599    #[serde(rename = "@r:id", default, skip_serializing_if = "Option::is_none")]
1600    pub rid: Option<String>,
1601}
1602
1603/// Single ignored error for a range of cells.
1604#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1605#[serde(rename = "ignoredError")]
1606pub struct XlsxIgnoredError {
1607    #[serde(rename = "@sqref")]
1608    pub sqref: String,
1609    #[serde(
1610        rename = "@evalError",
1611        default,
1612        skip_serializing_if = "Option::is_none"
1613    )]
1614    pub eval_error: Option<bool>,
1615    #[serde(
1616        rename = "@twoDigitTextYear",
1617        default,
1618        skip_serializing_if = "Option::is_none"
1619    )]
1620    pub two_digit_text_year: Option<bool>,
1621    #[serde(
1622        rename = "@numberStoredAsText",
1623        default,
1624        skip_serializing_if = "Option::is_none"
1625    )]
1626    pub number_stored_as_text: Option<bool>,
1627    #[serde(rename = "@formula", default, skip_serializing_if = "Option::is_none")]
1628    pub formula: Option<bool>,
1629    #[serde(
1630        rename = "@formulaRange",
1631        default,
1632        skip_serializing_if = "Option::is_none"
1633    )]
1634    pub formula_range: Option<bool>,
1635    #[serde(
1636        rename = "@unlockedFormula",
1637        default,
1638        skip_serializing_if = "Option::is_none"
1639    )]
1640    pub unlocked_formula: Option<bool>,
1641    #[serde(
1642        rename = "@emptyCellReference",
1643        default,
1644        skip_serializing_if = "Option::is_none"
1645    )]
1646    pub empty_cell_reference: Option<bool>,
1647    #[serde(
1648        rename = "@listDataValidation",
1649        default,
1650        skip_serializing_if = "Option::is_none"
1651    )]
1652    pub list_data_validation: Option<bool>,
1653    #[serde(
1654        rename = "@calculatedColumn",
1655        default,
1656        skip_serializing_if = "Option::is_none"
1657    )]
1658    pub calculated_column: Option<bool>,
1659}
1660
1661/// Collection of ignored errors.
1662#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1663#[serde(rename = "ignoredErrors")]
1664pub struct XlsxIgnoredErrors {
1665    #[serde(rename = "ignoredError", default)]
1666    pub ignored_error: Vec<XlsxIgnoredError>,
1667    #[serde(rename = "extLst", default, skip_serializing_if = "Option::is_none")]
1668    pub ext_lst: Option<XlsxExtLst>,
1669}
1670
1671/// Legacy drawing reference.
1672#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1673#[serde(rename = "legacyDrawing")]
1674pub struct XlsxLegacyDrawing {
1675    #[serde(rename = "@r:id", default, skip_serializing_if = "Option::is_none")]
1676    pub rid: Option<String>,
1677}
1678
1679/// Legacy drawing reference in header/footer.
1680#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1681#[serde(rename = "legacyDrawingHF")]
1682pub struct XlsxLegacyDrawingHF {
1683    #[serde(rename = "@r:id", default, skip_serializing_if = "Option::is_none")]
1684    pub rid: Option<String>,
1685}
1686
1687// ------------------------------------------------------------------
1688// x14 / decode conditional formatting and sparkline types
1689// ------------------------------------------------------------------
1690
1691/// Decode x14 sparkline groups.
1692#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1693#[serde(rename = "sparklineGroups")]
1694pub struct DecodeX14SparklineGroups {
1695    #[serde(rename = "@xmlns:xm", default, skip_serializing_if = "Option::is_none")]
1696    pub xmlns_xm: Option<String>,
1697    #[serde(rename = "$value", default)]
1698    pub content: String,
1699}
1700
1701/// Decode x14 conditional formatting ext element.
1702#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1703#[serde(rename = "ext")]
1704pub struct DecodeX14ConditionalFormattingExt {
1705    #[serde(rename = "@id", default, skip_serializing_if = "Option::is_none")]
1706    pub id: Option<String>,
1707}
1708
1709/// Decode x14 conditional formattings placeholder.
1710#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1711#[serde(rename = "conditionalFormattings")]
1712pub struct DecodeX14ConditionalFormattings {
1713    #[serde(rename = "@xmlns:xm", default, skip_serializing_if = "Option::is_none")]
1714    pub xmlns_xm: Option<String>,
1715    #[serde(rename = "$value", default)]
1716    pub content: String,
1717}
1718
1719/// Decode x14 conditional formatting rules container.
1720#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1721#[serde(rename = "conditionalFormattings")]
1722pub struct DecodeX14ConditionalFormattingRules {
1723    #[serde(rename = "@xmlns:xm", default, skip_serializing_if = "Option::is_none")]
1724    pub xmlns_xm: Option<String>,
1725    #[serde(rename = "conditionalFormatting", default)]
1726    pub cond_fmt: Vec<DecodeX14ConditionalFormatting>,
1727}
1728
1729/// Decode x14 conditional formatting.
1730#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1731#[serde(rename = "conditionalFormatting")]
1732pub struct DecodeX14ConditionalFormatting {
1733    #[serde(rename = "@pivot", default, skip_serializing_if = "Option::is_none")]
1734    pub pivot: Option<bool>,
1735    #[serde(rename = "cfRule", default)]
1736    pub cf_rule: Vec<DecodeX14CfRule>,
1737    #[serde(rename = "sqref", default, skip_serializing_if = "Option::is_none")]
1738    pub sqref: Option<String>,
1739    #[serde(
1740        rename = "x14:extLst",
1741        default,
1742        skip_serializing_if = "Option::is_none"
1743    )]
1744    pub ext_lst: Option<XlsxExtLst>,
1745}
1746
1747/// Decode x14 cfRule.
1748#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1749#[serde(rename = "cfRule")]
1750pub struct DecodeX14CfRule {
1751    #[serde(rename = "@type", default, skip_serializing_if = "Option::is_none")]
1752    pub r#type: Option<String>,
1753    #[serde(rename = "@priority", default, skip_serializing_if = "Option::is_none")]
1754    pub priority: Option<i64>,
1755    #[serde(
1756        rename = "@stopIfTrue",
1757        default,
1758        skip_serializing_if = "Option::is_none"
1759    )]
1760    pub stop_if_true: Option<bool>,
1761    #[serde(
1762        rename = "@aboveAverage",
1763        default,
1764        skip_serializing_if = "Option::is_none"
1765    )]
1766    pub above_average: Option<bool>,
1767    #[serde(rename = "@percent", default, skip_serializing_if = "Option::is_none")]
1768    pub percent: Option<bool>,
1769    #[serde(rename = "@bottom", default, skip_serializing_if = "Option::is_none")]
1770    pub bottom: Option<bool>,
1771    #[serde(rename = "@operator", default, skip_serializing_if = "Option::is_none")]
1772    pub operator: Option<String>,
1773    #[serde(rename = "@text", default, skip_serializing_if = "Option::is_none")]
1774    pub text: Option<String>,
1775    #[serde(
1776        rename = "@timePeriod",
1777        default,
1778        skip_serializing_if = "Option::is_none"
1779    )]
1780    pub time_period: Option<String>,
1781    #[serde(rename = "@rank", default, skip_serializing_if = "Option::is_none")]
1782    pub rank: Option<i64>,
1783    #[serde(rename = "@stdDev", default, skip_serializing_if = "Option::is_none")]
1784    pub std_dev: Option<i64>,
1785    #[serde(
1786        rename = "@equalAverage",
1787        default,
1788        skip_serializing_if = "Option::is_none"
1789    )]
1790    pub equal_average: Option<bool>,
1791    #[serde(
1792        rename = "@activePresent",
1793        default,
1794        skip_serializing_if = "Option::is_none"
1795    )]
1796    pub active_present: Option<bool>,
1797    #[serde(rename = "@id", default, skip_serializing_if = "Option::is_none")]
1798    pub id: Option<String>,
1799    #[serde(rename = "f", default)]
1800    pub f: Vec<String>,
1801    #[serde(
1802        rename = "colorScale",
1803        default,
1804        skip_serializing_if = "Option::is_none"
1805    )]
1806    pub color_scale: Option<XlsxInnerXml>,
1807    #[serde(rename = "dataBar", default, skip_serializing_if = "Option::is_none")]
1808    pub data_bar: Option<DecodeX14DataBar>,
1809    #[serde(rename = "iconSet", default, skip_serializing_if = "Option::is_none")]
1810    pub icon_set: Option<DecodeX14IconSet>,
1811    #[serde(rename = "dxf", default, skip_serializing_if = "Option::is_none")]
1812    pub dxf: Option<XlsxInnerXml>,
1813    #[serde(rename = "extLst", default, skip_serializing_if = "Option::is_none")]
1814    pub ext_lst: Option<XlsxExtLst>,
1815}
1816
1817/// Decode x14 dataBar.
1818#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1819#[serde(rename = "dataBar")]
1820pub struct DecodeX14DataBar {
1821    #[serde(
1822        rename = "@maxLength",
1823        default,
1824        skip_serializing_if = "Option::is_none"
1825    )]
1826    pub max_length: Option<i64>,
1827    #[serde(
1828        rename = "@minLength",
1829        default,
1830        skip_serializing_if = "Option::is_none"
1831    )]
1832    pub min_length: Option<i64>,
1833    #[serde(rename = "@border", default, skip_serializing_if = "Option::is_none")]
1834    pub border: Option<bool>,
1835    #[serde(rename = "@gradient", default, skip_serializing_if = "Option::is_none")]
1836    pub gradient: Option<bool>,
1837    #[serde(
1838        rename = "@showValue",
1839        default,
1840        skip_serializing_if = "Option::is_none"
1841    )]
1842    pub show_value: Option<bool>,
1843    #[serde(
1844        rename = "@direction",
1845        default,
1846        skip_serializing_if = "Option::is_none"
1847    )]
1848    pub direction: Option<String>,
1849    #[serde(rename = "cfvo", default)]
1850    pub cfvo: Vec<DecodeX14Cfvo>,
1851    #[serde(
1852        rename = "borderColor",
1853        default,
1854        skip_serializing_if = "Option::is_none"
1855    )]
1856    pub border_color: Option<XlsxColor>,
1857    #[serde(
1858        rename = "negativeFillColor",
1859        default,
1860        skip_serializing_if = "Option::is_none"
1861    )]
1862    pub negative_fill_color: Option<XlsxColor>,
1863    #[serde(rename = "axisColor", default, skip_serializing_if = "Option::is_none")]
1864    pub axis_color: Option<XlsxColor>,
1865}
1866
1867/// Decode x14 iconSet.
1868#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1869#[serde(rename = "iconSet")]
1870pub struct DecodeX14IconSet {
1871    #[serde(rename = "@iconSet", default, skip_serializing_if = "Option::is_none")]
1872    pub icon_set: Option<String>,
1873    #[serde(
1874        rename = "@showValue",
1875        default,
1876        skip_serializing_if = "Option::is_none"
1877    )]
1878    pub show_value: Option<bool>,
1879    #[serde(rename = "@percent", default, skip_serializing_if = "Option::is_none")]
1880    pub percent: Option<bool>,
1881    #[serde(rename = "@reverse", default, skip_serializing_if = "Option::is_none")]
1882    pub reverse: Option<bool>,
1883    #[serde(rename = "@custom", default, skip_serializing_if = "Option::is_none")]
1884    pub custom: Option<bool>,
1885    #[serde(rename = "cfvo", default)]
1886    pub cfvo: Vec<DecodeX14Cfvo>,
1887    #[serde(rename = "cfIcon", default)]
1888    pub cf_icon: Vec<XlsxInnerXml>,
1889}
1890
1891/// Decode x14 cfvo.
1892#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1893#[serde(rename = "cfvo")]
1894pub struct DecodeX14Cfvo {
1895    #[serde(rename = "@type", default, skip_serializing_if = "Option::is_none")]
1896    pub r#type: Option<String>,
1897    #[serde(rename = "@gte", default, skip_serializing_if = "Option::is_none")]
1898    pub gte: Option<bool>,
1899    #[serde(rename = "f", default, skip_serializing_if = "Option::is_none")]
1900    pub f: Option<String>,
1901    #[serde(rename = "extLst", default, skip_serializing_if = "Option::is_none")]
1902    pub ext_lst: Option<XlsxExtLst>,
1903}
1904
1905/// x14 conditional formattings placeholder.
1906#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
1907#[serde(rename = "x14:conditionalFormattings")]
1908pub struct XlsxX14ConditionalFormattings {
1909    #[serde(rename = "$value", default)]
1910    pub content: String,
1911}
1912
1913/// x14 conditional formatting.
1914#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1915#[serde(rename = "x14:conditionalFormatting")]
1916pub struct XlsxX14ConditionalFormatting {
1917    #[serde(rename = "@xmlns:xm", default, skip_serializing_if = "Option::is_none")]
1918    pub xmlns_xm: Option<String>,
1919    #[serde(rename = "@pivot", default, skip_serializing_if = "Option::is_none")]
1920    pub pivot: Option<bool>,
1921    #[serde(rename = "x14:cfRule", default)]
1922    pub cf_rule: Vec<XlsxX14CfRule>,
1923    #[serde(rename = "xm:sqref", default, skip_serializing_if = "Option::is_none")]
1924    pub sqref: Option<String>,
1925    #[serde(
1926        rename = "x14:extLst",
1927        default,
1928        skip_serializing_if = "Option::is_none"
1929    )]
1930    pub ext_lst: Option<XlsxExtLst>,
1931}
1932
1933/// x14 cfRule.
1934#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
1935#[serde(rename = "x14:cfRule")]
1936pub struct XlsxX14CfRule {
1937    #[serde(rename = "@type", default, skip_serializing_if = "Option::is_none")]
1938    pub r#type: Option<String>,
1939    #[serde(rename = "@priority", default, skip_serializing_if = "Option::is_none")]
1940    pub priority: Option<i64>,
1941    #[serde(rename = "@stopIfTrue", default, skip_serializing_if = "is_false")]
1942    pub stop_if_true: Option<bool>,
1943    #[serde(rename = "@aboveAverage", default, skip_serializing_if = "is_false")]
1944    pub above_average: Option<bool>,
1945    #[serde(rename = "@percent", default, skip_serializing_if = "is_false")]
1946    pub percent: Option<bool>,
1947    #[serde(rename = "@bottom", default, skip_serializing_if = "is_false")]
1948    pub bottom: Option<bool>,
1949    #[serde(rename = "@operator", default, skip_serializing_if = "Option::is_none")]
1950    pub operator: Option<String>,
1951    #[serde(rename = "@text", default, skip_serializing_if = "Option::is_none")]
1952    pub text: Option<String>,
1953    #[serde(
1954        rename = "@timePeriod",
1955        default,
1956        skip_serializing_if = "Option::is_none"
1957    )]
1958    pub time_period: Option<String>,
1959    #[serde(rename = "@rank", default, skip_serializing_if = "Option::is_none")]
1960    pub rank: Option<i64>,
1961    #[serde(rename = "@stdDev", default, skip_serializing_if = "Option::is_none")]
1962    pub std_dev: Option<i64>,
1963    #[serde(rename = "@equalAverage", default, skip_serializing_if = "is_false")]
1964    pub equal_average: Option<bool>,
1965    #[serde(rename = "@activePresent", default, skip_serializing_if = "is_false")]
1966    pub active_present: Option<bool>,
1967    #[serde(rename = "@id", default, skip_serializing_if = "Option::is_none")]
1968    pub id: Option<String>,
1969    #[serde(rename = "xm:f", default)]
1970    pub f: Vec<String>,
1971    #[serde(
1972        rename = "x14:colorScale",
1973        default,
1974        skip_serializing_if = "Option::is_none"
1975    )]
1976    pub color_scale: Option<XlsxInnerXml>,
1977    #[serde(
1978        rename = "x14:dataBar",
1979        default,
1980        skip_serializing_if = "Option::is_none"
1981    )]
1982    pub data_bar: Option<Xlsx14DataBar>,
1983    #[serde(
1984        rename = "x14:iconSet",
1985        default,
1986        skip_serializing_if = "Option::is_none"
1987    )]
1988    pub icon_set: Option<Xlsx14IconSet>,
1989    #[serde(rename = "x14:dxf", default, skip_serializing_if = "Option::is_none")]
1990    pub dxf: Option<XlsxInnerXml>,
1991    #[serde(
1992        rename = "x14:extLst",
1993        default,
1994        skip_serializing_if = "Option::is_none"
1995    )]
1996    pub ext_lst: Option<XlsxExtLst>,
1997}
1998
1999/// x14 dataBar.
2000#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2001#[serde(rename = "x14:dataBar")]
2002pub struct Xlsx14DataBar {
2003    #[serde(
2004        rename = "@maxLength",
2005        default,
2006        skip_serializing_if = "Option::is_none"
2007    )]
2008    pub max_length: Option<i64>,
2009    #[serde(
2010        rename = "@minLength",
2011        default,
2012        skip_serializing_if = "Option::is_none"
2013    )]
2014    pub min_length: Option<i64>,
2015    #[serde(rename = "@border", default, skip_serializing_if = "Option::is_none")]
2016    pub border: Option<bool>,
2017    #[serde(rename = "@gradient", default, skip_serializing_if = "Option::is_none")]
2018    pub gradient: Option<bool>,
2019    #[serde(
2020        rename = "@showValue",
2021        default,
2022        skip_serializing_if = "Option::is_none"
2023    )]
2024    pub show_value: Option<bool>,
2025    #[serde(
2026        rename = "@direction",
2027        default,
2028        skip_serializing_if = "Option::is_none"
2029    )]
2030    pub direction: Option<String>,
2031    #[serde(rename = "x14:cfvo", default)]
2032    pub cfvo: Vec<Xlsx14Cfvo>,
2033    #[serde(
2034        rename = "x14:borderColor",
2035        default,
2036        skip_serializing_if = "Option::is_none"
2037    )]
2038    pub border_color: Option<XlsxColor>,
2039    #[serde(
2040        rename = "x14:negativeFillColor",
2041        default,
2042        skip_serializing_if = "Option::is_none"
2043    )]
2044    pub negative_fill_color: Option<XlsxColor>,
2045    #[serde(
2046        rename = "x14:axisColor",
2047        default,
2048        skip_serializing_if = "Option::is_none"
2049    )]
2050    pub axis_color: Option<XlsxColor>,
2051}
2052
2053/// x14 iconSet.
2054#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2055#[serde(rename = "x14:iconSet")]
2056pub struct Xlsx14IconSet {
2057    #[serde(rename = "@iconSet", default, skip_serializing_if = "Option::is_none")]
2058    pub icon_set: Option<String>,
2059    #[serde(
2060        rename = "@showValue",
2061        default,
2062        skip_serializing_if = "Option::is_none"
2063    )]
2064    pub show_value: Option<bool>,
2065    #[serde(rename = "@percent", default, skip_serializing_if = "Option::is_none")]
2066    pub percent: Option<bool>,
2067    #[serde(rename = "@reverse", default, skip_serializing_if = "Option::is_none")]
2068    pub reverse: Option<bool>,
2069    #[serde(rename = "@custom", default, skip_serializing_if = "Option::is_none")]
2070    pub custom: Option<bool>,
2071    #[serde(rename = "x14:cfvo", default)]
2072    pub cfvo: Vec<Xlsx14Cfvo>,
2073    #[serde(rename = "x14:cfIcon", default)]
2074    pub cf_icon: Vec<XlsxInnerXml>,
2075}
2076
2077/// x14 cfvo.
2078#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2079#[serde(rename = "x14:cfvo")]
2080pub struct Xlsx14Cfvo {
2081    #[serde(rename = "@type", default, skip_serializing_if = "Option::is_none")]
2082    pub r#type: Option<String>,
2083    #[serde(rename = "@gte", default, skip_serializing_if = "Option::is_none")]
2084    pub gte: Option<bool>,
2085    #[serde(rename = "xm:f", default, skip_serializing_if = "Option::is_none")]
2086    pub f: Option<String>,
2087    #[serde(
2088        rename = "x14:extLst",
2089        default,
2090        skip_serializing_if = "Option::is_none"
2091    )]
2092    pub ext_lst: Option<XlsxExtLst>,
2093}
2094
2095/// x14 sparkline groups.
2096#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2097#[serde(rename = "x14:sparklineGroups")]
2098pub struct XlsxX14SparklineGroups {
2099    #[serde(rename = "@xmlns:xm", default, skip_serializing_if = "Option::is_none")]
2100    pub xmlns_xm: Option<String>,
2101    #[serde(rename = "x14:sparklineGroup", default)]
2102    pub sparkline_groups: Vec<XlsxX14SparklineGroup>,
2103    #[serde(rename = "$value", default)]
2104    pub content: String,
2105}
2106
2107/// x14 sparkline group.
2108#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2109#[serde(rename = "x14:sparklineGroup")]
2110pub struct XlsxX14SparklineGroup {
2111    #[serde(
2112        rename = "@manualMax",
2113        default,
2114        skip_serializing_if = "Option::is_none"
2115    )]
2116    pub manual_max: Option<i64>,
2117    #[serde(
2118        rename = "@manualMin",
2119        default,
2120        skip_serializing_if = "Option::is_none"
2121    )]
2122    pub manual_min: Option<i64>,
2123    #[serde(
2124        rename = "@lineWeight",
2125        default,
2126        skip_serializing_if = "Option::is_none"
2127    )]
2128    pub line_weight: Option<f64>,
2129    #[serde(rename = "@type", default, skip_serializing_if = "Option::is_none")]
2130    pub r#type: Option<String>,
2131    #[serde(rename = "@dateAxis", default, skip_serializing_if = "Option::is_none")]
2132    pub date_axis: Option<bool>,
2133    #[serde(
2134        rename = "@displayEmptyCellsAs",
2135        default,
2136        skip_serializing_if = "Option::is_none"
2137    )]
2138    pub display_empty_cells_as: Option<String>,
2139    #[serde(rename = "@markers", default, skip_serializing_if = "Option::is_none")]
2140    pub markers: Option<bool>,
2141    #[serde(rename = "@high", default, skip_serializing_if = "Option::is_none")]
2142    pub high: Option<bool>,
2143    #[serde(rename = "@low", default, skip_serializing_if = "Option::is_none")]
2144    pub low: Option<bool>,
2145    #[serde(rename = "@first", default, skip_serializing_if = "Option::is_none")]
2146    pub first: Option<bool>,
2147    #[serde(rename = "@last", default, skip_serializing_if = "Option::is_none")]
2148    pub last: Option<bool>,
2149    #[serde(rename = "@negative", default, skip_serializing_if = "Option::is_none")]
2150    pub negative: Option<bool>,
2151    #[serde(
2152        rename = "@displayXAxis",
2153        default,
2154        skip_serializing_if = "Option::is_none"
2155    )]
2156    pub display_x_axis: Option<bool>,
2157    #[serde(
2158        rename = "@displayHidden",
2159        default,
2160        skip_serializing_if = "Option::is_none"
2161    )]
2162    pub display_hidden: Option<bool>,
2163    #[serde(
2164        rename = "@minAxisType",
2165        default,
2166        skip_serializing_if = "Option::is_none"
2167    )]
2168    pub min_axis_type: Option<String>,
2169    #[serde(
2170        rename = "@maxAxisType",
2171        default,
2172        skip_serializing_if = "Option::is_none"
2173    )]
2174    pub max_axis_type: Option<String>,
2175    #[serde(
2176        rename = "@rightToLeft",
2177        default,
2178        skip_serializing_if = "Option::is_none"
2179    )]
2180    pub right_to_left: Option<bool>,
2181    #[serde(
2182        rename = "x14:colorSeries",
2183        default,
2184        skip_serializing_if = "Option::is_none"
2185    )]
2186    pub color_series: Option<XlsxColor>,
2187    #[serde(
2188        rename = "x14:colorNegative",
2189        default,
2190        skip_serializing_if = "Option::is_none"
2191    )]
2192    pub color_negative: Option<XlsxColor>,
2193    #[serde(
2194        rename = "x14:colorAxis",
2195        default,
2196        skip_serializing_if = "Option::is_none"
2197    )]
2198    pub color_axis: Option<XlsxColor>,
2199    #[serde(
2200        rename = "x14:colorMarkers",
2201        default,
2202        skip_serializing_if = "Option::is_none"
2203    )]
2204    pub color_markers: Option<XlsxColor>,
2205    #[serde(
2206        rename = "x14:colorFirst",
2207        default,
2208        skip_serializing_if = "Option::is_none"
2209    )]
2210    pub color_first: Option<XlsxColor>,
2211    #[serde(
2212        rename = "x14:colorLast",
2213        default,
2214        skip_serializing_if = "Option::is_none"
2215    )]
2216    pub color_last: Option<XlsxColor>,
2217    #[serde(
2218        rename = "x14:colorHigh",
2219        default,
2220        skip_serializing_if = "Option::is_none"
2221    )]
2222    pub color_high: Option<XlsxColor>,
2223    #[serde(
2224        rename = "x14:colorLow",
2225        default,
2226        skip_serializing_if = "Option::is_none"
2227    )]
2228    pub color_low: Option<XlsxColor>,
2229    #[serde(rename = "x14:sparklines", default)]
2230    pub sparklines: XlsxX14Sparklines,
2231}
2232
2233/// x14 sparklines container.
2234#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
2235#[serde(rename = "x14:sparklines")]
2236pub struct XlsxX14Sparklines {
2237    #[serde(rename = "x14:sparkline", default)]
2238    pub sparkline: Vec<XlsxX14Sparkline>,
2239}
2240
2241/// x14 sparkline.
2242#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
2243#[serde(rename = "x14:sparkline")]
2244pub struct XlsxX14Sparkline {
2245    #[serde(rename = "xm:f", default)]
2246    pub f: String,
2247    #[serde(rename = "xm:sqref", default)]
2248    pub sqref: String,
2249}
2250
2251// ------------------------------------------------------------------
2252// Public API types
2253// ------------------------------------------------------------------
2254
2255/// Data validation rule settings.
2256#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
2257pub struct DataValidation {
2258    pub allow_blank: bool,
2259    pub error: Option<String>,
2260    pub error_style: Option<String>,
2261    pub error_title: Option<String>,
2262    pub operator: String,
2263    pub prompt: Option<String>,
2264    pub prompt_title: Option<String>,
2265    pub show_drop_down: bool,
2266    pub show_error_message: bool,
2267    pub show_input_message: bool,
2268    pub sqref: String,
2269    pub r#type: String,
2270    pub formula1: String,
2271    pub formula2: String,
2272}
2273
2274/// Sparkline settings.
2275#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2276pub struct SparklineOptions {
2277    pub location: Vec<String>,
2278    pub range: Vec<String>,
2279    pub max: i64,
2280    pub cust_max: i64,
2281    pub min: i64,
2282    pub cust_min: i64,
2283    pub r#type: String,
2284    pub weight: f64,
2285    pub date_axis: bool,
2286    pub markers: bool,
2287    pub high: bool,
2288    pub low: bool,
2289    pub first: bool,
2290    pub last: bool,
2291    pub negative: bool,
2292    pub axis: bool,
2293    pub hidden: bool,
2294    pub reverse: bool,
2295    pub style: i64,
2296    pub series_color: String,
2297    pub negative_color: String,
2298    pub markers_color: String,
2299    pub first_color: String,
2300    pub last_color: String,
2301    pub hight_color: String,
2302    pub low_color: String,
2303    pub empty_cells: String,
2304}
2305
2306/// Worksheet selection.
2307#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
2308pub struct Selection {
2309    pub sqref: String,
2310    pub active_cell: String,
2311    pub pane: String,
2312}
2313
2314/// Pane settings.
2315#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
2316pub struct Panes {
2317    pub freeze: bool,
2318    pub split: bool,
2319    pub x_split: i64,
2320    pub y_split: i64,
2321    pub top_left_cell: String,
2322    pub active_pane: String,
2323    pub selection: Vec<Selection>,
2324}
2325
2326/// Conditional format settings.
2327#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2328pub struct ConditionalFormatOptions {
2329    pub r#type: String,
2330    pub above_average: bool,
2331    pub percent: bool,
2332    pub format: Option<i64>,
2333    pub criteria: String,
2334    pub value: String,
2335    pub min_type: String,
2336    pub mid_type: String,
2337    pub max_type: String,
2338    pub min_value: String,
2339    pub mid_value: String,
2340    pub max_value: String,
2341    pub min_color: String,
2342    pub mid_color: String,
2343    pub max_color: String,
2344    pub bar_color: String,
2345    pub bar_border_color: String,
2346    pub bar_direction: String,
2347    pub bar_only: bool,
2348    pub bar_solid: bool,
2349    pub icon_style: String,
2350    pub reverse_icons: bool,
2351    pub icons_only: bool,
2352    pub stop_if_true: bool,
2353}
2354
2355/// Worksheet protection settings.
2356#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
2357pub struct SheetProtectionOptions {
2358    pub algorithm_name: String,
2359    pub auto_filter: bool,
2360    pub delete_columns: bool,
2361    pub delete_rows: bool,
2362    pub edit_objects: bool,
2363    pub edit_scenarios: bool,
2364    pub format_cells: bool,
2365    pub format_columns: bool,
2366    pub format_rows: bool,
2367    pub insert_columns: bool,
2368    pub insert_hyperlinks: bool,
2369    pub insert_rows: bool,
2370    pub password: String,
2371    pub pivot_tables: bool,
2372    pub select_locked_cells: bool,
2373    pub select_unlocked_cells: bool,
2374    pub sort: bool,
2375}
2376
2377/// Header and footer settings.
2378#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
2379pub struct HeaderFooterOptions {
2380    pub align_with_margins: Option<bool>,
2381    pub different_first: bool,
2382    pub different_odd_even: bool,
2383    pub scale_with_doc: Option<bool>,
2384    pub odd_header: String,
2385    pub odd_footer: String,
2386    pub even_header: String,
2387    pub even_footer: String,
2388    pub first_header: String,
2389    pub first_footer: String,
2390}
2391
2392/// Page layout margin settings.
2393#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2394pub struct PageLayoutMarginsOptions {
2395    pub bottom: Option<f64>,
2396    pub footer: Option<f64>,
2397    pub header: Option<f64>,
2398    pub left: Option<f64>,
2399    pub right: Option<f64>,
2400    pub top: Option<f64>,
2401    pub horizontally: Option<bool>,
2402    pub vertically: Option<bool>,
2403}
2404
2405/// Page layout settings.
2406#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2407pub struct PageLayoutOptions {
2408    pub size: Option<i64>,
2409    pub orientation: Option<String>,
2410    pub first_page_number: Option<u64>,
2411    pub adjust_to: Option<u64>,
2412    pub fit_to_height: Option<i64>,
2413    pub fit_to_width: Option<i64>,
2414    pub black_and_white: Option<bool>,
2415    pub page_order: Option<String>,
2416}
2417
2418/// Sheet view settings.
2419#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2420pub struct ViewOptions {
2421    pub default_grid_color: Option<bool>,
2422    pub right_to_left: Option<bool>,
2423    pub show_formulas: Option<bool>,
2424    pub show_grid_lines: Option<bool>,
2425    pub show_row_col_headers: Option<bool>,
2426    pub show_ruler: Option<bool>,
2427    pub show_zeros: Option<bool>,
2428    pub top_left_cell: Option<String>,
2429    pub view: Option<String>,
2430    pub zoom_scale: Option<f64>,
2431}
2432
2433/// Worksheet properties options.
2434#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
2435pub struct SheetPropsOptions {
2436    pub code_name: Option<String>,
2437    pub enable_format_conditions_calculation: Option<bool>,
2438    pub published: Option<bool>,
2439    pub auto_page_breaks: Option<bool>,
2440    pub fit_to_page: Option<bool>,
2441    pub tab_color_indexed: Option<i64>,
2442    pub tab_color_rgb: Option<String>,
2443    pub tab_color_theme: Option<i64>,
2444    pub tab_color_tint: Option<f64>,
2445    pub outline_summary_below: Option<bool>,
2446    pub outline_summary_right: Option<bool>,
2447    pub base_col_width: Option<u8>,
2448    pub default_col_width: Option<f64>,
2449    pub default_row_height: Option<f64>,
2450    pub custom_height: Option<bool>,
2451    pub zero_height: Option<bool>,
2452    pub thick_top: Option<bool>,
2453    pub thick_bottom: Option<bool>,
2454}