The shared string table (xl/sharedStrings.xml).
Most cell text in a real workbook is stored by index into this table — a
cell with t="s" has a <v>N</v> that points at the Nth <si> entry.
Storage is ETS-backed: one :set table for index→string, another for
string→index. Lookups are O(1). Interns are O(1) and allocate nothing
beyond the single ETS row.
Because the tables are ETS, multiple %ExVEx.Workbook{} references
derived from the same ExVEx.open/1 or ExVEx.new/0 share the same
underlying SST state. This matches the sharing semantics of the
per-sheet cell tables so that string-valued cell mutations remain
internally consistent across workbook references.
Rich-text formatting (<r> runs, <rPr> properties) is flattened into
plain text at parse time. Phonetic annotations (<phoneticPr>,
<rPh>) are stripped from the parsed view. The original XML bytes
remain in the workbook's parts map so untouched rich content
round-trips even when ExVEx doesn't model it.
Summary
Functions
Releases the backing ETS tables. Call from ExVEx.close/1 when done.
Returns the index of a string in the table, adding it if it isn't there
yet. Returns {index, sst} — sst is the same struct (ETS mutation is
in-place), included so callers can treat this identically to the
Map-backed version.
Serialises the table back to an xl/sharedStrings.xml document.
Types
Functions
@spec close(t()) :: :ok
Releases the backing ETS tables. Call from ExVEx.close/1 when done.
@spec count(t()) :: non_neg_integer()
@spec intern(t(), String.t()) :: {non_neg_integer(), t()}
Returns the index of a string in the table, adding it if it isn't there
yet. Returns {index, sst} — sst is the same struct (ETS mutation is
in-place), included so callers can treat this identically to the
Map-backed version.
Serialises the table back to an xl/sharedStrings.xml document.