8cb1f9f479
Publish SDK (PyPI) / publish (push) Waiting to run
Publish SDK (npm) / publish (@aionui/officecli-sdk) (push) Waiting to run
Publish SDK (npm) / publish (@officecli/officecli-sdk) (push) Waiting to run
Publish SDK (npm) / publish (@officecli/sdk) (push) Waiting to run
Publish SDK (npm) / publish (officecli-sdk) (push) Waiting to run
SDK smoke / smoke (windows-latest) (push) Waiting to run
SDK smoke / smoke (macos-latest) (push) Waiting to run
SDK smoke / smoke (ubuntu-latest) (push) Waiting to run
Skill parity / diff (push) Waiting to run
180 lines
7.8 KiB
Markdown
180 lines
7.8 KiB
Markdown
# Conditional Formatting Showcase
|
|
|
|
Exercises the full xlsx `conditionalformatting` rule family — the one major
|
|
spreadsheet feature the other excel examples don't cover. Three files work
|
|
together:
|
|
|
|
- **conditional-formatting.py** — builds the workbook via the **officecli Python SDK**.
|
|
- **conditional-formatting.xlsx** — the generated 7-sheet workbook.
|
|
- **conditional-formatting.md** — this file.
|
|
|
|
## Built on the SDK (not subprocess)
|
|
|
|
Unlike the sibling `*.py` examples (which `subprocess.run("officecli …")` once
|
|
per command), this script drives the [`officecli-sdk`](../../sdk/python) Python
|
|
client. One resident process is started; every rule is shipped over the named
|
|
pipe; all the rules for a sheet go in a single `doc.batch(...)` round-trip:
|
|
|
|
```python
|
|
import officecli # pip install officecli-sdk
|
|
|
|
with officecli.create(FILE, "--force") as doc:
|
|
doc.batch([
|
|
{"command": "set", "path": "/Sheet1/A2", "props": {"value": "58"}},
|
|
{"command": "add", "parent": "/Sheet1", "type": "conditionalformatting",
|
|
"props": {"type": "cellIs", "ref": "A2:A11",
|
|
"operator": "greaterThan", "value": "80", "fill": "C6EFCE"}},
|
|
])
|
|
```
|
|
|
|
The dict shape is identical to an `officecli batch` list item — `command`,
|
|
`path`/`parent`/`type`, and `props`. The script falls back to the in-repo SDK
|
|
copy if `officecli-sdk` isn't pip-installed, so it runs straight from a checkout.
|
|
|
|
## Regenerate
|
|
|
|
```bash
|
|
cd examples/excel
|
|
pip install officecli-sdk # plus the `officecli` binary on PATH
|
|
python3 conditional-formatting.py
|
|
# → conditional-formatting.xlsx
|
|
```
|
|
|
|
## A conditional-formatting rule
|
|
|
|
Every rule is one `add` against the sheet, with `type=` selecting the rule kind
|
|
and `ref=` the target range. The match format (fill colour, bar, scale, icons)
|
|
is carried by the remaining props:
|
|
|
|
```bash
|
|
officecli add file.xlsx /Sheet1 --type conditionalformatting \
|
|
--prop type=cellIs --prop ref=A2:A11 --prop operator=greaterThan \
|
|
--prop value=80 --prop fill=C6EFCE
|
|
```
|
|
|
|
The rule lands at `/Sheet1/cf[N]`; `get`/`set`/`remove` address it there. A
|
|
rule's differential fill is stored once in the workbook-level `<dxfs>` table
|
|
(styles.xml) and referenced by index.
|
|
|
|
## Sheets
|
|
|
|
### Sheet1 — CellIs (value comparison)
|
|
|
|
`operator` ∈ `greaterThan`, `lessThan`, `greaterThanOrEqual`,
|
|
`lessThanOrEqual`, `equal`, `notEqual`, `between`, `notBetween`. `between`/
|
|
`notBetween` use both `value` and `value2`.
|
|
|
|
```bash
|
|
officecli add file.xlsx /Sheet1 --type conditionalformatting --prop type=cellIs --prop ref=A2:A11 --prop operator=greaterThan --prop value=80 --prop fill=C6EFCE
|
|
officecli add file.xlsx /Sheet1 --type conditionalformatting --prop type=cellIs --prop ref=A2:A11 --prop operator=between --prop value=50 --prop value2=70 --prop fill=FFEB9C
|
|
```
|
|
|
|
### Sheet2 — Text rules
|
|
|
|
`containsText`, `notContainsText`, `beginsWith`, `endsWith`. The needle is
|
|
`text=`; the match fill is `fill=`.
|
|
|
|
```bash
|
|
officecli add file.xlsx /Text --type conditionalformatting --prop type=containsText --prop ref=A2:A9 --prop text=error --prop fill=FFC7CE
|
|
officecli add file.xlsx /Text --type conditionalformatting --prop type=beginsWith --prop ref=A2:A9 --prop text=Begins --prop fill=BDD7EE
|
|
```
|
|
|
|
### Sheet3 — Top / Bottom / Average
|
|
|
|
`top10`/`topN` (count via `rank=`), `topPercent` (`rank=` + `percent=true`),
|
|
`bottom`, `aboveAverage`/`belowAverage` (`aboveAverage=true|false`, optional
|
|
`stdDev=` for an N-sigma band).
|
|
|
|
```bash
|
|
officecli add file.xlsx /TopBottom --type conditionalformatting --prop type=top10 --prop ref=A2:A13 --prop rank=3 --prop fill=C6EFCE
|
|
officecli add file.xlsx /TopBottom --type conditionalformatting --prop type=topPercent --prop ref=A2:A13 --prop rank=25 --prop percent=true --prop fill=63BE7B
|
|
officecli add file.xlsx /TopBottom --type conditionalformatting --prop type=aboveAverage --prop ref=A2:A13 --prop aboveAverage=true --prop stdDev=1 --prop fill=FFEB9C
|
|
```
|
|
|
|
### Sheet4 — Data bars
|
|
|
|
`color` is the bar fill; `min`/`max` set the scale (`auto` = automatic bounds —
|
|
the default). The 2010+ extension adds `negativeColor`, `axisColor`, and
|
|
`axisPosition` (`automatic`/`middle`/`none`), so negative values render leftward
|
|
in their own colour about a mid axis.
|
|
|
|
```bash
|
|
officecli add file.xlsx /DataBars --type conditionalformatting --prop type=dataBar --prop ref=A2:A11 \
|
|
--prop color=638EC6 --prop min=auto --prop max=auto \
|
|
--prop negativeColor=FF0000 --prop axisColor=000000 --prop axisPosition=middle --prop showValue=true
|
|
```
|
|
|
|
> `min=auto`/`max=auto` is the **automatic-bound sentinel** — it serializes to
|
|
> `<cfvo type="min"/>`/`<cfvo type="max"/>` (and x14 `autoMin`/`autoMax`), the
|
|
> same as omitting the bound. (Passing a real number, e.g. `min=0 max=100`,
|
|
> pins the scale instead.)
|
|
|
|
### Sheet5 — Color scales
|
|
|
|
2-colour (`minColor`/`maxColor`) or 3-colour (`+ midColor`, midpoint via
|
|
`midPoint=`).
|
|
|
|
```bash
|
|
officecli add file.xlsx /ColorScales --type conditionalformatting --prop type=colorScale --prop ref=A2:A11 --prop minColor=FFFFFF --prop maxColor=63BE7B
|
|
officecli add file.xlsx /ColorScales --type conditionalformatting --prop type=colorScale --prop ref=B2:B11 --prop minColor=F8696B --prop midColor=FFEB84 --prop maxColor=63BE7B --prop midPoint=50
|
|
```
|
|
|
|
### Sheet6 — Icon sets
|
|
|
|
`iconset=` names the set (`3TrafficLights1`, `3Arrows`, `4Rating`, `5Rating`, …).
|
|
`reverse=true` flips the order; `showValue=false` hides the cell value behind the
|
|
icon.
|
|
|
|
```bash
|
|
officecli add file.xlsx /IconSets --type conditionalformatting --prop type=iconSet --prop ref=A2:A11 --prop iconset=3TrafficLights1
|
|
officecli add file.xlsx /IconSets --type conditionalformatting --prop type=iconSet --prop ref=D2:D11 --prop iconset=3TrafficLights1 --prop reverse=true
|
|
```
|
|
|
|
### Sheet7 — Formula, date, duplicate / unique
|
|
|
|
`formula` (a boolean expression, no leading `=`), `dateOccurring` (`period=`
|
|
token), `duplicateValues`, `uniqueValues`.
|
|
|
|
```bash
|
|
officecli add file.xlsx /FormulaEtc --type conditionalformatting --prop type=formula --prop ref=A2:A11 --prop formula="ISODD(A2)" --prop fill=BDD7EE
|
|
officecli add file.xlsx /FormulaEtc --type conditionalformatting --prop type=duplicateValues --prop ref=A2:A11 --prop fill=FFC7CE
|
|
officecli add file.xlsx /FormulaEtc --type conditionalformatting --prop type=dateOccurring --prop ref=B2:B11 --prop period=thisMonth --prop fill=FFEB9C
|
|
```
|
|
|
|
## Complete feature coverage
|
|
|
|
| Rule family | `type=` | Key props | Sheet |
|
|
|---|---|---|---|
|
|
| Comparison | `cellIs` | `operator`, `value`, `value2`, `fill` | Sheet1 |
|
|
| Text | `containsText` / `notContainsText` / `beginsWith` / `endsWith` | `text`, `fill` | Sheet2 |
|
|
| Top/Bottom | `top10` / `topN` / `topPercent` / `bottom` | `rank`, `percent`, `bottom`, `fill` | Sheet3 |
|
|
| Average | `aboveAverage` / `belowAverage` | `aboveAverage`, `stdDev`, `equalAverage`, `fill` | Sheet3 |
|
|
| Data bar | `dataBar` | `color`, `min`, `max`, `negativeColor`, `axisColor`, `axisPosition`, `showValue` | Sheet4 |
|
|
| Colour scale | `colorScale` | `minColor`, `midColor`, `maxColor`, `midPoint` | Sheet5 |
|
|
| Icon set | `iconSet` | `iconset`, `reverse`, `showValue` | Sheet6 |
|
|
| Formula | `formula` | `formula`, `fill` | Sheet7 |
|
|
| Date | `dateOccurring` | `period`, `fill` | Sheet7 |
|
|
| Dup/Unique | `duplicateValues` / `uniqueValues` | `fill` | Sheet7 |
|
|
|
|
Full property list: `officecli help xlsx conditionalformatting` (or
|
|
`schemas/help/xlsx/conditionalformatting.json`).
|
|
|
|
## Read a rule back
|
|
|
|
```bash
|
|
officecli query conditional-formatting.xlsx conditionalformatting
|
|
officecli get conditional-formatting.xlsx "/Sheet1/cf[1]" --json
|
|
```
|
|
|
|
`get` normalizes on read: colours gain a `#` prefix (`#C6EFCE`), and the rule
|
|
`type` comes back as the canonical camelCase token.
|
|
|
|
## Validating CF documents
|
|
|
|
A data-bar / colour-scale fill lives in the workbook `<dxfs>` table, so always
|
|
validate the **saved** file from a fresh process:
|
|
|
|
```bash
|
|
officecli validate conditional-formatting.xlsx
|
|
```
|