Skip to main content

CalculationProperties

Struct CalculationProperties 

Source
pub struct CalculationProperties {
    pub mode: Option<CalculationMode>,
    pub iterate: bool,
}
Expand description

Workbook-wide calculation properties (<calcPr>, CT_CalcPr). This crate never evaluates formulas itself (see CellValue::Formula’s doc comment) — these settings are pure storage, telling Excel how to recalculate once the file is opened, same “storage, not evaluation” posture as a formula’s own text.

Fields§

§mode: Option<CalculationMode>

The recalculation mode. None leaves Excel’s own default (automatic).

§iterate: bool

Enables iterative calculation, needed for formulas with intentional circular references (<calcPr iterate="1">) — without this, Excel refuses to open a file containing a genuine circular reference without warning the user first.

Implementations§

Source§

impl CalculationProperties

Source

pub fn new() -> CalculationProperties

Calculation properties with Excel’s own defaults (automatic mode, no iterative calculation) — only useful as a starting point for the with_* builders, since this is equivalent to leaving Workbook.calculation as None entirely.

Examples found in repository?
examples/xlsx_workbook_metadata.rs (line 56)
16fn main() -> office_toolkit::Result<()> {
17    let path = output_path("xlsx_workbook_metadata.xlsx");
18
19    let named_ranges_sheet = Sheet::new("Named ranges")
20        .with_row(Row::new().with_text("Tax rate").with_number(0.0825))
21        .with_row(Row::new().with_cell(Cell::formula("TaxRate*100").with_cached_value(8.25)));
22
23    let calculation_sheet = Sheet::new("Calculation").with_row(
24        Row::new().with_text("Set to manual recalculation with iterative calculation enabled."),
25    );
26
27    let scenarios_sheet = Sheet::new("Scenarios")
28        .with_row(Row::new().with_text("Revenue").with_number(100_000.0))
29        .with_row(Row::new().with_text("Cost").with_number(60_000.0))
30        .with_scenario(
31            Scenario::new("Best case")
32                .with_input("B1", "150000")
33                .with_input("B2", "55000")
34                .with_comment("Optimistic projection"),
35        )
36        .with_scenario(
37            Scenario::new("Worst case")
38                .with_input("B1", "70000")
39                .with_input("B2", "65000"),
40        );
41
42    let auto_filter_sheet = Sheet::new("Autofilter criteria")
43        .with_row(Row::new().with_text("Region"))
44        .with_row(Row::new().with_text("North"))
45        .with_row(Row::new().with_text("South"))
46        .with_auto_filter_range("A1:A3")
47        .with_auto_filter_column(AutoFilterColumn::new(0, vec!["North".to_string()]));
48
49    let ignored_errors_sheet = Sheet::new("Ignored errors")
50        .with_row(Row::new().with_text("123")) // a number stored as text — normally flagged by Excel
51        .with_ignored_error(IgnoredError::new("A1:A1").with_number_stored_as_text(true));
52
53    let workbook = Workbook::new()
54        .with_defined_name(DefinedName::new("TaxRate", "'Named ranges'!$B$1"))
55        .with_calculation(
56            CalculationProperties::new()
57                .with_mode(CalculationMode::Manual)
58                .with_iterate(true),
59        )
60        .with_sheet(named_ranges_sheet)
61        .with_sheet(calculation_sheet)
62        .with_sheet(scenarios_sheet)
63        .with_sheet(auto_filter_sheet)
64        .with_sheet(ignored_errors_sheet);
65
66    // `Workbook.properties` has no `with_*` builder — it's set directly,
67    // like any other public field.
68    let properties = DocumentProperties::new()
69        .with_title("Metadata example")
70        .with_author("Example Author")
71        .with_subject("Workbook-level features")
72        .with_custom_property(
73            "ProjectCode",
74            CustomPropertyValue::Text("XLSX-META".to_string()),
75        );
76    let workbook = Workbook {
77        properties,
78        ..workbook
79    };
80
81    workbook.save_to_file(&path)?;
82    println!("Wrote {}", path.display());
83    Ok(())
84}
Source

pub fn with_mode(self, mode: CalculationMode) -> CalculationProperties

Sets the recalculation mode and returns the properties for chaining.

