Programmatically Handling Excel Pivot Tables with OfficeCLI

OfficeCLI exposes Excel pivot tables as JSON-configurable objects that can be created via CLI commands or the Python SDK, translating properties directly into OpenXML <pivotTableDefinition> elements without requiring Excel automation.

The iOfficeAI/OfficeCLI repository provides a cross-platform toolkit for generating Excel files through a resident server process. When you need to programmatically handling Excel pivot tables with OfficeCLI, you interact with a named-pipe server—implemented in src/officecli/officecli.csproj—that assembles pivot caches, field groups, and axis configurations from simple property maps.

Understanding the OfficeCLI Architecture

OfficeCLI operates as a resident process that hosts a named-pipe server. When you invoke officecli create or the SDK’s officecli.create(), the server listens for commands encoded as JSON payloads. Each pivot table is represented by a command object with command: "add", parent: "/<sheet>", type: "pivottable", and a props dictionary.

This architecture ensures parity between CLI and SDK. The binary parses command-line arguments into the same JSON structure that the Python SDK emits, ensuring shell scripts and programmatic code generate identical OpenXML output.

Creating Pivot Tables via the Command Line

The CLI exposes pivot creation through the add subcommand with --type pivottable. Properties are passed via repeated --prop arguments that map to the JSON schema.

officecli create pivot-demo.xlsx --force
officecli add pivot-demo.xlsx "/Sales Overview" --type pivottable \
  --prop source=Sheet1!A1:J51 \
  --prop rows=Region,Category \
  --prop cols=Quarter \
  --prop 'values=Sales:sum,Cost:sum:percent_of_row' \
  --prop 'filters=Channel,Priority' \
  --prop layout=tabular \
  --prop repeatlabels=true \
  --prop grandtotals=both \
  --prop subtotals=on \
  --prop sort=desc \
  --prop style=PivotStyleDark2
officecli save pivot-demo.xlsx

The source property defines the pivot cache range (Sheet1!A1:J51), which is shared across all pivot tables referencing the same coordinates. This sharing enables synchronized slicers and charts.

Creating Pivot Tables with the Python SDK

The Python SDK wraps the same JSON protocol. You construct command dictionaries and send them via doc.send() within a context manager.

import officecli, os, sys

FILE = os.path.join(os.path.dirname(__file__), "pivot-demo.xlsx")

def add_sheet(name):
    return {"command": "add", "parent": "/", "type": "sheet",
            "props": {"name": name}}

def pivot(sheet, **props):
    return {"command": "add", "parent": f"/{sheet}",
            "type": "pivottable", "props": props}

with officecli.create(FILE, "--force") as doc:
    # populate source data (omitted for brevity)

    doc.send(add_sheet("Sales Overview"))
    doc.send(pivot("Sales Overview",
                  source="Sheet1!A1:J51",
                  rows="Region,Category",
                  cols="Quarter",
                  values="Sales:sum,Cost:sum:percent_of_row",
                  filters="Channel,Priority",
                  layout="tabular",
                  repeatlabels="true",
                  grandtotals="both",
                  subtotals="on",
                  sort="desc",
                  style="PivotStyleDark2"))
    doc.send({"command": "save"})

The pivot() helper function in examples/excel/pivot-tables.py demonstrates this pattern, wrapping the verbose JSON structure into a reusable Python function.

Configuring Pivot Table Properties

Defining the Data Source

The source property accepts a rectangular range (e.g., Sheet1!A1:J51) that becomes the pivot cache. OfficeCLI automatically generates the underlying <pivotCacheDefinition> and shares it among multiple pivot tables referencing the same range, as shown in examples/excel/pivot-tables.sh.

Layout and Axis Configuration

  • Rows and Columns: Supply comma-separated field names (rows=Region,Category).
  • Date Grouping: Use colon syntax (Date:year, Date:quarter) to create native Excel field groups for automatic bucketing.
  • Layout Modes: Set layout to tabular, outline, or compact to control label indentation and repetition.

Aggregations and Display Modes

Value fields support explicit aggregation functions:

  • Functions: sum, average, count, var, varP
  • Display Modifiers: percent_of_row, percent_of_total, running_total

Specify these with colon separators: Sales:sum or Cost:sum:percent_of_row. A global aggregate property sets default functions for values omitting explicit aggregation.

Filters and Slicers

The filters property lists page-filter fields applied to the entire pivot table. For interactive slicers, create a separate slicers object that references the pivot cache by name, as illustrated in examples/excel/slicers.py.

Styling and Visual Formatting

Boolean flags map directly to Excel’s PivotTable Styles ribbon:

  • showRowStripes, showColHeaders, showLastColumn
  • style selects built-in templates (e.g., PivotStyleDark2, PivotStyleMedium2)

These properties are documented comprehensively in examples/excel/pivot-tables.md.

Advanced Pivot Features

OfficeCLI supports enterprise-grade features through additional --prop arguments:

  • Calculated Fields: calculatedField1=Margin:=Sales-Cost creates formula-based values.
  • Label Filters: labelFilter=Region:beginsWith:N filters rows by string matching.
  • Top-N Truncation: topN=5 limits displayed items.
  • Locale Support: sort=locale and grandTotalCaption=合计 enable localized sorting and captions.
officecli add pivot-demo.xlsx "/Chinese Locale" --type pivottable \
  --prop source=CNData!A1:C13 \
  --prop rows=地区,品类 \
  --prop values=销售额:sum \
  --prop layout=tabular \
  --prop grandtotals=both \
  --prop subtotals=on \
  --prop sort=locale \
  --prop grandTotalCaption=合计 \
  --prop style=PivotStyleMedium2

These properties pass directly to the OpenXML schema, enabling fully-featured pivots without manual XML editing.

Summary

  • OfficeCLI uses a resident named-pipe server (implemented in src/officecli/officecli.csproj) to translate JSON commands into Excel OpenXML.
  • Both the CLI (officecli add ... --type pivottable) and Python SDK (doc.send(pivot(...))) share identical property schemas.
  • Pivot caches are automatically shared when multiple tables reference the same source range.
  • Date grouping, calculated fields, and locale-aware sorting are supported through colon-separated syntax and special property keys.
  • Reference implementations are available in examples/excel/pivot-tables.py and examples/excel/pivot-tables.sh.

Frequently Asked Questions

How does OfficeCLI handle pivot table data sources?

OfficeCLI treats the source property (e.g., Sheet1!A1:J51) as a pivot cache reference. When multiple pivot tables specify the same range, they share a single cache definition, ensuring slicers and charts remain synchronized across the workbook.

Can I create calculated fields in pivot tables using OfficeCLI?

Yes. Pass calculated expressions using the calculatedField1 (or calculatedField2, etc.) property with the syntax Name:=Formula, such as calculatedField1=Margin:=Sales-Cost. OfficeCLI injects these into the OpenXML <calculatedFields> collection.

What is the difference between the CLI and Python SDK approaches?

There is no functional difference. The CLI (npm/officecli.js forwarding to the native binary) parses --prop arguments into the same JSON payload that the Python SDK emits via doc.send(). Choose the CLI for shell scripts and the SDK for integration with Python data pipelines.

How are pivot table styles applied?

Set the style property to a built-in PivotStyle identifier (e.g., PivotStyleDark2). Boolean flags like showRowStripes and showColHeaders control specific visual elements, mapping directly to the style options available in Excel’s ribbon interface.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →