Inject pandas DataFrames into Excel templates with table resizing and pivot refresh.
Project description
pivoteer
pivoteer injects pandas DataFrames into existing Excel templates by editing the underlying XML. It resizes Excel Tables (ListObjects) and forces PivotTables to refresh on open without corrupting pivot caches.
Why pivoteer
Most Python Excel libraries rewrite workbooks, which can break PivotTables, filters, and formatting in real-world templates. pivoteer is designed for enterprise reporting workflows where templates are authored in Excel and must remain intact. It surgically updates only the table data and table metadata so PivotTables remain connected and refresh correctly.
Installation
pip install pivoteer
Quick Start
from pathlib import Path
import pandas as pd
from pivoteer.core import Pivoteer
pivoteer = Pivoteer(Path("template.xlsx"))
df = pd.DataFrame(
{
"Category": ["Hardware", "Software"],
"Region": ["North", "South"],
"Amount": [120.0, 250.0],
"Date": ["2024-01-01", "2024-01-02"],
}
)
pivoteer.apply_dataframe("DataSource", df)
pivoteer.save("report_output.xlsx")
Architecture Overview
- Input/output:
.xlsxfiles are ZIP archives containing OpenXML parts. - Data injection: updates
xl/worksheets/sheetN.xmlrow data using inline strings to avoid touching sharedStrings.xml. - Table resizing: updates
xl/tables/tableN.xmlby recalculating therefrange based on the DataFrame shape. - Pivot refresh: sets
refreshOnLoad="1"inxl/pivotCache/pivotCacheDefinitionN.xmlwhen present.
Features
- Surgical Data Injection: updates worksheet XML without touching sharedStrings.
- Table Resizing: recalculates ListObject ranges to match injected data.
- Pivot Preservation: sets pivot caches to refresh on load when present.
- Minimal IO: stream-based ZIP copy-and-replace for stability.
Usage Patterns
Multiple table updates
from pivoteer.core import Pivoteer
import pandas as pd
p = Pivoteer("template.xlsx")
p.apply_dataframe("SalesData", pd.read_csv("sales.csv"))
p.apply_dataframe("CostData", pd.read_csv("costs.csv"))
p.save("report_output.xlsx")
Large datasets
pivoteer is optimized for replacing table data without rewriting the entire workbook. It is a good fit for large tables where preserving PivotTables and filters matters more than Excel formatting for each row.
Limitations
- The generated test template uses inline strings and does not create pivot caches when the installed xlsxwriter lacks pivot table support.
- Date formatting is injected as inline text; apply Excel formatting if needed.
- Shared strings are not modified in Phase 1.
- PivotTables are refreshed on open via
refreshOnLoad, but pivoteer does not recalculate pivot caches or modify pivot layout.
Compatibility
- Python: 3.10+
- Excel: Desktop Excel (Windows/macOS) supports
refreshOnLoadfor PivotTables. - Templates: Must include Excel Tables (ListObjects) with stable names.
Troubleshooting
- "Table not found": Ensure the Excel Table name matches exactly.
- "Pivot cache not found": The template may not include a PivotTable; this is expected for synthetic templates.
- "DataFrame is empty": pivoteer refuses empty payloads to protect templates.
Support and Requests
- Bugs: open a GitHub issue using the Bug Report template.
- Feature requests: open a GitHub issue using the Feature Request template.
- Security: follow the reporting process in
SECURITY.md.
Security
If you discover a vulnerability, please read SECURITY.md for reporting
instructions.
Development
python -m venv .venv
source .venv/bin/activate
pip install -e .[dev]
pytest
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pivoteer-0.1.0.tar.gz.
File metadata
- Download URL: pivoteer-0.1.0.tar.gz
- Upload date:
- Size: 16.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5574313137837a477a05d1130f6e691cd15afc64ce8370aed894ddc16f45f99
|
|
| MD5 |
2cb796c0c3f61aa77e2355fbe66f3c9d
|
|
| BLAKE2b-256 |
7a784026dfe72f44b297637acc41af1a131c894005d857f5645fd450426b9ec2
|
File details
Details for the file pivoteer-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pivoteer-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b5c800cea080bb88a7f380de2cb98bb8892602d943d8c7fb9b19c830928a119
|
|
| MD5 |
8b915b1af71fcc7aa05968074e8e2727
|
|
| BLAKE2b-256 |
14cbd06f13fc9b358e8559527d1e141f2512a7ddaa89f230c27e9afaf2cdb295
|