20 unstable releases (3 breaking)

new 0.4.7 Apr 12, 2026
0.4.6 Apr 11, 2026
0.3.9 Apr 7, 2026
0.2.0 Apr 6, 2026
0.1.0 Apr 6, 2026

#268 in Text processing

Download history 593/week @ 2026-04-04 1362/week @ 2026-04-11

1,959 downloads per month
Used in 13 crates

MIT license

200KB
5.5K SLoC

libreoffice-rs

libreoffice-rs is a pure-Rust, std-only monorepo that builds a serious foundation for an office suite:

  • Writer-like rich text documents with Markdown ingestion and TXT/HTML/SVG/PDF/ODT/DOCX export
  • Calc-like spreadsheets with a formula engine and CSV/HTML/SVG/PDF/ODS/XLSX export
  • Impress-like slide decks with HTML/SVG/PDF/ODP/PPTX export
  • Draw-like vector pages with SVG/PDF/ODG export
  • Math-like TeX-style formula parsing with MathML/SVG/PDF/ODF export
  • Base-like tabular data with SELECT / WHERE / ORDER BY / LIMIT queries and HTML/SVG/PDF/ODB export
  • ODF and OOXML packaging on top of a native Rust ZIP writer
  • A UNO-like service runtime with property maps, an event bus, and built-in services
  • A LibreOfficeKit-like in-process runtime (lo_lok): document handles, command dispatch, callbacks, tile rendering
  • A desktop application surface (lo_app): start center, templates, recent files, preferences, autosave + recovery, macro recording/replay, per-window HTML shells with menubar/toolbar/sidebar
  • A command-line front-end with office-demo and desktop-demo end-to-end commands

Important status note

This repository is not honest-to-goodness feature parity with LibreOffice. LibreOffice is a massive decades-old office suite with millions of lines of code, deep import/export compatibility, UI toolkits, rendering, printing, macros, scripting, accessibility, collaboration, databases, and platform integration. This codebase provides a coherent Rust architecture and a meaningful amount of real functionality, but it does not fully replace LibreOffice.

That said, it is intentionally structured to be a practical starting point rather than a toy:

  • every crate is pure Rust and uses only the standard library
  • ODF packages are written with a custom ZIP implementation
  • the spreadsheet engine parses and evaluates non-trivial formulas
  • the CLI can create/export actual .odt, .ods, .odp, .odg, .odf, and .odb-style archives

Benchmark Results vs Real LibreOffice

Tested against LibreOffice 26.2.2 on macOS (Apple Silicon). All generated documents were validated by opening/converting them with the real LibreOffice CLI (soffice --headless).

Speed Comparison

libreoffice-rs generates documents 19-62× faster than LibreOffice processes them. Sample numbers from tests/benchmark.sh:

Operation libreoffice-rs LibreOffice Speedup
10 paragraphs → ODT 30ms 710ms 24×
100 paragraphs → ODT 18ms 676ms 38×
1,000 paragraphs → ODT 23ms 886ms 39×
10 rows → ODS 19ms 656ms 35×
100 rows → ODS 17ms 577ms 34×
1,000 rows → ODS 27ms 680ms 25×
5,000 rows × 10 cols → ODS 68ms 1,139ms 17×

Multilingual Support

Language Generation Content Preserved through soffice round-trip
English (bold, italic, tables, links) ~20ms All text, formatting, tables
Chinese (中文, CJK characters) 18ms All characters, idioms, table data
Spanish (accents, ñ, ¿¡) 20ms All diacritics, special punctuation

Test Suite Totals

Suite Result
cargo test --workspace (unit tests) 57 passed / 0 failed
tests/libreoffice_integration.sh 35 passed / 0 failed
tests/office_demo_integration.sh (DOCX/XLSX/PPTX/ODT/ODS/ODP/ODG/ODF/ODB) 40 passed / 0 failed
tests/desktop_demo_integration.sh (lo_app desktop surface) 38 passed / 0 failed
tests/benchmark.sh (speed + accuracy + edge cases + multilingual) 88 passed / 0 failed

Per-Feature Accuracy (88/88 benchmark tests pass — 100%)

Writer (ODT) Features:

  • Bold → Strong style
  • Italic → Emphasis style
  • Inline code → Code style
  • Hyperlinks with URL and label
  • Unordered lists
  • Tables (arbitrary columns/rows)
  • Headings (all 6 levels)
  • Horizontal rules
  • Page breaks

Calc (ODS) Features:

  • Numeric, string, and boolean cell types
  • Formulas with of:= ODF prefix notation
  • All 16 formula functions: SUM, AVERAGE, MIN, MAX, COUNT, IF, AND, OR, NOT, ABS, ROUND, LEN, CONCAT, cell arithmetic, exponentiation

Cross-Format Compatibility (validated by soffice --convert-to):

