| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Documents (documents)
• Discuss (mail) |
| Lines of code | 718 |
| Technical Name |
addon_custom_spreadsheet |
| License | OPL-1 |
| Website | https://ezway-technology.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Documents (documents)
• Discuss (mail) |
| Lines of code | 718 |
| Technical Name |
addon_custom_spreadsheet |
| License | OPL-1 |
| Website | https://ezway-technology.com |
✨ Key Features
Automatic Server-Side Cleaning
XLSX files are cleaned on-the-fly on the server before being sent to the browser — no action required from the user.
Client-Side Fallback
A JavaScript patch acts as a safety net and cleans ghost cells directly in the browser if server-side cleaning is bypassed.
Manual Cleaning Action
Clean any existing XLSX file in your Documents library with a single click using the dedicated action button.
Smart Detection
Threshold-based detection only processes files that actually need cleaning, keeping performance overhead minimal.
Non-Destructive
Original files are never modified in the database. Cleaning happens entirely in memory during file delivery.
Up to 99% Size Reduction
Ghost cells are stripped with optimized Python regex processing, shrinking bloated files from megabytes to kilobytes.
❓ The Problem: Ghost Cells
Your Odoo Spreadsheet crashes with "Out of Memory" or "RangeError" when opening an Excel file — even though the file looks small and contains only a few rows of data.
When you format an entire column or row in Excel (e.g., make column A bold, or paint an entire row in yellow), Excel silently generates millions of "ghost cells" — empty cells that carry only a style attribute and no actual data. These cells are invisible in Excel, but when Odoo parses the XML of the XLSX file, the browser runs out of memory trying to render them all.
📊 Real-World Performance
| Metric | ❌ Before Cleaning | ✅ After Cleaning |
|---|---|---|
| File size | 25 MB | 250 KB (−99%) |
| Total cells parsed | ~500,000 | ~5,000 |
| Ghost cells | ~495,000 (99 %) | 0 |
| Result | Browser crash | Opens in 2 seconds |
⚙️ How It Works
- Server intercepts the file request — when the browser requests an XLSX file, the Odoo controller intercepts it before delivery.
-
Ghost cell detection — the module checks the raw XML inside the XLSX zip for
the characteristic pattern of empty styled cells:
<c r="A1" s="1"/>. - Regex-based stripping — if ghost cells exceed the configured threshold, they are removed from every sheet XML in memory using fast Python regex.
- Re-compressed delivery — the cleaned XLSX is repackaged with maximum compression (level 9) and sent to the browser.
- JavaScript safety net — a client-side patch catches any file that bypasses server-side cleaning and applies the same removal logic before the spreadsheet engine parses the XML.
🔧 Technical Details
| Parameter | Default Value | Description |
|---|---|---|
| Activation threshold | 1 KB / sheet | Minimum ghost cell XML size per sheet to trigger cleaning |
| Max file size | 20 MB | Files above this size are skipped (too large for in-memory processing) |
| Supported formats | .xlsx, .xlsm | Standard Office Open XML formats |
| Compression level | 9 (maximum) | zlib compression level for the repackaged XLSX |
What Gets Removed
- Empty cells with only a style attribute:
<c r="A1" s="1"/> - Empty rows with no cell children:
<row r="5"/> - Any cell node that has no
<v>value,<f>formula or<is>inline string
📦 Installation
- Make sure the Documents and Spreadsheet modules are installed
- Copy the
addon_custom_spreadsheetfolder into your Odoo addons directory - In Odoo: Apps → Update App List → Search "Spreadsheet XLSX Ghost Cells Cleaner" → Install
- Optionally clear the assets cache: Settings → Technical → Regenerate Assets
- Done! The module is active immediately — no configuration required
Already have bloated XLSX files in your Documents library? Open the file record, click the "Clean Ghost Cells" action button and save. The cleaned version replaces the attachment directly in the database.
After installation, every XLSX file opened through Odoo Documents or Odoo Spreadsheet is automatically cleaned on the server. No settings, no toggles, no maintenance.
✅ Perfect Use Cases
- Excel files where entire columns or rows have been formatted (bold, background color, border, etc.)
- Files that crash Odoo Spreadsheet with "Out of Memory" or "RangeError"
- Large XLSX files that take several minutes to open or never finish loading
- Excel templates with extensive pre-applied formatting
- Reports exported by third-party ERP or BI tools that format full sheets
📋 Requirements
- Odoo 19.0 Enterprise
spreadsheetmodule installeddocuments_spreadsheetmodule installed- Python 3.10+
- No additional Python libraries required
Stop the crashes. Open Excel files instantly.
Install once and forget about "Out of Memory" errors forever.
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module