Skip to main content

pivoteer

CI PyPI License: MIT

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: .xlsx files are ZIP archives containing OpenXML parts.
  • Data injection: updates xl/worksheets/sheetN.xml row data using inline strings to avoid touching sharedStrings.xml.
  • Table resizing: updates xl/tables/tableN.xml by recalculating the ref range based on the DataFrame shape.
  • Pivot refresh: sets refreshOnLoad="1" in xl/pivotCache/pivotCacheDefinitionN.xml when present.
  • Pivot cache field sync (opt-in): appends missing cache field entries for table columns so new headers appear in existing PivotTables.

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.
  • Optional Pivot Cache Field Sync: appends missing cache field metadata for new table columns without touching PivotTable layouts.
  • Minimal IO: stream-based ZIP copy-and-replace for stability.

Pivot Cache Field Sync

When new columns are added to an Excel Table, existing PivotTables often fail to show the new fields until the PivotCache metadata is updated. pivoteer can synchronize PivotCache field definitions so new table columns appear in the PivotTable field list.

What pivoteer does:

  • Syncs PivotCache field metadata for the target table.
  • Appends missing cache fields so new columns are visible in the PivotTable UI.

What pivoteer does not do:

  • Does not create PivotTables.
  • Does not modify PivotTable layouts or filters.
  • Does not touch slicers or formatting.

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")

Opt-in pivot cache field sync

from pivoteer.core import Pivoteer
import pandas as pd

p = Pivoteer("template.xlsx", enable_pivot_field_sync=True)
p.apply_dataframe("RawData", pd.read_csv("usage.csv"))
p.save("report_output.xlsx")

This flag is optional; when it is not set, pivoteer behaves exactly as before.

Advanced usage with TemplateEngine

from pathlib import Path
import pandas as pd

from pivoteer.template_engine import TemplateEngine

engine = TemplateEngine(Path("template.xlsx"))
engine.apply_dataframe("RawData", pd.read_csv("usage.csv"))
engine.sync_pivot_cache_fields()
engine.ensure_pivot_refresh_on_load()
parts = engine.get_modified_parts()

Low-level XML access

For custom XML inspection or modification, read_xml_part reads any XML part from an Excel archive:

import zipfile
from pivoteer.xml_engine import read_xml_part

with zipfile.ZipFile("template.xlsx", "r") as archive:
    tree = read_xml_part(archive, "xl/workbook.xml")
    print(tree.getroot().tag)

Supported data types

pivoteer handles the following DataFrame value types when injecting rows:

Type Excel representation
int, float Numeric cell (<v>)
str Inline string (<is><t>)
datetime.date, datetime.datetime Inline string (ISO 8601)
None, NaN, NaT Empty cell (no children)

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.

Safety Guarantees

  • Opt-in only: the feature is disabled unless explicitly enabled.
  • Only missing cache fields are appended.
  • Existing cache field order is preserved.
  • PivotTable definitions are not modified.

Limitations

  • The PivotCache source must reference the named Excel Table.
  • The template must already contain PivotTables and pivot caches.
  • The structured table must exist and be the PivotTable cache source.
  • pivoteer does not auto-refresh the Excel UI; Excel recalculates pivots on open.

Compatibility

  • Python: 3.10+
  • Excel: Desktop Excel (Windows/macOS) supports refreshOnLoad for 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

Metadata

Release files for pivoteer 0.2.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pivoteer 0.2.2
File Size Uploaded
pivoteer-0.2.2.tar.gz 23.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pivoteer 0.2.2
File Interpreter ABI Platform
pivoteer-0.2.2-py3-none-any.whl Python 3 none any Details

Total release size: 37.7 kB

Release files / pivoteer-0.2.2.tar.gz

Download URL pivoteer-0.2.2.tar.gz
Size 23.6 kB
Tags Source
SHA-256 checksum
How to use checksums
d80db02426a8253458899d030f981268a0a014aa59b0666390132539e6bde7d7
BLAKE2b-256 checksum
How to use checksums
8e3f2bb41865eb3bb63b7e0b0d73037d6da5efd9285427c5c61f1ed62505ceb3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Feb 18, 2026.

Transparency log

Release files / pivoteer-0.2.2-py3-none-any.whl

Download URL pivoteer-0.2.2-py3-none-any.whl
Size 14.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8f15772bded258f8bf7a1b5b76074610021eab3409879daba1a8eef0208aa84d
BLAKE2b-256 checksum
How to use checksums
a22a8ec409a8b09e7da5c66ca5b3d49b657c453e99a268485bf11a86f704dd5b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Feb 18, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.2 This release

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page