15 KiB
Extended Chart Types Showcase
This demo consists of three files that work together:
- charts-extended.py — Python script that calls
officeclicommands to generate the workbook. Each chart command is shown as a copyable shell command in the comments. - charts-extended.xlsx — The generated workbook: 5 sheets, 18 charts, covering every property supported by the cx:chart family (waterfall, funnel, treemap, sunburst, histogram, boxWhisker) plus chart-meta properties (anchor, preset, autotitledeleted, plotvisonly).
- charts-extended.md — This file. Maps each sheet to the features it demonstrates.
Regenerate
cd examples/excel
python3 charts-extended.py
# → charts-extended.xlsx
Feature Coverage Summary
Every extended-chart-specific knob is exercised by at least one chart:
| Chart type | Specific knobs | Covered by |
|---|---|---|
| waterfall | increaseColor, decreaseColor, totalColor, chartFill, labelFont |
Sheet 1, Chart 1–2 |
| funnel | (generic styling only) | Sheet 1, Chart 3–4 |
| pareto | auto-sort desc, ownerIdx cumulative-% line, secondary % axis |
Sheet 4, Chart 1–2 |
| treemap | parentLabelLayout = overlapping / banner / none |
Sheet 2, Chart 1/2/3 |
| sunburst | (generic styling only) | Sheet 2, Chart 4 |
| histogram | binCount, binSize, intervalClosed = r / l, underflowBin, overflowBin |
Sheet 3, Chart 1–4 |
| boxWhisker | quartileMethod = exclusive / inclusive |
Sheet 3, Chart 5–6 |
| (all types) | anchor, preset, autotitledeleted, plotvisonly |
Sheet 5, Chart 1–4 |
Generic cx styling exercised across the deck: title.glow, title.shadow, title.bold/size/color, dataLabels, labelFont, legend position, legendfont, axisfont, colors palette, chartFill, plotFill.
Notes on cx:chart styling:
chartFill/plotFillaccept a solid hex color,none, or a gradient — the sameC1-C2:angle(andc1,c2stop-list) syntax as regular cChart.colors=palette works per-data-point on single-series cx charts (funnel, treemap, sunburst): each segment gets the next palette color (emitted ascx:dataPtfills, cycling if there are more points than colors). On multi-series cx charts (boxWhisker)colors=is one color per series, as on regular cCharts.
Sheet: 1-Waterfall & Funnel
Two waterfall charts (financial bridges) and two funnel charts (pipelines).
# Chart 1 — waterfall with increase/decrease/total colors + data labels + title glow
officecli add charts-extended.xlsx "/1-Waterfall & Funnel" --type chart \
--prop chartType=waterfall \
--prop title="Cash Flow Bridge" \
--prop data="Start:1000,Revenue:500,Costs:-300,Tax:-100,Net:1100" \
--prop increaseColor=70AD47 --prop decreaseColor=FF0000 --prop totalColor=4472C4 \
--prop dataLabels=true \
--prop title.glow="00D2FF-6-60"
# Chart 2 — waterfall with legend + chartFill (solid) + custom label font
officecli add charts-extended.xlsx "/1-Waterfall & Funnel" --type chart \
--prop chartType=waterfall \
--prop title="Budget vs Actual" \
--prop data="Budget:5000,Sales:2000,Marketing:-800,Ops:-600,Net:5600" \
--prop increaseColor=2E75B6 --prop decreaseColor=C00000 --prop totalColor=FFC000 \
--prop legend=bottom \
--prop chartFill=F0F4FA \
--prop dataLabels=true \
--prop labelFont="9:333333:true"
# Chart 3 — funnel (sales pipeline) with title shadow
officecli add charts-extended.xlsx "/1-Waterfall & Funnel" --type chart \
--prop chartType=funnel \
--prop title="Sales Pipeline" \
--prop series1="Pipeline:1200,850,600,300,120" \
--prop categories=Leads,Qualified,Proposal,Negotiation,Won \
--prop dataLabels=true \
--prop title.shadow="000000-4-45-2-40"
# Chart 4 — funnel (marketing) with custom colors palette, legend/axis fonts
officecli add charts-extended.xlsx "/1-Waterfall & Funnel" --type chart \
--prop chartType=funnel \
--prop title="Marketing Funnel" \
--prop series1="Users:10000,6500,3200,1800,900,450" \
--prop categories=Impressions,Clicks,Signups,Active,Paying,Retained \
--prop dataLabels=true \
--prop legendfont="9:8B949E:Helvetica Neue" \
--prop axisfont="10:58626E:Helvetica Neue"
Features: chartType=waterfall, increaseColor, decreaseColor, totalColor, chartType=funnel, descending pipeline values, dataLabels, title.glow, title.shadow, legend=bottom, chartFill (solid hex), labelFont, colors palette, legendfont, axisfont.
Sheet: 2-Treemap & Sunburst
Three treemaps (one per parentLabelLayout value) and one sunburst.
# Chart 1 — treemap with parentLabelLayout=overlapping + dataLabels
officecli add charts-extended.xlsx "/2-Treemap & Sunburst" --type chart \
--prop chartType=treemap \
--prop title="Revenue by Product" \
--prop series1="Revenue:450,380,310,280,210,180,150,120" \
--prop categories=Laptops,Phones,Tablets,TVs,Cameras,Audio,Gaming,Wearables \
--prop parentLabelLayout=overlapping \
--prop dataLabels=true
# Chart 2 — treemap with parentLabelLayout=banner + title styling
officecli add charts-extended.xlsx "/2-Treemap & Sunburst" --type chart \
--prop chartType=treemap \
--prop title="Department Budget" \
--prop series1="Budget:900,750,600,500,420,350,280" \
--prop categories=Engineering,Sales,Marketing,Support,Finance,HR,Legal \
--prop parentLabelLayout=banner \
--prop title.bold=true --prop title.size=14 --prop title.color=2E5090
# Chart 3 — treemap with parentLabelLayout=none (flat, no parent header strip)
officecli add charts-extended.xlsx "/2-Treemap & Sunburst" --type chart \
--prop chartType=treemap \
--prop title="Flat Treemap (no parent labels)" \
--prop series1="Units:250,200,180,160,140,120,100,80,60,40" \
--prop categories=A,B,C,D,E,F,G,H,I,J \
--prop parentLabelLayout=none \
--prop dataLabels=true
# Chart 4 — sunburst with chartFill + plotFill (solid) + colors palette
officecli add charts-extended.xlsx "/2-Treemap & Sunburst" --type chart \
--prop chartType=sunburst \
--prop title="Market Share by Region" \
--prop series1="Share:35,25,20,15,30,25,20,10,15" \
--prop categories=North,South,East,West,Urban,Suburban,Rural,Online,Retail \
--prop chartFill=F8FAFC --prop plotFill=FFFFFF \
--prop dataLabels=true
Features: chartType=treemap, parentLabelLayout=overlapping, parentLabelLayout=banner, parentLabelLayout=none, chartType=sunburst, radial hierarchical layout, colors palette, title.bold/size/color, dataLabels, chartFill + plotFill (solid).
Sheet: 3-Histogram & BoxWhisker
Four histograms covering every binning knob, and two box-and-whisker charts (one per quartile method).
# Chart 1 — histogram with auto-binning (no binCount/binSize)
officecli add charts-extended.xlsx "/3-Histogram & BoxWhisker" --type chart \
--prop chartType=histogram \
--prop title="Test Scores (auto bins)" \
--prop series1="Scores:45,52,58,61,63,...,95,97,99"
# Chart 2 — histogram with explicit binCount=5 + title glow
officecli add charts-extended.xlsx "/3-Histogram & BoxWhisker" --type chart \
--prop chartType=histogram \
--prop title="Sales (binCount=5)" \
--prop series1="Sales:120,135,...,620,700" \
--prop binCount=5 \
--prop title.glow="FFC000-6-50"
# Chart 3 — histogram with explicit binSize=50 (fixed bin width) + label font
officecli add charts-extended.xlsx "/3-Histogram & BoxWhisker" --type chart \
--prop chartType=histogram \
--prop title="Sales (binSize=50)" \
--prop series1="Sales:120,135,...,620,700" \
--prop binSize=50 \
--prop dataLabels=true --prop labelFont="9:FFFFFF:true"
# Chart 4 — histogram with underflowBin + overflowBin + intervalClosed=l
officecli add charts-extended.xlsx "/3-Histogram & BoxWhisker" --type chart \
--prop chartType=histogram \
--prop title="Response Time (outlier bins)" \
--prop series1="ms:40,55,68,75,...,220,280,350" \
--prop underflowBin=60 \
--prop overflowBin=200 \
--prop intervalClosed=l \
--prop dataLabels=true \
--prop legend=none
# Chart 5 — box & whisker, two teams, quartileMethod=exclusive
officecli add charts-extended.xlsx "/3-Histogram & BoxWhisker" --type chart \
--prop chartType=boxWhisker \
--prop title="Response Time by Team (ms)" \
--prop series1="TeamA:42,55,...,105,120" \
--prop series2="TeamB:30,38,...,92,110" \
--prop quartileMethod=exclusive \
--prop legend=bottom
# Chart 6 — box & whisker, three departments, quartileMethod=inclusive + title glow
officecli add charts-extended.xlsx "/3-Histogram & BoxWhisker" --type chart \
--prop chartType=boxWhisker \
--prop title="Salary Distribution (\$k)" \
--prop series1="Engineering:85,92,...,150,180" \
--prop series2="Marketing:60,65,...,98,110" \
--prop series3="Sales:55,62,...,160,190" \
--prop quartileMethod=inclusive \
--prop title.glow="00D2FF-6-60" \
--prop legend=bottom
Features: chartType=histogram, auto-binning, binCount (explicit count), binSize (explicit width — mutually exclusive with binCount), underflowBin (cutoff for <N), overflowBin (cutoff for >N), intervalClosed=r (default, (a,b]) vs intervalClosed=l ([a,b)), chartType=boxWhisker, quartileMethod=exclusive, quartileMethod=inclusive, multi-series grouping (2 or 3), title.glow, legend=bottom, legend=none, labelFont, dataLabels.
Sheet: 4-Pareto
Two Pareto charts demonstrating automatic descending sort and cumulative-% overlay line.
# Chart 1 — categorical Pareto (defect analysis), pre-sorted input
officecli add charts-extended.xlsx "/4-Pareto" --type chart \
--prop chartType=pareto \
--prop title="Defect Pareto" \
--prop series1="Count:45,30,10,8,5,2" \
--prop categories=Scratches,Dents,Cracks,Chips,Stains,Other \
--prop dataLabels=true
# Chart 2 — Pareto with out-of-order input (auto-sorted desc by officecli)
officecli add charts-extended.xlsx "/4-Pareto" --type chart \
--prop chartType=pareto \
--prop title="Root Cause Pareto" \
--prop series1="Tickets:12,87,5,45,3,120,22,67,8,31" \
--prop categories=Network,Auth,DB,Cache,UI,Config,Deploy,Monitor,Queue,Storage \
--prop title.glow="FFC000-6-50" \
--prop legend=bottom
Features: chartType=pareto, automatic descending sort of values + categories, cumulative-% overlay line on secondary 0-100% axis (auto-generated via ownerIdx), dataLabels, title.glow, legend=bottom. Input is a SINGLE user series; officecli synthesizes the 2-series structure internally (clusteredColumn bars + paretoLine with ownerIdx="0" + secondary percentage axis).
Sheet: 5-Chart Meta
Four charts demonstrating chart-level meta properties: cell-range anchor placement, named style presets, and display-control flags.
# anchor (cell-range placement) + preset=corporate
officecli add charts-extended.xlsx "/5-Chart Meta" --type chart \
--prop chartType=column \
--prop title="anchor + preset=corporate" \
--prop series1="Revenue:120,145,132,160" \
--prop categories=Q1,Q2,Q3,Q4 \
--prop anchor="A1:M20" \
--prop preset=corporate
# autotitledeleted + plotvisonly
officecli add charts-extended.xlsx "/5-Chart Meta" --type chart \
--prop chartType=bar \
--prop series1="Sales:80,95,88,110" \
--prop categories=Q1,Q2,Q3,Q4 \
--prop x=0 --prop y=22 --prop width=12 --prop height=18 \
--prop autotitledeleted=true \
--prop plotvisonly=true
# preset=minimal
officecli add charts-extended.xlsx "/5-Chart Meta" --type chart \
--prop chartType=line \
--prop title="preset=minimal" \
--prop series1="A:10,20,15,25" \
--prop series2="B:8,14,12,20" \
--prop categories=W1,W2,W3,W4 \
--prop x=13 --prop y=0 --prop width=12 --prop height=18 \
--prop preset=minimal
# preset=dark
officecli add charts-extended.xlsx "/5-Chart Meta" --type chart \
--prop chartType=column \
--prop title="preset=dark" \
--prop series1="Sales:45,60,55,80" \
--prop categories=Q1,Q2,Q3,Q4 \
--prop x=13 --prop y=22 --prop width=12 --prop height=18 \
--prop preset=dark
Features: anchor="A1:M20" (position chart at exact cell-range two-cell anchor instead of x/y/width/height), preset=corporate (named style bundle — sets colors, fonts, fill, border in one shot; values: minimal, dark, corporate, magazine, dashboard, colorful, monochrome), autotitledeleted=true (suppress the auto "Chart Title" placeholder that Excel inserts when no title= is given), plotvisonly=true (skip plotting data in hidden rows/columns — mirrors Excel's "Show data in hidden rows and columns" unchecked)
Property Reference
| Property | Applies to | Example value | Sheet |
|---|---|---|---|
chartType=waterfall |
waterfall | waterfall |
1 |
chartType=funnel |
funnel | funnel |
1 |
chartType=treemap |
treemap | treemap |
2 |
chartType=sunburst |
sunburst | sunburst |
2 |
chartType=histogram |
histogram | histogram |
3 |
chartType=boxWhisker |
boxWhisker | boxWhisker |
3 |
chartType=pareto |
pareto | pareto |
4 |
data= name:value pairs |
waterfall | Start:1000,Revenue:500,... |
1 |
increaseColor |
waterfall | 70AD47 |
1 |
decreaseColor |
waterfall | FF0000 |
1 |
totalColor |
waterfall | 4472C4 |
1 |
series1=Name:values, series2=..., series3=... |
all cx | TeamA:42,55,... |
1/2/3 |
categories |
all cx except histogram | Leads,Qualified,... |
1/2 |
parentLabelLayout |
treemap | overlapping | banner | none |
2 |
binCount |
histogram | 5 |
3 |
binSize |
histogram | 50 |
3 |
intervalClosed |
histogram | r (default) | l |
3 |
underflowBin |
histogram | 60 |
3 |
overflowBin |
histogram | 200 |
3 |
quartileMethod |
boxWhisker | exclusive | inclusive |
3 |
dataLabels |
all cx | true |
1/2/3 |
labelFont |
all cx | "9:FFFFFF:true" |
1/3 |
title.glow |
all cx | "00D2FF-6-60" |
1/3 |
title.shadow |
all cx | "000000-4-45-2-40" |
1 |
title.bold/size/color |
all cx | true / 14 / 2E5090 |
2 |
legend |
all cx | bottom | none |
1/3 |
legendfont |
all cx | "9:8B949E:Helvetica Neue" |
1 |
axisfont |
all cx | "10:58626E:Helvetica Neue" |
1 |
colors |
per-point on single-series cx (funnel/treemap/sunburst); per-series on multi-series cx | 4472C4,5B9BD5,... |
— |
chartFill (solid only) |
all cx | F8FAFC |
1/2 |
plotFill (solid only) |
all cx | FFFFFF |
2 |
anchor |
all chart types | "A1:M20" |
5 |
preset |
all chart types | minimal | dark | corporate | magazine | dashboard | colorful | monochrome |
5 |
autotitledeleted |
all chart types | true |
5 |
plotvisonly |
all chart types | true |
5 |
Known Validation Warning
officecli validate charts-extended.xlsx reports schema warnings on histogram charts' binCount / binSize elements:
[Schema] The element '...:binCount' has invalid value ''. The text value cannot be empty.
[Schema] The 'val' attribute is not declared.
This is expected. The Open XML SDK's generated schema models cx:binCount as a text-valued leaf (<binCount>5</binCount>), but real Excel writes and requires the attribute form (<binCount val="5"/>). OfficeCLI writes the Excel-compatible form via a raw unknown element; the SDK validator then complains. See ChartExBuilder.cs:793–801 for the rationale. Files open and render correctly in Excel.
Inspect the Generated File
officecli query charts-extended.xlsx chart
officecli get charts-extended.xlsx "/1-Waterfall & Funnel/chart[1]"
officecli view charts-extended.xlsx outline