xlsx-fixer
A zero-dependency delivery-assurance layer for Python data pipelines.
Stop delivering "corrupted" Excel files to your clients and executives.
🚨 The 17-Year-Old Bug
If you generate .xlsx files with Python's openpyxl library and open them on a Mac, your stakeholders will see this terrifying warning:
⚠️ "We found a problem with some content in 'report.xlsx'. Do you want us to try to recover as much as we can?"
For a solo developer, this is annoying. For a data engineering team delivering automated reporting to C-suite executives or high-value clients, this completely destroys the professional credibility of the automation pipeline.
Why does this happen?
openpyxl hardcodes inline strings (t="inlineStr") for every text cell. Mac Excel's strict OOXML parser rejects this. The openpyxl maintainer has declined to fix this for 17+ years, calling it a permanent design decision.
How we fix it
xlsx-fixer intercepts the generated file, safely rebuilds the XML to use a proper shared string table (xl/sharedStrings.xml), drops inconsistent calculation states, and strips illegal control characters. One function call. Zero dependencies.
🛠️ The Open Source Tier (Free)
This repository contains the core fix() engine. It is perfect for ad-hoc scripts and individual files.
pip install xlsx-fixer
Usage (Python)
from openpyxl import Workbook
from xlsx_fixer import fix
wb = Workbook()
ws = wb.active
ws["A1"] = "Hello, Mac Excel!"
# 1. Save normally
wb.save("report.xlsx")
# 2. Fix it before sending to the client
fix("report.xlsx")
Usage (CLI)
# Fix a single file in-place
xlsx-fixer fix report.xlsx
# Check a file for corruption patterns without modifying
xlsx-fixer check report.xlsx
🚀 The Enterprise Tier (xlsx-fixer Pro)
For data engineering teams and CI/CD pipelines, we offer xlsx-fixer Pro.
If you are running Airflow, GitHub Actions, or processing hundreds of files, the Open Source version is too slow and requires too much manual code modification. xlsx-fixer Pro is a pre-compiled, un-hackable binary (Linux/Mac/Windows) designed for enterprise scale.
| Feature | xlsx-fixer (Free) |
xlsx-fixer Pro |
|---|---|---|
Single File Fix (fix()) |
✅ | ✅ |
Drop-in Patch (patch_openpyxl()) |
❌ | ✅ |
Multithreaded Batch CLI (batch) |
❌ | ✅ |
| Big Data Safe Mode (OOM prevention) | ❌ | ✅ |
CI Audit Reporting (--report json) |
❌ | ✅ |
| Deployment Format | Source Code | Compiled Native Binary |
⚡ The Drop-In Patch
Don't rewrite 100 legacy scripts. Just call patch_openpyxl() once at the top of your application, and every wb.save() call is automatically fixed in-place before it hits the disk.
💼 Commercial Licenses
| License | Target Audience | Link |
|---|---|---|
| Pipeline License ($299/yr) | Solo Automators / Boutique Agencies | Purchase on Lemon Squeezy |
| Site License ($899/yr) | Enterprise Data Teams (Uncapped) | Purchase on Lemon Squeezy |
Upon purchase, you will immediately receive your License Key and a secure download link for the compiled CI binaries.
🔬 What It Fixes Under The Hood
| # | Issue | Root Cause | Impact |
|---|---|---|---|
| 1 | Inline strings | openpyxl hardcodes t="inlineStr" |
"We found a problem" dialog on every Mac open |
| 2 | fullCalcOnLoad | openpyxl sets fullCalcOnLoad="1" without generating calcChain.xml |
Recovery dialog; formulas show 0 |
| 3 | Stale calcChain.xml | References cells that no longer contain formulas | "Removed Records: Formula" in repair log |
| 4 | Control characters | Illegal XML 1.0 chars (U+0000-U+0008, etc.) in cell values | ST_Xstring validation failures |
License
The free xlsx-fixer engine is licensed under the MIT License. See LICENSE for details.
Metadata
Release files for xlsx-fixer 1.2.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 | Provenance | Actions |
|---|---|---|---|---|
| xlsx_fixer-1.2.0.tar.gz | 12.1 kB | Without provenance | Details for xlsx_fixer-1.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| xlsx_fixer-1.2.0-py3-none-any.whl | Python 3 | none | any | Details for xlsx_fixer-1.2.0-py3-none-any.whl |
Total release size: 23.3 kB
Release files / xlsx_fixer-1.2.0.tar.gz
| Download URL | xlsx_fixer-1.2.0.tar.gz |
|---|---|
| Size | 12.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b4754a8e67a9f0d1df6479216926755b6563b233035f7f36887783f93aa27fb7
|
|
BLAKE2b-256 checksum How to use checksums |
51da7be0fc15eafddf3ff056bcc9fc3f58a6b3477c3f52e648925108ab6e7a01
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Release files / xlsx_fixer-1.2.0-py3-none-any.whl
| Download URL | xlsx_fixer-1.2.0-py3-none-any.whl |
|---|---|
| Size | 11.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7bae15568969af8530013750412ca647c2810243f83e54bd165c9450021005b7
|
|
BLAKE2b-256 checksum How to use checksums |
7040c68a4edd7ff44b4631d3ea8c064b05ec8977a475e6b43973a58f87d9ed9e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Security for xlsx-fixer 1.2.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.