# Tables Showcase

Comprehensive table demo spanning Word (.docx), Excel (.xlsx), and PowerPoint (.pptx). Three output files are generated by a single script. This document covers the Word portion in detail.

- **tables.sh** — builds all three files with `officecli` (483 lines).
- **tables.docx** — Word output: 7 tables covering vertical merge, horizontal merge, color heatmap, border/layout/direction/cell-formatting, hmerge, RTL, and inline `data` shorthand.
- **tables.xlsx** — Excel output: 3 sheets with sales data, employee performance formulas, and cross-sheet summary.
- **tables.pptx** — PowerPoint output: 3 slides including a raw-XML data table.
- **tables.md** — this file.

## Regenerate

```bash
cd examples/word
bash tables.sh
# → tables.docx  tables.xlsx  tables.pptx
```

## Table 1: Project Progress Tracker (Vertical Merge)

A 7-row × 6-column table with `vmerge=restart`/`continue` to span project rows, shaded header, and color-coded progress cells.

```bash
# Create blank table
officecli add tables.docx /body --type table --prop rows=7 --prop cols=6

# Header row — blue shading, white bold text, center-aligned
officecli set tables.docx '/body/tbl[1]/tr[1]/tc[1]' \
  --prop text="Project Name" --prop bold=true \
  --prop shd=4472C4 --prop color=FFFFFF --prop valign=center
# ... repeat for tc[2]–tc[6] ...

# Project A rows — restart merge on first row, continue on next two
officecli set tables.docx '/body/tbl[1]/tr[2]/tc[1]' \
  --prop text="Smart Office System" \
  --prop vmerge=restart --prop valign=center --prop shd=D9E2F3
officecli set tables.docx '/body/tbl[1]/tr[3]/tc[1]' \
  --prop text="" --prop vmerge=continue --prop shd=D9E2F3
officecli set tables.docx '/body/tbl[1]/tr[4]/tc[1]' \
  --prop text="" --prop vmerge=continue --prop shd=D9E2F3

# Color-coded progress — green/amber/red
officecli set tables.docx '/body/tbl[1]/tr[2]/tc[6]' \
  --prop text="100%" --prop color=00B050
officecli set tables.docx '/body/tbl[1]/tr[3]/tc[6]' \
  --prop text="75%" --prop color=FFC000
officecli set tables.docx '/body/tbl[1]/tr[4]/tc[6]' \
  --prop text="0%" --prop color=FF0000
```

**Features:** `vmerge` (restart/continue — vertical cell merge across rows), `valign` (top/center/bottom), `shd` (hex cell background), `bold`, `color` (text color), `text`

## Table 2: Financial Statement (Gridspan + Vertical Merge)

An 8-row × 5-column table with a two-row header using `gridspan=2` (horizontal merge) and `vmerge` on the outer columns, plus right-aligned numeric data with color highlights.

```bash
officecli add tables.docx /body --type table --prop rows=8 --prop cols=5

# Two-column header span: gridspan=2 removes the merged cell;
# original tc[5] becomes tc[4] after the merge
officecli set tables.docx '/body/tbl[2]/tr[1]/tc[3]' \
  --prop text="Amount (10K USD)" \
  --prop bold=true --prop shd=2E75B6 --prop color=FFFFFF \
  --prop gridspan=2 --prop align=center

# Row 2 sub-headers (Budget / Actual)
officecli set tables.docx '/body/tbl[2]/tr[2]/tc[3]' \
  --prop text="Budget" --prop bold=true --prop shd=5B9BD5 \
  --prop color=FFFFFF --prop align=center
officecli set tables.docx '/body/tbl[2]/tr[2]/tc[4]' \
  --prop text="Actual" --prop bold=true --prop shd=5B9BD5 \
  --prop color=FFFFFF --prop align=center

# Data rows: right-align numeric cells, color-code vs. budget
officecli set tables.docx '/body/tbl[2]/tr[3]/tc[3]' \
  --prop text="500.00" --prop align=right
officecli set tables.docx '/body/tbl[2]/tr[3]/tc[4]' \
  --prop text="523.50" --prop align=right --prop color=00B050
```

**Features:** `gridspan` (integer ≥ 2; collapses that many cells into one — handler removes the absorbed `tc` elements automatically), `align` (left/center/right on cell paragraph), `vmerge` (restart/continue combined with gridspan for multi-level headers)

## Table 3: Skill Assessment Matrix (Color Heatmap)

A 6-row × 7-column color-coded matrix. Each cell uses `shd` for the fill and `color=FFFFFF` for white text, producing a traffic-light heatmap.

