ZOFFICE // MICROSOFT OFFICE — FEATURE AUDIT

// what Word · Excel · PowerPoint · Access do, mapped against what the zoffice engine implements — status derived from source symbols, not asserted

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), full run-level character formatting (bold, italic, underline, strike, font, size, color, caps, super/subscript, letter-spacing, hyperlinks), and tables with cell merges, shading and page geometry. Still dropped: Calc cell number-formats / styles, and images.

implemented / full partial — read-only, compute-only, or narrow absent

Summary by component

ComponentMS appReadWrite / editEstimated parity
CalcExcel✓ full — 300+ functions, formula eval 1-cell lossless; full save (xlsx + ods) keeps formulas/merges/named-ranges/types~55% (read-weighted)
WriterWord✓ full — all structures parsed find/replace + table-cell lossless; full save keeps paragraph properties, run formatting and tables~35%
ImpressPowerPoint✓ full — slides, animations, media text + positioned shapes save (pptx + odp) · add / delete / reorder slide~25%
BaseAccess .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 groupExcelzoffice CalcEvidence / note
Open formatsxlsx, xls, ods, csv xlsx, xls, ods, fods, csvfull OOXML + ODF + legacy OLE2 read
Save formatsfull-fidelity xlsx and ods both keep formulas + merges + named ranges + numeric types; 1-cell losslesssave_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 evalmath, stats, financial, date, text, lookup, database, engineering, logical, info families
Dynamic arrays / spillFILTER, SORT, UNIQUE, SEQUENCE implementedExcel-365 dynamic-array family present
Matrix functionsMMULT, MINVERSE, TRANSPOSE implementedMMULT / MINVERSE / MUNIT / MDETERM / TRANSPOSE
Number formattingcustom format codes parsed + applied on displaynumber_formats, format-code engine
Named rangesfull parsed + resolvednamed_ranges_with_refs
Merged cellsfull readenumerated
Comments / notesfull readcalc.comments
Conditional formattingfull editor read-only, not editableconditional_formats enumerates rules
Data validationfull read-only, not editabledata_validations
Charts50+ types, editable read + render data, no editcharts_render / charts_detail
PivotTablesfull drag-drop builder compute only, no builderpivot_compute / pivot_compute_multi
Frozen panesfull read flag onlyhas_frozen_panes
Sheet protectionfull read/enumeratedsheet_protections
Worksheet insert / deletefull absentno add/remove sheet API
Sparklinesfull read, no editorsparklinesx14:sparklineGroups → kind + data range + location cell
Slicers / timelinesfull read, no editorslicersxl/slicers + xl/timelines → kind, name, caption
Macros (VBA)full modules extracted, not executedole2::vba_modules reads vbaProject.bin; no Basic interpreter
Power Query / Power Pivotfull absent
Solver / Goal Seekfull Goal Seek implemented; no Solvergoal_seek — single-input search against a target value
Root-cause attribution— (no MS equivalent) calc.rootcauserevision diff + dependency cone + counterfactual re-evaluation → ranked causes with contribution shares
Recalc critical path— (Trace Precedents is one hop) calc.critical_pathlongest formula dependency chain over the workbook DAG
Dependency blast radius— (Trace Dependents is one hop) calc.impact_maptransitive dependent count per cell + the keystone cell + the sheets it spans
Pre-commit blast-radius gate calc.cell_impactwhat one pending cell edit would recalculate, with the cell's exact keystone rank, before it commits; a format whose formulas are not retained reports unknown, never safe
ExportPDF PDF, HTML, Markdown, CSVcalc.pdf, to_html/to_markdown/to_csv

Word → Writer

reads .odt / .docx / .doc / .rtf / .fodt · engine: src/writer.rs

Feature groupWordzoffice WriterEvidence / note
Open formatsdocx, doc, rtf, odt, txt odt, docx, doc, rtf, fodtOOXML + ODF + legacy OLE2 + RTF read
Save formatsfull-fidelity docx/odt keep paragraph props, run formatting and tables; find/replace + table-cell losslesssave_docx / save_odt write alignment/indent/spacing/shading/page-break/heading/list, run bold/italic/underline/size/color/hyperlink, and w:tbl with cell merges + shading; images still dropped
Character formattingfull read + written backbold, italic, underline, strike, color, highlight, font, size, super/subscript, caps — Run
Paragraph formattingfull readalignment, indent, spacing, shading, page breaks
Tablesfull readcells, borders, colors, merges, row/col spans
Listsfull readnesting levels, ordered vs bullet
Images (inline)full readinline_images
Headers / footersfull readheaders_footers
Hyperlinks / bookmarksfull readhyperlinks_with_text, bookmark_text
Commentsfull readcomment_details
Footnotes / endnotesfull readfootnotes
Content controls / form fieldsfull readcontent_controls
Stylesfull catalog + edit read catalog, not editabledistinct paragraph styles enumerated
Track changesfull accept/reject read authors + accept / rejectrevision_authors, accept_revision, reject_revision
Mail mergefull execute fields extracted and executedmerge_fields enumerates; mail_merge substitutes a record into a copy of the document
In-place editingfull WYSIWYG structural edit, not WYSIWYGedit_paragraph / insert_paragraph / edit_table_cell / replace_lossless; no live layout-accurate editing surface
Page arranger— (Word has no page sorter) reorder pagesreorder_pages + the shared ZGui.arrange overlay in the desktop shell
TOC / references / citationsfull read, no generationtoc reads the TOC entries; bibliography reads citation sources; neither regenerates the field
Spell / grammar checkfull spell only, caller-supplied dictionaryspell_check — no bundled dictionaries, no grammar model
Macros (VBA)full modules extracted, not executedole2::vba_modules; no Basic interpreter
Structural merge / blame— (opaque blob to git) writer.merge3, writer.blamegit-native 3-way structural merge driver + per-paragraph revision attribution
ExportPDF PDF, HTML, Markdownwriter.pdf, to_html/to_markdown