Conversion Status
ODT → PDF Pass
ODT → DOCX (round-trip) Pass
DOCX → TXT (content preserved: heading, bold, link, table) Pass
ODS → PDF Pass
ODS → XLSX (round-trip) Pass
XLSX → CSV (formulas re-evaluated by real LibreOffice) Pass
ODP → PDF Pass
ODP → PPTX (round-trip preserves slide titles + bullets) Pass
ODG → PDF / SVG Pass
ODF (Math) → PDF (rendered by real LibreOffice Math) Pass
ODB → PDF Pass

Edge Cases (all pass):

  • Empty documents
  • XML-sensitive characters (< > & " ')
  • Unicode: Arabic (RTL), CJK, math symbols, currency, diacritics
  • 50,000-character single line
  • 5,000 × 10 spreadsheet (5.8 MB ODS)
  • Minimal single-column CSV
  • Negative numbers, large numbers, quoted strings with embedded commas

Running the Benchmarks

# Workspace unit tests
cargo test --workspace

# Integration tests against real LibreOffice
bash tests/libreoffice_integration.sh    # 35 assertions
bash tests/office_demo_integration.sh    # 40 assertions  (DOCX/XLSX/PPTX/ODT/ODS/ODP/ODG/ODF/ODB)
bash tests/desktop_demo_integration.sh   # 38 assertions  (lo_app desktop surface + autosave + macros)

# Full performance + accuracy benchmark
bash tests/benchmark.sh                  # 88 assertions

Requires LibreOffice installed (brew install --cask libreoffice on macOS).

Workspace layout

  • lo_core — common models, XML/PDF/SVG/HTML helpers, styles, document data structures
  • lo_zip — minimal ZIP reader/writer in pure Rust + ODF/OOXML packaging helpers
  • lo_odf — ODF package serializers for every document type
  • lo_writer — Writer-style editing, Markdown/plain-text ingestion, TXT/HTML/SVG/PDF/ODT/DOCX export
  • lo_calc — spreadsheet formula parser/evaluator, CSV import/export, HTML/SVG/PDF/ODS/XLSX export
  • lo_impress — presentation builders, HTML/SVG/PDF/ODP/PPTX export
  • lo_draw — vector drawing builders, SVG/PDF/ODG export
  • lo_math — TeX-style formula parser, MathML/SVG/PDF export (ODF formula via lo_odf)
  • lo_base — typed table model, SELECT / WHERE / ORDER BY / LIMIT query execution, HTML/SVG/PDF/ODB export
  • lo_uno — UNO-like service runtime: ComponentContext, factories, event bus, property maps, built-in Echo/Info/TextTransformations services
  • lo_lok — LibreOfficeKit-like in-process runtime: Office handle, DocumentHandle, command dispatch, callbacks, SVG tile rendering
  • lo_app — desktop application surface over lo_lok: windows, preferences, recent files, templates, clipboard, autosave + recovery, macro recording/replay, start-center HTML and per-window HTML shells
  • libreoffice-rs — CLI binary with office-demo and desktop-demo end-to-end commands

Examples

# Single-format conversions
cargo run -p libreoffice-pure -- writer new out.odt --title "Hello" --text "Hello from Rust"
cargo run -p libreoffice-pure -- writer markdown-to-odt notes.md notes.odt
cargo run -p libreoffice-pure -- writer convert notes.md notes.docx       # NEW
cargo run -p libreoffice-pure -- writer convert notes.md notes.html       # NEW
cargo run -p libreoffice-pure -- writer convert notes.md notes.pdf        # NEW
cargo run -p libreoffice-pure -- calc csv-to-ods sheet.csv sheet.ods --sheet Data --has-header
cargo run -p libreoffice-pure -- calc convert sheet.csv sheet.xlsx --has-header   # NEW
cargo run -p libreoffice-pure -- calc eval "=SUM(B2:B4)" --csv numbers.csv --has-header
cargo run -p libreoffice-pure -- impress demo deck.odp
cargo run -p libreoffice-pure -- draw demo diagram.odg
cargo run -p libreoffice-pure -- math latex-to-odf formula.txt formula.odf
cargo run -p libreoffice-pure -- base csv-to-odb table.csv People out.odb
cargo run -p libreoffice-pure -- package inspect out.odt

# End-to-end demos
cargo run -p libreoffice-pure -- office-demo  ./demo_out          # NEW: writes 28 files (every kind × every format)
cargo run -p libreoffice-pure -- desktop-demo ./demo_profile      # NEW: full lo_app desktop surface (start center, autosave, macros, …)

# In-process runtime examples
cargo run -p lo_lok --example demo                                # NEW: open / command / save / tile via the LOK runtime
cargo run -p lo_app --example desktop_demo                        # NEW: open template / save / shell-render via DesktopApp

Design goals

  1. No C or C++ shims.
  2. Native Rust models for all core document types.
  3. Self-contained packaging and XML generation.
  4. Easy-to-extend crate boundaries.
  5. Honest status reporting.

Feature status

See STATUS.md for a candid feature matrix.

No runtime deps