```bash
officecli add tables.docx /body --type table --prop rows=6 --prop cols=7

# Header row — dark navy
officecli set tables.docx '/body/tbl[3]/tr[1]/tc[1]' \
  --prop text="Name/Skill" --prop bold=true \
  --prop shd=002060 --prop color=FFFFFF --prop align=center

# Data cells: Expert=00B050, Proficient=92D050, Familiar=FFC000, Beginner=FF0000
officecli set tables.docx '/body/tbl[3]/tr[2]/tc[2]' \
  --prop text="Expert" --prop shd=00B050 --prop color=FFFFFF \
  --prop align=center --prop bold=true
officecli set tables.docx '/body/tbl[3]/tr[2]/tc[3]' \
  --prop text="Proficient" --prop shd=92D050 --prop color=FFFFFF \
  --prop align=center --prop bold=true
# ... and so on for each cell ...
```

**Features:** `shd` (cell fill for heatmap coloring), `bold` + `color=FFFFFF` (white text on colored backgrounds), `align=center`

## Table 4: Property Coverage (Border / Layout / Direction / Cell Formatting)

A table created with `border.all`, `colWidths`, `cellSpacing`, `indent`, `layout`, and `padding`, then each border side is overridden individually. Row and cell properties exercise the full tc property surface.

```bash
# Create table with all table-level props
officecli add tables.docx /body --type table \
  --prop rows=3 --prop cols=4 \
  --prop "border.all=single;8;2E74B5" \
  --prop "colWidths=2500,2500,2500,2500" \
  --prop "cellSpacing=20" \
  --prop "indent=200" \
  --prop "layout=fixed" \
  --prop "padding=80"

# Override individual border sides after creation
officecli set tables.docx '/body/tbl[4]' --prop "border.top=double;8;1F3864"
officecli set tables.docx '/body/tbl[4]' --prop "border.bottom=double;8;1F3864"
officecli set tables.docx '/body/tbl[4]' --prop "border.left=double;8;1F3864"
officecli set tables.docx '/body/tbl[4]' --prop "border.right=double;8;1F3864"
officecli set tables.docx '/body/tbl[4]' --prop "border.horizontal=single;4;9DC3E6"
officecli set tables.docx '/body/tbl[4]' --prop "border.vertical=single;4;9DC3E6"

# Row-level props: header repeat + exact height
officecli set tables.docx '/body/tbl[4]/tr[1]' \
  --prop header=true --prop height.exact=400
officecli set tables.docx '/body/tbl[4]/tr[1]/tc[1]' \
  --prop text="Cell Borders" --prop bold=true \
  --prop fill=2E74B5 --prop color=FFFFFF

# Cell with diagonal borders
officecli set tables.docx '/body/tbl[4]/tr[2]/tc[1]' \
  --prop text="border.all + tl2br + tr2bl" \
  --prop "border.all=single;8;FF0000" \
  --prop "border.tl2br=single;4;0000FF" \
  --prop "border.tr2bl=single;4;0000FF"

# Cell with run formatting
officecli set tables.docx '/body/tbl[4]/tr[2]/tc[2]' \
  --prop text="font + italic + strike + underline + highlight" \
  --prop "font=Times New Roman" \
  --prop italic=true --prop strike=true \
  --prop underline=single --prop highlight=yellow

# Cell with direction + textDirection + nowrap
officecli set tables.docx '/body/tbl[4]/tr[2]/tc[3]' \
  --prop text="direction=rtl + nowrap + textDirection=btlr" \
  --prop direction=rtl --prop nowrap=true --prop textDirection=btlr

# Cell with per-side padding
officecli set tables.docx '/body/tbl[4]/tr[2]/tc[4]' \
  --prop text="padding per side + skipGridSync" \
  --prop padding.top=50 --prop padding.bottom=150 \
  --prop padding.left=80 --prop padding.right=80

# Per-side cell borders
officecli set tables.docx '/body/tbl[4]/tr[3]/tc[1]' \
  --prop text="border.top + border.bottom" \
  --prop "border.top=single;8;FF0000" \
  --prop "border.bottom=single;8;0000FF"
officecli set tables.docx '/body/tbl[4]/tr[3]/tc[2]' \
  --prop text="border.left + border.right" \
  --prop "border.left=single;8;00FF00" \
  --prop "border.right=single;8;FF00FF"

# fitText + skipGridSync
officecli set tables.docx '/body/tbl[4]/tr[3]/tc[3]' \
  --prop text="fitText squeezes text to cell width" --prop fitText=true
officecli set tables.docx '/body/tbl[4]/tr[3]/tc[4]' \
  --prop text="width + skipGridSync" \
  --prop width=2500 --prop skipGridSync=true
```

**Features:** `border.all` (style;size;color shorthand for all 6 edges), `border.top/bottom/left/right` (outer edges), `border.horizontal/vertical` (inside dividers), `border.tl2br` (diagonal top-left to bottom-right), `border.tr2bl` (diagonal top-right to bottom-left), `colWidths` (comma-separated column widths in twips), `cellSpacing` (inter-cell gap in twips), `indent` (table left offset in twips), `layout` (fixed/autofit), `padding` (default cell padding all sides), `header` (true = repeat row as header on every page), `height.exact` (exact row height in twips), `fill` (cell background; alias for `shd`), `font`, `italic`, `strike`, `underline`, `highlight`, `direction` (rtl on cell → `w:bidi`), `nowrap`, `textDirection` (lrtb/btlr/tbrl/lrbt/tblrV/btlrV), `padding.top/bottom/left/right`, `fitText`, `width`, `skipGridSync`

## Table 5: Horizontal Merge (hmerge)

A small 2-row × 3-column table demonstrating `hmerge=restart`. Setting `hmerge=restart` on a cell inserts a `gridspan` and removes the absorbed `tc` — set other cells in the same row before applying the merge.

```bash
officecli add tables.docx /body --type table \
  --prop rows=2 --prop cols=3 \
  --prop "border.all=single;4;808080"

# Set the non-merged cell first (it will become tc[2] after merge)
officecli set tables.docx '/body/tbl[5]/tr[1]/tc[3]' --prop text="normal tc"

# Apply horizontal merge — tc[2] is absorbed; original tc[3] becomes tc[2]
officecli set tables.docx '/body/tbl[5]/tr[1]/tc[1]' \
  --prop text="hmerge restart (spans 2 cols)" \
  --prop hmerge=restart

officecli set tables.docx '/body/tbl[5]/tr[2]/tc[1]' --prop text="row 2 col 1"
officecli set tables.docx '/body/tbl[5]/tr[2]/tc[2]' --prop text="row 2 col 2"
officecli set tables.docx '/body/tbl[5]/tr[2]/tc[3]' --prop text="row 2 col 3"
```

**Features:** `hmerge` (restart — legacy horizontal merge: inserts `gridspan`, removes absorbed cell; handler re-indexes subsequent cells automatically)

> Set cells in the row that will remain **after** the merge before setting `hmerge=restart`, because the merge removes the absorbed `tc` and subsequent tc indices shift.

## Table 6: RTL Table Direction

A 2-row × 2-column table with `direction=rtl` on the table itself, which mirrors the column order (`w:bidiVisual`).

```bash
officecli add tables.docx /body --type table \
  --prop rows=2 --prop cols=2 \
  --prop "direction=rtl" \
  --prop "border.all=single;8;C00000"
officecli set tables.docx '/body/tbl[6]/tr[1]/tc[1]' \
  --prop text="RTL table" --prop bold=true
officecli set tables.docx '/body/tbl[6]/tr[1]/tc[2]' \
  --prop text="column order mirrored"
```

**Features:** `direction=rtl` on table (writes `w:bidiVisual` — mirrors column order for right-to-left reading direction)

## Table 7: Inline Data Shorthand (`data`)

Build an entire grid in one property: rows separated by `;`, cells by `,` — no
`rows`/`cols`/per-cell `set` needed.

```bash
officecli add tables.docx /body --type table \
  --prop "data=Region,Q1,Q2;North,120,150;South,90,110" \
  --prop "border.all=single;4;808080"
```

**Features:** `data` (inline grid shorthand — `;`-separated rows of `,`-separated cells; sizes the table automatically)

## Complete Feature Coverage

| Feature | Table |
|---------|-------|
| **Vertical merge:** `vmerge=restart/continue` | 1, 2 |
| **Horizontal merge:** `gridspan`, `hmerge=restart` | 2, 5 |
| **Cell background:** `shd`, `fill` | 1, 2, 3, 4 |
| **Text color & bold:** `color`, `bold` | 1, 2, 3, 4 |
| **Cell alignment:** `align`, `valign` | 1, 2, 3 |
| **Table borders:** `border.all`, `border.top/bottom/left/right`, `border.horizontal/vertical` | 4 |
| **Cell borders:** `border.all`, `border.top/bottom/left/right`, `border.tl2br`, `border.tr2bl` | 4 |
| **Table layout:** `layout`, `colWidths`, `cellSpacing`, `indent`, `padding` | 4 |
| **Row props:** `header`, `height.exact` | 4 |
| **Cell run formatting:** `font`, `italic`, `strike`, `underline`, `highlight` | 4 |
| **Cell text direction:** `direction=rtl` (cell), `textDirection`, `nowrap` | 4 |
| **Per-side padding:** `padding.top/bottom/left/right` | 4 |
| **Cell width:** `width`, `skipGridSync`, `fitText` | 4 |
| **Table RTL:** `direction=rtl` (table) | 6 |
| **Inline data shorthand:** `data` | 7 |

## Inspect the Generated File

```bash
# List all tables in the document
officecli query tables.docx table

# Inspect a specific table's structure
officecli get tables.docx '/body/tbl[1]'

# Inspect a cell's properties
officecli get tables.docx '/body/tbl[1]/tr[2]/tc[1]'

# List all rows in a table
officecli query tables.docx '/body/tbl[4]' row
```
