Open a spreadsheet document for read-only access
Use SpreadsheetDocument to open an .xlsx package and inspect its workbook and worksheet parts. In ooxmlsdk, opening a package does not modify it; changes are persisted only when you call a save method.
For read-only inspection, open the package and avoid saving it.
Open and inspect worksheet parts
#![allow(unused)] fn main() { use std::collections::BTreeMap; use std::io::Cursor; use std::path::Path; use ooxmlsdk::parts::chart_part::ChartPart; use ooxmlsdk::parts::drawings_part::DrawingsPart; use ooxmlsdk::parts::ribbon_extensibility_part::RibbonExtensibilityPart; use ooxmlsdk::parts::spreadsheet_document::SpreadsheetDocument; use ooxmlsdk::parts::table_definition_part::TableDefinitionPart; use ooxmlsdk::parts::workbook_part::WorkbookPart; use ooxmlsdk::parts::worksheet_part::WorksheetPart; use ooxmlsdk::sdk::{OpenSettings, PackageOpenMode, SdkPart, SpreadsheetDocumentType}; #[derive(Debug, Clone, Eq, PartialEq)] pub struct FormulaCell { pub reference: String, pub formula: String, pub cached_value: Option<String>, } #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub struct PivotTablePartCounts { pub worksheet_pivot_tables: usize, pub workbook_pivot_caches: usize, } pub fn open_spreadsheet_read_only(path: &Path) -> Result<usize, Box<dyn std::error::Error>> { let document = SpreadsheetDocument::new_from_file_with_settings(path, lazy_settings())?; let workbook_part = document.workbook_part()?; Ok(workbook_part.worksheet_parts(&document).count()) } }
The example uses lazy package opening:
OpenSettings { open_mode: PackageOpenMode::Lazy, ..Default::default() }SpreadsheetDocument::new_from_file_with_settingsworkbook_part()worksheet_parts(&document)
Lazy opening is useful for inspection helpers because it lets you navigate the package model without parsing every root element up front. PackageOpenMode controls typed-root loading, not read/write permissions.
The same read-only pattern applies whether the input comes from a file path or a seekable reader. Unlike the upstream editable flag, ooxmlsdk uses Rust mutability and an explicit save operation: keep the package binding immutable and do not call a save method when the caller only needs information.
Spreadsheet package structure
A SpreadsheetML package stores the main workbook in xl/workbook.xml. Worksheets are separate parts, usually under xl/worksheets/, and the workbook part owns relationships to those worksheet parts.
Use relationships and typed part accessors instead of hard-coding ZIP paths whenever possible.
At minimum, a valid spreadsheet package has a workbook part and at least one worksheet part. The workbook is the container for document-level state, while worksheet parts store the grid content as SpreadsheetML XML.