Examples found in repository?
examples/xlsx_workbook_metadata.rs (line 57)
16fn main() -> office_toolkit::Result<()> {
17    let path = output_path("xlsx_workbook_metadata.xlsx");
18
19    let named_ranges_sheet = Sheet::new("Named ranges")
20        .with_row(Row::new().with_text("Tax rate").with_number(0.0825))
21        .with_row(Row::new().with_cell(Cell::formula("TaxRate*100").with_cached_value(8.25)));
22
23    let calculation_sheet = Sheet::new("Calculation").with_row(
24        Row::new().with_text("Set to manual recalculation with iterative calculation enabled."),
25    );
26
27    let scenarios_sheet = Sheet::new("Scenarios")
28        .with_row(Row::new().with_text("Revenue").with_number(100_000.0))
29        .with_row(Row::new().with_text("Cost").with_number(60_000.0))
30        .with_scenario(
31            Scenario::new("Best case")
32                .with_input("B1", "150000")
33                .with_input("B2", "55000")
34                .with_comment("Optimistic projection"),
35        )
36        .with_scenario(
37            Scenario::new("Worst case")
38                .with_input("B1", "70000")
39                .with_input("B2", "65000"),
40        );
41
42    let auto_filter_sheet = Sheet::new("Autofilter criteria")
43        .with_row(Row::new().with_text("Region"))
44        .with_row(Row::new().with_text("North"))
45        .with_row(Row::new().with_text("South"))
46        .with_auto_filter_range("A1:A3")
47        .with_auto_filter_column(AutoFilterColumn::new(0, vec!["North".to_string()]));
48
49    let ignored_errors_sheet = Sheet::new("Ignored errors")
50        .with_row(Row::new().with_text("123")) // a number stored as text — normally flagged by Excel
51        .with_ignored_error(IgnoredError::new("A1:A1").with_number_stored_as_text(true));
52
53    let workbook = Workbook::new()
54        .with_defined_name(DefinedName::new("TaxRate", "'Named ranges'!$B$1"))
55        .with_calculation(
56            CalculationProperties::new()
57                .with_mode(CalculationMode::Manual)
58                .with_iterate(true),
59        )
60        .with_sheet(named_ranges_sheet)
61        .with_sheet(calculation_sheet)
62        .with_sheet(scenarios_sheet)
63        .with_sheet(auto_filter_sheet)
64        .with_sheet(ignored_errors_sheet);
65
66    // `Workbook.properties` has no `with_*` builder — it's set directly,
67    // like any other public field.
68    let properties = DocumentProperties::new()
69        .with_title("Metadata example")
70        .with_author("Example Author")
71        .with_subject("Workbook-level features")
72        .with_custom_property(
73            "ProjectCode",
74            CustomPropertyValue::Text("XLSX-META".to_string()),
75        );
76    let workbook = Workbook {
77        properties,
78        ..workbook
79    };
80
81    workbook.save_to_file(&path)?;
82    println!("Wrote {}", path.display());
83    Ok(())
84}
Source

pub fn with_iterate(self, iterate: bool) -> CalculationProperties

Enables iterative calculation and returns the properties for chaining.

Examples found in repository?
examples/xlsx_workbook_metadata.rs (line 58)
16fn main() -> office_toolkit::Result<()> {
17    let path = output_path("xlsx_workbook_metadata.xlsx");
18
19    let named_ranges_sheet = Sheet::new("Named ranges")
20        .with_row(Row::new().with_text("Tax rate").with_number(0.0825))
21        .with_row(Row::new().with_cell(Cell::formula("TaxRate*100").with_cached_value(8.25)));
22
23    let calculation_sheet = Sheet::new("Calculation").with_row(
24        Row::new().with_text("Set to manual recalculation with iterative calculation enabled."),
25    );
26
27    let scenarios_sheet = Sheet::new("Scenarios")
28        .with_row(Row::new().with_text("Revenue").with_number(100_000.0))
29        .with_row(Row::new().with_text("Cost").with_number(60_000.0))
30        .with_scenario(
31            Scenario::new("Best case")
32                .with_input("B1", "150000")
33                .with_input("B2", "55000")
34                .with_comment("Optimistic projection"),
35        )
36        .with_scenario(
37            Scenario::new("Worst case")
38                .with_input("B1", "70000")
39                .with_input("B2", "65000"),
40        );
41
42    let auto_filter_sheet = Sheet::new("Autofilter criteria")
43        .with_row(Row::new().with_text("Region"))
44        .with_row(Row::new().with_text("North"))
45        .with_row(Row::new().with_text("South"))
46        .with_auto_filter_range("A1:A3")
47        .with_auto_filter_column(AutoFilterColumn::new(0, vec!["North".to_string()]));
48
49    let ignored_errors_sheet = Sheet::new("Ignored errors")
50        .with_row(Row::new().with_text("123")) // a number stored as text — normally flagged by Excel
51        .with_ignored_error(IgnoredError::new("A1:A1").with_number_stored_as_text(true));
52
53    let workbook = Workbook::new()
54        .with_defined_name(DefinedName::new("TaxRate", "'Named ranges'!$B$1"))
55        .with_calculation(
56            CalculationProperties::new()
57                .with_mode(CalculationMode::Manual)
58                .with_iterate(true),
59        )
60        .with_sheet(named_ranges_sheet)
61        .with_sheet(calculation_sheet)
62        .with_sheet(scenarios_sheet)
63        .with_sheet(auto_filter_sheet)
64        .with_sheet(ignored_errors_sheet);
65
66    // `Workbook.properties` has no `with_*` builder — it's set directly,
67    // like any other public field.
68    let properties = DocumentProperties::new()
69        .with_title("Metadata example")
70        .with_author("Example Author")
71        .with_subject("Workbook-level features")
72        .with_custom_property(
73            "ProjectCode",
74            CustomPropertyValue::Text("XLSX-META".to_string()),
75        );
76    let workbook = Workbook {
77        properties,
78        ..workbook
79    };
80
81    workbook.save_to_file(&path)?;
82    println!("Wrote {}", path.display());
83    Ok(())
84}

Trait Implementations§

Source§

impl Clone for CalculationProperties

Source§

fn clone(&self) -> CalculationProperties

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for CalculationProperties

Source§

impl Debug for CalculationProperties

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Default for CalculationProperties

Source§

fn default() -> CalculationProperties

Returns the “default value” for a type. Read more
Source§

impl PartialEq for CalculationProperties

Source§

fn eq(&self, other: &CalculationProperties) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for CalculationProperties

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.