Excel Tables¶
Data Model workflow (CRITICAL):
Excel Tables on worksheets are NOT automatically in the Data Model (Power Pivot). To analyze worksheet data with DAX measures:
- Ensure data is formatted as an Excel Table (use create action if needed)
- Use
add-to-data-modelaction to add the table to Power Pivot - Then use
datamodelto create DAX measures on it
Action disambiguation:
- create: Create NEW table from a range (requires sheetName, tableName, rangeAddress). Pass
tableStylehere to style at creation time. - read: Get table metadata (range, columns, style, row counts)
- get-data: Get actual table DATA as 2D array (use visibleOnly=true for filtered data)
- rename: Rename an existing table
- delete: Remove table (keeps data, removes table formatting)
- resize: Change table range (expand/contract)
- set-style: Change table visual style (TableStyleLight1-21, TableStyleMedium1-28, TableStyleDark1-11). Default is TableStyleMedium2.
- toggle-totals: Show or hide the totals row (showTotals: true/false)
- set-column-total: Set the aggregate function on a totals-row column (Sum, Count, Average, Min, Max, None)
- add-to-data-model: Add an existing worksheet table to Power Pivot for DAX analysis
- append: Add rows to existing table (requires rows or rowsFile parameter)
- create-from-dax: Create table populated by a DAX EVALUATE query from Data Model
- update-dax: Update an existing DAX-backed table's query
- get-dax: Get the DAX query behind a DAX-backed table
Table styling — always use table styles, not range_format:
Excel Tables manage their own header/row/totals formatting through table styles. Never use range_format(action: 'format-range') on table header rows — it conflicts with the table style and produces inconsistent formatting.
| Goal | Correct approach |
|---|---|
| Style a table | table(action: 'set-style', tableStyle: 'TableStyleMedium2') |
| Style at creation | table(action: 'create', tableStyle: 'TableStyleMedium2', ...) |
| Custom branding on table | Use a Medium/Dark table style that matches your palette — avoid overriding individual cells |
Common table style choices: - TableStyleMedium2 — standard blue, most widely used - TableStyleMedium9 — orange accent - TableStyleLight1 — minimal borders, no header fill - TableStyleDark1 — dark header with white text
DAX-backed tables (NEW):
Create worksheet tables populated by DAX EVALUATE queries against the Data Model. Perfect for creating summary/report tables with aggregated data.
Workflow:
1. Have data in Data Model (via table add-to-data-model or powerquery)
2. Use create-from-dax with a DAX EVALUATE query
3. Table is created on worksheet with query results
4. Use update-dax to change the query, get-dax to inspect it
Example DAX queries for create-from-dax: - EVALUATE SUMMARIZE('Sales', 'Sales'[Region], "Total", SUM('Sales'[Amount])) - EVALUATE TOPN(10, 'Products', 'Products'[Revenue], DESC) - EVALUATE FILTER('Customers', 'Customers'[Country] = "USA")
add-to-data-model behavior:
- Only works on Excel Tables (ListObjects), not plain ranges
- Table appears in Power Pivot with same name
- After adding, use datamodel to create DAX measures
- Idempotent: calling on already-added table is a no-op
When to use which tool:
| Goal | Tool |
|---|---|
| Create/manage worksheet tables | table |
| Add worksheet table to Power Pivot | table (add-to-data-model) |
| Import external data to Data Model | powerquery (loadDestination='data-model') |
| Create DAX measures | datamodel |
| Create PivotTables from Data Model | pivottable |
Common mistakes:
- Trying to create DAX measures without first adding table to Data Model
- Using datamodel to add tables (it only manages existing Data Model tables)
- Confusing get-data (returns cell values) with read (returns metadata)
- Forgetting hasHeaders parameter when creating tables from headerless data
Server-specific quirks:
- Style parameter is overloaded: table style name OR total function (context-dependent)
- csvData parameter: dedicated parameter for append action (CSV format: comma-separated, newline-separated rows)
- visibleOnly parameter only applies to get-data action
- Table names must be unique within workbook (Excel requirement)