PowerPoint → Impress

reads .pptx / .odp / .ppt / .fodp · engine: src/impress.rs

Feature groupPowerPointzoffice ImpressEvidence / note
Open formatspptx, ppt, odp pptx, odp, ppt, fodpOOXML + ODF + legacy binary read
Save formatsfull-fidelity pptx + odp text and positioned shapessave_pptx / save_odp write each shape's text plus its x/y/w/h; masters, media and charts are not re-emitted
Slidesfull read + add blankadd_slide appends empty
Slide delete / reorderfull delete + slide-sorter reorderdelete_slide (drops the slide with its notes), reorder_slides + the shared ZGui.arrange overlay
Layouts / mastersfull + edit read, not editablelayout_names, master_count
Placeholdersfull readplaceholders
Shapesfull + edit read geometry + text; positioned shapes written back on savex/y/w/h positioning read + written back (pptx + odp)
Text extractionfull readplain_text
Media (audio / video)full readembedded clips per slide — media
Tables on slidesfull readrows × columns
Speaker notesfull readper-slide notes
WordArtfull readtext + warp preset
Chartsfull read + render, no editcharts_render
Animationsfull read effect types, no editanimations
Transitionsfull read effect types, no edittransitions
SmartArt / diagramsfull enumerated, not renderedsmartart extracts each dgm:pt node text; no diagram layout/render engine
Master editingfull absent (read-only)
Slideshow / presenter viewfull presenter data, no live showpresenter_view builds the presenter model (current + next slide text, notes, slide N of M); no full-screen present mode
ExportPDF PDF, HTML, Markdownimpress.pdf

Access → Base

reads .odb (embedded HSQLDB) · engine: src/base.rs

Feature groupAccesszoffice BaseEvidence / note
Open formatsaccdb, mdb .odb onlyno Access-native accdb/mdb reader
Table catalog + datafull read (embedded HSQLDB)list_tables, table_rows — INSERT rows from the HSQLDB script
SQL SELECT executionfull over embedded storequery, run_query, run_query_with_params, run_saved_query
Schema / foreign keysfull readhsqldb_script → CREATE TABLE / FK; table_schema, table_constraints, relationships, indexes, views, triggers, sequences
Query designerfull visual catalog + run, no designerlist_queries, query_definitions, run_saved_query
Forms / reportsfull designer catalog names + metadata onlylist_forms_reports, component_metadata
External DSN / ODBCfull catalog visible, not queryabledata_source parses the connection URI
Write (DDL / DML)full parsed, never persistedparse_dml reads INSERT / UPDATE / DELETE into a typed Dml; nothing writes an .odb back — the one remaining planned engine gap in Base

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.

CapabilityzofficeEvidence / note
Draw (vector graphics) read .odg + SVG export + save .odg with shape geometry, no in-place editshapes, layers, gradients, connectors; export_svg / save_odg (rect/ellipse/line/… with svg:x/y/w/h)
Math (formula editor) read StarMath → MathML, no editmath.render, to_starmath
Embedded terminal PTY shell in-appzpwr-embed-terminal; Office has none
Command palette ⌘K fzf-rankedcommandRegistry() in webui/app.js; beyond Office "Tell me"
Structural VCS (zmerge / zblame) git merge driver + per-paragraph blamewriter.merge3, writer.blame, scripts/git-zoffice-merge; Office treats .docx as an opaque blob
Formula-graph analysis critical path · blast radius · root causecalc.critical_path, calc.impact_map, calc.cell_impact, calc.rootcause; Excel's Trace arrows are one hop
Page / slide arrangers drag-reorder overlayDocument::reorder_pages + Presentation::reorder_slides, driven by the shared ZGui.arrange overlay; Word has no page sorter

Cross-cutting

FeatureMS OfficezofficeNote
PDF exportfull all appspure-Rust PDF 1.4 writer (src/pdf.rs, base-14 Helvetica) — no external converter, no spawned process
Localization (i18n)full 27 localeszpwr-i18n runtime; catalogs in crates/zpwr-i18n/i18n/
Print dialogfull absentPDF export only, no print UI
Save button (desktop app)full wiredoffice_save_text plus the per-app mutators among the shell's 169 registered Tauri commands
Cloud co-authoringfull absent
Macros / scripting (VBA)full modules extracted, not executedole2::vba_modules; no Basic interpreter
Package encryptionfull read + writeMS-OFFCRYPTO Agile + Standard (src/crypto.rs) and ODF package encryption (src/crypto_odf.rs), pure RustCrypto
Digital signaturesfull verify + sign (no signing UI)src/dsig.rsverify_part_digests (integrity), verify_signatures (RSA SignatureValue), verify_cert_chain, sign_ooxml / sign_odf; hand-rolled Canonical XML, no external C14N dep
Accessibility (screen reader)full unverifiednot audited in engine surface
Copilot / generative AIpresent absentMS 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).