This audit maps the Microsoft Office feature surface — Word, Excel, PowerPoint, Access — against what the zoffice engine actually implements today. Granularity is the feature group (styles, charts, track-changes, pivot tables…), not the individual menu command; a command-level list would run to thousands of rows and obscure the shape. Every zoffice status below is grounded in an engine symbol read directly from src/writer.rs, src/calc.rs, src/impress.rs and src/base.rs, cross-checked against the source-derived engineering report.
The single most important finding is a read / write asymmetry. zoffice is a comprehensive, high-fidelity reader of ODF and OOXML across all six apps, and a WYSIWYG viewer in the desktop shell. It is not yet a full authoring suite: writing splits into three tiers, and only the narrowest one is lossless. Read that asymmetry first, then the per-app tables.
Tier 1 — Read
FULL. All six apps parse real ODF/OOXML packages: text, formatting, tables, styles, charts, animations, formulas, database catalogs. This is where zoffice is strongest — close to LibreOffice-grade coverage on the read path.
Tier 2 — Lossless patch
NARROW. replace_lossless (find/replace) and set_cell_lossless (single cell) edit the original package XML in place, preserving all formatting — but only for those narrow operations.
Tier 3 — Full save
CLOSING. Full-save fidelity is being closed incrementally. save_xlsx preserves formulas, merged cells, named ranges and number-vs-text cell types, and save_ods now writes the ODF spreadsheet with the same fidelity as xlsx (values, number/text types, formulas, merged ranges, named ranges); save_docx / save_odt preserve every paragraph property (alignment, indent, spacing, shading, page-break, heading & list level) and full run-level character formatting (bold, italic, underline, strike, font, size, color, caps, super/subscript, letter-spacing). Still dropped: cell number-formats / styles, tables, images.
✓ implemented / full ◐ partial — read-only, compute-only, or narrow ○ absent
Summary by component
| Component | MS app | Read | Write / edit | Estimated parity |
|---|---|---|---|---|
| Calc | Excel | ✓ full — 300+ functions, formula eval | ◐ 1-cell lossless; full save (xlsx + ods) keeps formulas/merges/named-ranges/types | ~55% (read-weighted) |
| Writer | Word | ✓ full — all structures parsed | ◐ find/replace lossless; full save keeps paragraph properties | ~35% |
| Impress | PowerPoint | ✓ full — slides, animations, media | ◐ text + positioned shapes save (pptx + odp) + add slide | ~25% |
| Base | Access | ◐ .odb only, embedded HSQLDB | ○ no DDL/DML write | ~10% |
Parity figures are estimates weighted toward the read path; treat them as directional, not measured. The per-feature rows below are the ground truth.
Excel → Calc
reads .xlsx / .xls / .ods / .fods / .csv · engine: src/calc.rs
| Feature group | Excel | zoffice Calc | Evidence / note |
|---|---|---|---|
| Open formats | xlsx, xls, ods, csv | ✓ xlsx, xls, ods, fods, csv | full OOXML + ODF + legacy OLE2 read |
| Save formats | full-fidelity | ◐ xlsx and ods both keep formulas + merges + named ranges + numeric types; 1-cell lossless | save_xlsx writes <f>/<v>/mergeCells/definedNames; save_ods writes table:formula/spanned merges/table:named-expressions; number-formats + styles still dropped |
| Formula engine | ~480 functions | ✓ 300+ functions, recursive-descent eval | math, stats, financial, date, text, lookup, database, engineering, logical, info families |
| Dynamic arrays / spill | FILTER, SORT, UNIQUE, SEQUENCE | ✓ implemented | Excel-365 dynamic-array family present |
| Matrix functions | MMULT, MINVERSE, TRANSPOSE | ✓ implemented | MMULT / MINVERSE / MUNIT / MDETERM / TRANSPOSE |
| Number formatting | custom format codes | ✓ parsed + applied on display | number_formats, format-code engine |
| Named ranges | full | ✓ parsed + resolved | named_ranges_with_refs |
| Merged cells | full | ✓ read | enumerated |
| Comments / notes | full | ✓ read | calc.comments |
| Conditional formatting | full editor | ◐ read-only, not editable | conditional_formats enumerates rules |
| Data validation | full | ◐ read-only, not editable | data_validations |
| Charts | 50+ types, editable | ◐ read + render data, no edit | charts_render / charts_detail |
| PivotTables | full drag-drop builder | ◐ compute only, no builder | pivot_compute / pivot_compute_multi |
| Frozen panes | full | ◐ read flag only | has_frozen_panes |
| Sheet protection | full | ◐ read/enumerated | sheet_protections |
| Worksheet insert / delete | full | ○ absent | no add/remove sheet API |
| Sparklines | full | ○ absent | — |
| Slicers / timelines | full | ○ absent | — |
| Macros (VBA) | full | ○ absent | — |
| Power Query / Power Pivot | full | ○ absent | — |
| Solver / Goal Seek | full | ○ absent | — |
| Export | ✓ PDF, HTML, Markdown, CSV | calc.pdf, to_html/to_markdown/to_csv |
Word → Writer
reads .odt / .docx / .doc / .rtf / .fodt · engine: src/writer.rs
| Feature group | Word | zoffice Writer | Evidence / note |
|---|---|---|---|
| Open formats | docx, doc, rtf, odt, txt | ✓ odt, docx, doc, rtf, fodt | OOXML + ODF + legacy OLE2 + RTF read |
| Save formats | full-fidelity | ◐ docx/odt keep all paragraph props; find/replace lossless | save_docx / save_odt write alignment/indent/spacing/shading/page-break/heading/list; run-level char formatting + tables still dropped |
| Character formatting | full | ✓ read | bold, italic, underline, strike, color, highlight, font, size, super/subscript, caps — writer.rs:80 |
| Paragraph formatting | full | ✓ read | alignment, indent, spacing, shading, page breaks |
| Tables | full | ✓ read | cells, borders, colors, merges, row/col spans |
| Lists | full | ✓ read | nesting levels, ordered vs bullet |
| Images (inline) | full | ✓ read | inline_images |
| Headers / footers | full | ✓ read | headers_footers |
| Hyperlinks / bookmarks | full | ✓ read | hyperlinks_with_text, bookmark_text |
| Comments | full | ✓ read | comment_details |
| Footnotes / endnotes | full | ✓ read | footnotes |
| Content controls / form fields | full | ✓ read | content_controls |
| Styles | full catalog + edit | ◐ read catalog, not editable | distinct paragraph styles enumerated |
| Track changes | full accept/reject | ◐ read authors + counts, no accept/reject | revision_authors, writer.rs:331 |
| Mail merge | full execute | ◐ fields extracted, not executed | merge_fields |
| In-place editing | full WYSIWYG | ○ absent | no inline edit; whole-document replace only |
| TOC / references / citations | full | ○ absent | no TOC/citation generation |
| Spell / grammar check | full | ○ absent | — |
| Macros (VBA) | full | ○ absent | — |
| Export | ✓ PDF, HTML, Markdown | writer.pdf, to_html/to_markdown |
PowerPoint → Impress
reads .pptx / .odp / .ppt / .fodp · engine: src/impress.rs
| Feature group | PowerPoint | zoffice Impress | Evidence / note |
|---|---|---|---|
| Open formats | pptx, ppt, odp | ✓ pptx, odp, ppt, fodp | OOXML + ODF + legacy binary read |
| Save formats | full-fidelity | ◐ pptx + odp minimal text-shape | save_pptx / save_odp |
| Slides | full | ✓ read + add blank | add_slide appends empty |
| Slide delete / reorder | full | ○ absent | no delete_slide / reorder |
| Layouts / masters | full + edit | ◐ read, not editable | layout_names, master_count |
| Placeholders | full | ✓ read | layout_placeholders |
| Shapes | full + edit | ◐ read geometry + text; positioned shapes written back on save | x/y/w/h positioning read + written back (pptx + odp) |
| Text extraction | full | ✓ read | plain_text |
| Media (audio / video) | full | ✓ read | embedded clips per slide, impress.rs:111 |
| Tables on slides | full | ✓ read | rows × columns |
| Speaker notes | full | ✓ read | per-slide notes |
| WordArt | full | ✓ read | text + warp preset |
| Charts | full | ◐ read + render, no edit | charts_render |
| Animations | full | ◐ read effect types, no edit | animations, impress.rs:851 |
| Transitions | full | ◐ read effect types, no edit | transitions, impress.rs:827 |
| SmartArt / diagrams | full | ○ stub — enumerated, not rendered | impress.rs:640 |
| Master editing | full | ○ absent (read-only) | — |
| Slideshow / presenter view | full | ○ absent | no live present mode |
| Export | ✓ PDF, HTML, Markdown | impress.pdf |
Access → Base
reads .odb (embedded HSQLDB) · engine: src/base.rs
| Feature group | Access | zoffice Base | Evidence / note |
|---|---|---|---|
| Open formats | accdb, mdb | ◐ .odb only | no Access-native accdb/mdb reader |
| Table catalog + data | full | ✓ read (embedded HSQLDB) | base.rs:106; INSERT rows from HSQLDB script |
| SQL SELECT execution | full | ✓ over embedded store | query(), base.rs:129 |
| Schema / foreign keys | full | ✓ read | hsqldb_script → CREATE TABLE / FK |
| Query designer | full visual | ◐ catalog + run, no designer | saved queries listed |
| Forms / reports | full designer | ◐ catalog names only | base.rs:115 |
| External DSN / ODBC | full | ◐ catalog visible, not queryable | connection URI parsed |
| Write (DDL / DML) | full | ○ absent | no table/query/form edit |
zoffice extras (no direct MS app)
LibreOffice ships Draw and Math as standalone apps; Microsoft folds those roles into Publisher/Visio and Word's equation editor. zoffice implements both as read + export engines, plus two shell features Microsoft Office has no equivalent for.
| Capability | zoffice | Evidence / note |
|---|---|---|
| Draw (vector graphics) | ◐ read .odg + SVG export + save .odg with shape geometry, no in-place edit | shapes, layers, gradients, connectors; export_svg / save_odg (rect/ellipse/line/… with svg:x/y/w/h) |
| Math (formula editor) | ◐ read StarMath → MathML, no edit | math.render, to_starmath |
| Embedded terminal | ✓ PTY shell in-app | zpwr-embed-terminal; Office has none |
| Command palette | ✓ ⌘K fzf-ranked | app.js:1568; beyond Office "Tell me" |
Cross-cutting
| Feature | MS Office | zoffice | Note |
|---|---|---|---|
| PDF export | full | ✓ all apps | wkhtmltopdf backend |
| Localization (i18n) | full | ✓ 29 locales | zpwr-i18n runtime |
| Print dialog | full | ○ absent | PDF export only, no print UI |
| Save button (desktop app) | full | ○ stub | engine save() exists; no app Save wiring |
| Cloud co-authoring | full | ○ absent | — |
| Macros / scripting (VBA) | full | ○ absent | — |
| Accessibility (screen reader) | full | ○ unverified | not audited in engine surface |
| Copilot / generative AI | present | ○ absent | MS Copilot state is past my knowledge cutoff — flagged, not independently verified |
Reading this audit
The tables describe an embeddable document engine, not a shipped consumer suite — zoffice-core exists to be linked into Rust/Tauri hosts and over a C ABI, so its center of gravity is parsing + rendering + narrow lossless edits, with full authoring deliberately downstream. Where a row reads ◐ read-only, the data model for that feature is fully parsed and available to a host; what is missing is a mutate-and-serialize path that preserves it. The realistic near-term arc is Tier 2 (lossless patch) widening to cover more edit operations before Tier 3 (full save) becomes fidelity-preserving. Two claims here are not source-grounded and are marked as such: the estimated parity percentages (directional), and Microsoft Copilot's current state (past knowledge cutoff).