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
1,959 downloads per month
Used in 13 crates
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/LIMITqueries 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-demoanddesktop-demoend-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 →
Strongstyle - Italic →
Emphasisstyle - Inline code →
Codestyle - 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 structureslo_zip— minimal ZIP reader/writer in pure Rust + ODF/OOXML packaging helperslo_odf— ODF package serializers for every document typelo_writer— Writer-style editing, Markdown/plain-text ingestion, TXT/HTML/SVG/PDF/ODT/DOCX exportlo_calc— spreadsheet formula parser/evaluator, CSV import/export, HTML/SVG/PDF/ODS/XLSX exportlo_impress— presentation builders, HTML/SVG/PDF/ODP/PPTX exportlo_draw— vector drawing builders, SVG/PDF/ODG exportlo_math— TeX-style formula parser, MathML/SVG/PDF export (ODF formula vialo_odf)lo_base— typed table model,SELECT/WHERE/ORDER BY/LIMITquery execution, HTML/SVG/PDF/ODB exportlo_uno— UNO-like service runtime:ComponentContext, factories, event bus, property maps, built-inEcho/Info/TextTransformationsserviceslo_lok— LibreOfficeKit-like in-process runtime:Officehandle,DocumentHandle, command dispatch, callbacks, SVG tile renderinglo_app— desktop application surface overlo_lok: windows, preferences, recent files, templates, clipboard, autosave + recovery, macro recording/replay, start-center HTML and per-window HTML shellslibreoffice-rs— CLI binary withoffice-demoanddesktop-demoend-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
- No C or C++ shims.
- Native Rust models for all core document types.
- Self-contained packaging and XML generation.
- Easy-to-extend crate boundaries.
- Honest status reporting.
Feature status
See STATUS.md for a candid feature matrix.