officework
xlsx and docx engines that do not destroy your forms, plus a bridge that
drives a running office app from Python — the way xlwings drives Excel, but on
your own machine and without Excel.
Written in Rust (15,000+ lines, 240+ tests), exposed to Python through PyO3.
日本語の説明は GitHub にあります (Japanese documentation on GitHub): Python の手引き
Install
$ pip install officework
Wheels are abi3 (CPython 3.10+), so one wheel per platform covers every
version; Linux, macOS and Windows are published. The engine needs no app
installed — only the bridge does. pandas is imported only if you ask for it
(pip install officework[pandas]).
Three ways in
from officework import sheet # the engine — no app needed
b = sheet.Book.open("form7.xlsx")
s = b["quote"]
s["A30"] = "Nihon Funen Co., Ltd." # borders, merges, widths stay intact
s["C30"] = "=B30*100" # a formula; recalculated on the spot
s.insert_row(30) # remaining formulas follow the move
b.save("out.xlsx") # shapes and print setup carried over
from officework import doc # the engine — docx, no app needed
d = doc.Doc.open("report.docx")
print(d.unsupported) # anything it could not read, never dropped in silence
d.replace("Old Name Ltd.", "New Name Ltd.") # per-run formatting is left alone
d[3].text = "replaced" # the paragraph stays a heading, stays aligned
print(d.tables[0][1][2].text) # table, row, cell
d.save("out.docx") # styles, headers, shapes, tracked changes carried over
from officework import calc as xw # the bridge — drives the running app
import pandas as pd
wb = xw.Book() # a blank workbook comes up
wb.sheets.active["A1"].value = df # the DataFrame lands in the sheet
df2 = wb.sheets.active["A1"].options(pd.DataFrame, expand="table").value
The bridge talks over a unix socket on this machine only — no TCP is opened. It needs officework running.
Your old vocabulary still works
Code written for openpyxl, xlwings or python-docx largely runs as-is:
ws = wb.active # openpyxl: cell(), append, iter_rows,
ws.cell(2, 3).value # dimensions, create_sheet,
ws.append(["Aug", "pens", 5000]) # copy_worksheet, freeze_panes …
xw.Range("B2").offset(1, 2).address # xlwings: '$D$3' — resize,
xw.Range("A1").current_region # last_cell, current_region …
d.tables[0].cell(0, 1).text # python-docx: row_cells, columns,
d[3].runs[0].font.name # runs, clear …
The inventory — all 324 core members of the three libraries, judged one by one — is in the repo: docs/pysheet-gokan.ja.md. Interop is proven with the originals' own eyes: openpyxl reads what this engine writes, including the computed values it cannot produce itself. See the Python manual for the details and the deliberate differences.
Since 0.3.0 the wheel also typesets equations: officework.tex takes
LaTeX and returns SVG or PNG. With TeX installed it typesets there (matrix
columns align); without it, matplotlib's mathtext does the job; with
neither, it refuses with the reason — never a silent empty picture.
Why the engines exist
openpyxl and python-docx rewrite the parts of the file they do not
understand. For a document used as a printed form — the way most Japanese
offices use one — that means the borders, merged cells, column widths, shapes,
styles and headers you spent an afternoon on come back wrong.
These engines keep the original as the source of truth and write back only what
changed. b.unsupported / d.unsupported list anything they could not read, so
nothing is dropped in silence.
The docx side is checked against an independent reader (genoffice's TypeScript
docx engine) over 51 real documents, 43 of which this project did not write:
46 survive an open-and-save untouched, and no document loses a single part of
its zip. The rest — footnote marks, second and later section breaks, equations —
are listed in d.unsupported rather than dropped quietly.
Measured on one machine, 1096 rows × 20 columns (21,920 cells):
| DataFrame → sheet | 44 ms |
| sheet → DataFrame | 65 ms |
License
AGPL-3.0-or-later.
Using it inside your company — building forms, running ledgers, writing scripts — carries no obligations at all. Obligations appear only if you ship something built on it to third parties, or offer a modified version as a network service.
Release files for officework 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| officework-0.3.0.tar.gz | 593.6 kB | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| officework-0.3.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| officework-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| officework-0.3.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | CPython 3.10 | abi3 | macOS 10.12+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64, macOS 10.12+ x86-64 | Details |
Total release size: 7.0 MB
Release files / officework-0.3.0.tar.gz
| Download URL | officework-0.3.0.tar.gz |
|---|---|
| Size | 593.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b37a1c27c6b1f1d970ba3c1143021dee8cd98c8749ae27c5742f8bdab5223c1d
|
|
BLAKE2b-256 checksum How to use checksums |
d248fe595bcb93773da140d0a851c7abcd75c0f1cac57cc4bbf2ffe62f68d769
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logRelease files / officework-0.3.0-cp310-abi3-win_amd64.whl
| Download URL | officework-0.3.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 1.5 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c64e6f30b109480fe57b3f259969d1f4b72cf762735204eb0f28abc44194e89d
|
|
BLAKE2b-256 checksum How to use checksums |
0df5a6f0d73d14405380b883784834feeedb0a81f5550af58c953eba2721a2bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logRelease files / officework-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | officework-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.7 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
4f35c22047c13c2bdc178349f18197e94c1293cfd4d3962a10f8e21179e94d3d
|
|
BLAKE2b-256 checksum How to use checksums |
ff1328d64729a7e3b1e24e2df27250a39ba302330c148124dc81f26e539665ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logRelease files / officework-0.3.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | officework-0.3.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl |
|---|---|
| Size | 3.1 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c0fad1f9668a52222d88199280f411f1dcd1d74d434618e49ec250b18078e731
|
|
BLAKE2b-256 checksum How to use checksums |
99d48c870683557fe6c62b8161cdcda8cd8314a50c1ed9d97346e105c86073cf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency log