{
  "$schema": "../_schema.json",
  "format": "xlsx",
  "element": "table",
  "elementAliases": ["listobject"],
  "parent": "sheet",
  "operations": {
    "add": true,
    "set": true,
    "get": true,
    "query": true,
    "remove": true
  },
  "paths": {
    "positional": [
      "/SheetName/table[N]"
    ]
  },
  "note": "'ref' (alias 'range') required: cell range like 'A1:C10'. Rejects ranges that overlap existing tables. Names sanitized; style validated against built-in/custom whitelist. QUERY: `query table` returns real ListObjects (type=table) PLUS heuristically detected table-shaped blocks (type=detectedtable, stable=false, honest range path like /Sheet1/A1:D10 — never a fake /table[N]). Detection is strict/high-precision: a block qualifies only with a contiguous >=2-column non-numeric-text header row, >=1 data row below, and no overlap with a real ListObject. Use `query listobject` to get ONLY real ListObjects (no detection). add/set/get/remove operate exclusively on real ListObjects via /table[N]; detected blocks are query-only and addressed by their range path.",
  "extends": [
    "_shared/table",
    "_shared/table.pptx-xlsx"
  ],
  "properties": {
    "ref": {
      "type": "string",
      "description": "cell range reference (A1:C10). Required. Alias: range.",
      "aliases": [
        "range"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop ref=A1:C10"
      ],
      "readback": "range string",
      "enforcement": "report"
    },
    "displayName": {
      "type": "string",
      "description": "Excel UI display name. Defaults to name.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop displayName=SalesData"
      ],
      "readback": "display name",
      "enforcement": "report"
    },
    "headerRow": {
      "type": "bool",
      "description": "show header row. Alias: showHeader.",
      "aliases": [
        "showHeader"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop headerRow=true"
      ],
      "readback": "true/false",
      "enforcement": "report"
    },
    "totalRow": {
      "type": "bool",
      "description": "show total row. Aliases: totalsRow, showTotals.",
      "aliases": [
        "totalsRow",
        "showTotals"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop totalRow=true"
      ],
      "readback": "true/false",
      "enforcement": "report"
    },
    "autoExpand": {
      "type": "bool",
      "description": "auto-expand range downward through contiguous non-empty rows at Add time.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop autoExpand=true"
      ],
      "readback": "affects range at Add time",
      "enforcement": "report"
    },
    "showFirstColumn": {
      "type": "bool",
      "description": "highlight the first column with the table style. Alias: firstColumn.",
      "aliases": [
        "firstColumn"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop showFirstColumn=true"
      ],
      "readback": "true/false",
      "enforcement": "report"
    },
    "showLastColumn": {
      "type": "bool",
      "description": "highlight the last column with the table style. Alias: lastColumn.",
      "aliases": [
        "lastColumn"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop showLastColumn=true"
      ],
      "readback": "true/false",
      "enforcement": "report"
    },
    "showRowStripes": {
      "type": "bool",
      "description": "alternate-row banding from the table style. Default: true. Aliases: showBandedRows, bandedRows, bandRows.",
      "aliases": [
        "showBandedRows",
        "bandedRows",
        "bandRows"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop showRowStripes=false"
      ],
      "readback": "true/false",
      "enforcement": "report"
    },
    "showColumnStripes": {
      "type": "bool",
      "description": "alternate-column banding from the table style. Default: false. Aliases: showBandedColumns, bandedColumns, bandedCols, showColStripes, bandCols.",
      "aliases": [
        "showBandedColumns",
        "bandedColumns",
        "bandedCols",
        "showColStripes",
        "bandCols"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop showColumnStripes=true"
      ],
      "readback": "true/false",
      "enforcement": "report"
    },
    "columns": {
      "type": "string",
      "description": "comma-separated column header names overriding A1, B1, ... defaults.",
      "add": true,
      "set": false,
      "get": true,
      "examples": [
        "--prop columns=Name,Qty,Price"
      ],
      "readback": "comma-separated column names as stored (e.g. \"Name,Qty,Price\")",
      "enforcement": "report"
    },
    "totalsRowFunction": {
      "type": "string",
      "description": "comma-separated per-column totals row functions (none|sum|average|count|countNums|max|min|stdDev|var|custom). Effective only when totalRow=true.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop totalsRowFunction=none,sum,average"
      ],
      "readback": "per-column tokens",
      "enforcement": "report"
    },
    "totalFunction": {
      "type": "string",
      "add": false,
      "set": false,
      "get": true,
      "description": "per-column totals-row function readback (surfaces on the column child node).",
      "readback": "function token",
      "enforcement": "report"
    },
    "totalLabel": {
      "type": "string",
      "add": false,
      "set": false,
      "get": true,
      "description": "per-column totals-row label readback (surfaces on the column child node).",
      "readback": "label text",
      "enforcement": "report"
    }
  }
}
