Rich Table

approved

by sdking

Spreadsheet-like tables in a fenced code block: merged cells, typed columns, sort, filter and summary rows, frozen panes, multi-sheet workbooks, plus Kanban and calendar views of the same rows. - This plugin has not been manually reviewed by Obsidian staff.

โ˜… 22 starsโ†“ 3,759 downloadsUpdated 16d agoAGPL-3.0
Rich Table

๐Ÿ”€ Merge ย ยทย  ๐Ÿท๏ธ Type ย ยทย  ๐ŸŽจ Style ย ยทย  ๐ŸงŠ Freeze ย ยทย  ๐Ÿ”ฝ Sort & Filter ย ยทย  ฮฃ Summary ย ยทย  ๐Ÿ“‘ Sheets ย ยทย  ๐Ÿ—‚๏ธ Kanban ย ยทย  ๐Ÿ“… Calendar ย ยทย  ๐Ÿ”— Wikilink ย ยทย  ๐Ÿ“ Math

Latest release Total downloads License Obsidian community plugin Donate via PayPal

Install ยท Demo ยท Keyboard ยท Settings ยท Features ยท Format ยท Export as .xlsx ยท External .xlsx ยท ไธญๆ–‡

WeChat public account
Follow on WeChat for more Obsidian plugins & tools

Obsidian only. The rich-table fenced code block is rendered by the plugin โ€” it won't display in standard Markdown editors or GitHub previews.

Rich, interactive tables for Obsidian โ€” with cell merges, inline editing, wikilink autocomplete, typed columns, drag-to-reorder, math formulas, lists, images, and more.


Why Rich Table?

A detailed comparison against Obsidian's native Markdown tables and several community table plugins (maintenance status varies). Based on each project's public README/docs as of 2026-09 โ€” feature sets may change with newer releases.

Legend: ๐ŸŸข fully supportedใ€€๐Ÿ”ด not supportedใ€€๐ŸŸก partial support / limited

DimensionRich TableNative MD tableAdvanced TablesTable ExtendedAdvanced Table XTEnhanced TablesTable MasterBetter TablesSmart Table
Data Format & StorageData carrierYAML code blockNative MDNative MDMD (MMD6)Native MDMD + YAML configNative MDMD + hidden commentJSON code block
Obsidian-only?๐Ÿ”ด๐ŸŸข๐ŸŸข๐ŸŸข๐ŸŸข๐ŸŸข๐ŸŸข๐ŸŸก๐Ÿ”ด
Cell ContentClick-to-edit cells inline๐ŸŸข๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸก๐ŸŸข๐ŸŸข๐ŸŸข
Rich text (bold/links/imagesโ€ฆ)๐ŸŸข๐ŸŸข๐ŸŸข๐ŸŸข๐ŸŸข๐ŸŸก๐ŸŸข๐ŸŸก๐Ÿ”ด
Lists inside a cell๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐ŸŸข๐ŸŸก๐ŸŸข๐Ÿ”ด๐Ÿ”ด
Wikilink autocomplete๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐ŸŸก๐Ÿ”ด
LaTeX math formulas๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Multi-line content๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐ŸŸข๐Ÿ”ด
Typed columns (status/priority/dateโ€ฆ)๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸข
Structural EditingCell merge / split๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐ŸŸข๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด
Drag-resize column width/row height๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐ŸŸข
Auto-fit row height/column width๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Drag-reorder rows/columns๐ŸŸข๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐ŸŸข๐ŸŸข
Insert/delete/hide rows & columns๐ŸŸข๐ŸŸก๐ŸŸข๐ŸŸก๐ŸŸก๐Ÿ”ด๐ŸŸข๐ŸŸข๐ŸŸข
Transpose whole table๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Data OperationsSorting๐ŸŸข๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐ŸŸข๐Ÿ”ด๐ŸŸข
Row filtering by value๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸข
Cell formulas๐ŸŸข๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸก๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Summary / aggregate rows๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Paste table from Excel/web๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด
Export CSV๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐ŸŸข
Export / link .xlsx๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Nested tables๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Style & AppearancePer-cell/row/column custom style๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐ŸŸก๐ŸŸข๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Built-in themes๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Column alignment๐ŸŸข๐ŸŸข๐ŸŸข๐ŸŸข๐ŸŸข๐Ÿ”ด๐ŸŸข๐ŸŸข๐ŸŸข
Table title / footer note๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐ŸŸก๐Ÿ”ด๐Ÿ”ด
Whole-table zoom๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Interaction & UsabilityKeyboard arrow/Tab/Enter navigation๐ŸŸข๐Ÿ”ด๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐ŸŸข๐ŸŸข๐Ÿ”ด
Freeze rows/columns๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Table lock๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Other FeaturesMulti-sheet workbook๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Kanban / calendar view๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Table snapshot export (PNG/SVG)๐ŸŸข๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด
Project HealthAs of 2026-09-16actively maintainedโ€”2026-052022-012026-062024-032026-052026-072026-08

Installation

Community plugin browser (recommended):

  1. Open Settings โ†’ Community plugins โ†’ Browse
  2. Search for Rich Table and install
  3. Enable the plugin

Or: Open in Obsidian

Manual: copy main.js, manifest.json, styles.css to <vault>/.obsidian/plugins/rich-table/

Minimum Obsidian version: 1.8.7


Demo

โฌ†๏ธ Upgrading from v0.x? โ€” v1 โ†’ v2 migration: the upgrade banner on old-format tables, converting in one click or keeping the old format read-only.

Upgrade 1 ยท Quick start from template โ€” or a blank table

Type ```rich-table yourself, or skip typing it: run Insert rich-table block from the command palette (bind it your own hotkey under Settings โ†’ Hotkeys), click the ribbon icon, or right-click in the editor and pick it from the context menu โ€” all three drop an empty block at the cursor.

Already have a plain Markdown table? Run Convert to rich-table from the command palette (bind your own hotkey the same way) with the cursor on it โ€” it's replaced in place, header row becoming column names and the rest becoming data. Also on the editor right-click menu, though Live Preview's own table-editing widget intercepts right-clicks made directly on the table itself; switch to Source Mode, or use the command palette, if the menu item doesn't show up there.

An empty rich-table code block shows one button per built-in template (currently a full-featured Demo and a Cornell Notes layout) plus Insert blank table, which opens a Word/Sheets-style size picker โ€” hover an 8ร—6 grid to preview and click to confirm a row/column count, or type exact numbers for anything past the visible grid. Hovering any button live-previews that option below; with nothing hovered, the default template previews. Templates are auto-discovered from src/templates/*.yaml (same pattern as themes) โ€” no code changes needed to add one.

Quick start demo

2 ยท Merge cells โ€” drag-select โ†’ Merge in popup

Merge cells demo

3 ยท Typed columns & cell style โ€” click to pick value, double-click to set style

Typed columns and style demo

4 ยท Drag to reorder & row/column ops โ€” โ ฟ handle + double-click menu

Reorder and ops demo

5 ยท Drag to resize โ€” column header right edge ยท row bottom edge. Only the dragged column/row changes size; the table's overall width/height grows or shrinks to match, same as Excel. A column/row with no width/height of its own tracks its content automatically ("auto"); dragging pins it to a fixed size, and double-clicking the resize handle clears it back to auto

Resize demo

6 ยท Title & footer โ€” click to edit, Shift+Enter for multi-line

Title and footer demo

7 ยท Column filtering โ€” filter rows to focus on what matters

Column filtering demo

8 ยท Rich cell content โ€” math ยท bold/italic ยท links ยท images ยท lists ยท multi-line

๐ŸŽฌ Demo GIF coming soon

9 ยท Copy/paste interop with Excel & Markdown โ€” paste a range from Excel/Sheets straight into a cell (detected via clipboard HTML), or a standard Markdown/GFM pipe table pasted as plain text (typed by hand, copied from another note, an LLM reply, GitHub, etc.); pasting onto a header cell instead converts the whole thing โ€” the pasted header row becomes column names, the rest becomes data, table-format conversion in one paste. Copy a selection out as an Excel-compatible table or as a Markdown table, from the selection/cell/header menus โ€” merged cells in the copied range carry over intact. Ctrl+V also works directly on a Selected cell or multi-cell range (no need to be editing), pasting starting at its top-left corner and reconstructing any merges the copied range had; a destination merge it collides with is absorbed rather than rejected

demo-copy-from-excel

10 ยท Row sorting โ€” column selector popup: one-time sort or live auto-sort with a header indicator

่กŒๆŽ’ๅบ

11 ยท Summary/aggregate rows โ€” Sum/Average/Min/Max/Count via the ฮฃ icon or column selector popup; per-row remove and reorder

ๆฑ‡ๆ€ป่กŒ

12 ยท Collapse/expand table โ€” fold-icon button hides/shows the body while keeping the title and header row visible

่กจๆ ผๆŠ˜ๅ /ๅฑ•ๅผ€

13 ยท Table lock โ€” ๐Ÿ”’ icon disables all graphical editing for that table; a cell's text stays selectable by mouse drag and copyable with the browser's own Ctrl+C, same as any other page

่กจๆ ผ้”ๅฎš

14 ยท Auto-fit all โ€” โŠž icon clears every column/row's own width/height back to auto, so they all track their content from then on rather than being fit once and pinned

ไธ€้”ฎ่‡ช้€‚ๅบ”

15 ยท Theme picker โ€” ๐ŸŽจ icon switches between built-in themes (academic, grid, plain)

ไธป้ข˜ๅˆ‡ๆข

16 ยท Split cell โ€” double-click a plain cell โ†’ split into 2 rows/columns; other cells in that row/column keep their current shape. The header row can split too, and merge downward into data rows, from the same panel

split-cell

17 ยท Status bar โ€” row/column totals, selection size and sum/average; drag the divider to resize its own scrollbar track; โš™๏ธ view settings to pin it or show only on hover

็Šถๆ€ๆ 

18 ยท Transpose โ€” flip icon in the left control column swaps rows and columns; column type, formulas, sort and views don't carry across and are dropped

็Šถๆ€ๆ 

19 ยท Nested tables โ€” a cell's content can itself be a rich-table block, rendered and fully interactive in place

็Šถๆ€ๆ 

20 ยท Select all โ€” grid icon in the left control column selects every cell (header included) and opens the same range menu a corner-to-corner drag-select would

๐ŸŽฌ Demo GIF coming soon

21 ยท Zoom โ€” Excel-style โˆ’/slider/+ control in the status bar, between the row/column totals and the scrollbar; scales the whole table โ€” content, images, cell sizes โ€” from 25% to 400%, saved with the table

็Šถๆ€ๆ 

21 ยท Ref external excel file โ€” View and Edit external excel file, Support multiple sheet and cell/merge edit.

็Šถๆ€ๆ 


Keyboard

keyboard

A cell is in one of three states, and every shortcut below follows from which one you're in.

Editing โ€” an editor is open in the cell. This is where a click lands you.

Key
EscDiscard the edit, keep the cell selected (like Excel โ€” nothing is written)
EnterCommit and keep the cell selected
Tab / Shift+TabCommit, then select the next / previous cell
โ† โ†’Move the caret. Once it's at the first/last character, commit and select the cell beside it
โ†‘ โ†“Jump to the start / end of the cell's content. Once there, commit and select the cell above / below
Shift+EnterLine break inside the cell

Selected โ€” the cell is outlined but no editor is open. Reached with Esc or Enter above.

Key
โ† โ†’ โ†‘ โ†“Move the selection. Left/right wraps to the next row at a row's end; up/down stops at the table's edge
Tab / Shift+TabSame as โ†’ / โ†
Any characterStart editing, replacing the cell's contents with what you typed
EnterStart editing, keeping the contents (fully selected, so one keystroke replaces them)
Backspace / DeleteClear the cell without opening an editor

Notes:

  • The header row takes part โ€” arrow up from the first data row to reach it; typing there renames the column.
  • Merged cells are entered at their anchor, never at a position they cover; hidden and filtered-out rows and columns are skipped.
  • Typed columns behave per type: a date cell opens the native picker, where the arrow keys step the day/month/year segments instead; a choice cell opens Obsidian's own value menu, which you navigate as any Obsidian menu. Tab commits and moves on from either.

Formulas

้”ฎ็›˜ๆ“ไฝœ

Type = into a plain cell to start a formula โ€” same trigger as Excel/Sheets. Supports arithmetic (+ - * /, parentheses) and SUM / AVG / MIN / MAX / COUNT over a range. While typing, click another cell to insert a reference, or drag to insert a range โ€” no need to type a cell address by hand.

A formula follows the row/column it references, not its position, so inserting or reordering rows/columns never breaks it. A deleted reference shows #REF!; other results are #CIRCULAR! (self-reference), #DIV/0!, and #VALUE!.


Claude Code Skill

A SKILL.md is included for use with Claude Code. Once installed, Claude agents can create and modify rich-table blocks directly in your vault โ€” adding rows, applying styles, defining merges โ€” without you having to remember the syntax.

cp SKILL.md ~/.claude/skills/rich-table/SKILL.md

Then ask Claude: "Create a project tracker table in my note using rich-table".


Settings

Open Settings โ†’ Rich Table to configure the plugin.

SettingDefaultDescription
Allow editing in reading viewOffWhen off, all interactive behaviour (hover strips, click-to-edit, panels, dropdowns) is disabled in Obsidian's reading view. Live preview / source mode is always interactive.
Single-click to editOffWhen on, a single click on a cell enters edit mode immediately (no delay), and the style panel opens with Ctrl/Cmd+click instead of double-click. When off (default), single click enters edit after a short delay and double click opens the style panel.
Left-toolbar buttonsAll shownIndependently hide any of the left-toolbar (lock, auto-fit, theme, snapshot, export, โ€ฆ) buttons, separately for a locked table, an unlocked table, and a table backed by an external .xlsx file โ€” each list only offers the buttons that actually apply to that scenario.
Custom typesโ€”Define custom choice-column types with labels and colors.
Changelogโ€”Button to open the full release history at any time. It also opens automatically the first time the plugin loads after an update.

Features & Roadmap

Status: โœ… shipped ยท ๐Ÿ”œ planned. Priority reflects how well something fits the current design โ€” P1 fits as it stands ยท P2 fits but needs a new piece inside it ยท P3 needs architectural change, a heavy dependency, or more thought.

AreaCapabilityStatusPriority
EditingClick any cell to edit โ€” full Markdown, with [[ triggering Obsidian's own file & heading autocompleteโœ…โ€”
Keyboard navigation โ€” arrow keys, Tab, type-to-replace (see Keyboard)โœ…โ€”
Cell, header and selection menus โ€” insert / delete / hide rows & columns, merge, style, column type. Alignment is layered: the column-selector strip's own menu sets a column's default (covers future rows too); a header cell or a data cell/range can override it just for itself, from the same "Align" flyout. A left-control-column "select all" button reaches the same range menu without dragging corner-to-corner by handโœ…โ€”
Excel / Sheets / Markdown-table clipboard โ€” paste a range from Excel/Sheets or a pasted/typed Markdown table into a cell (or onto a header cell to convert the whole table's format), copy a selection back out (or as a Markdown table); merged cells round-trip both ways, and Ctrl+V works directly on a Selected cell/range, not just while editingโœ…โ€”
Table title and footer notes โ€” click to edit inlineโœ…โ€”
Insert a block without typing the fence โ€” command palette (assign your own hotkey), ribbon icon, or editor right-clickโœ…โ€”
Convert an existing plain Markdown table to rich-table in place, from the editor right-click menuโœ…โ€”
Cell comments๐Ÿ”œP2
Cell contentFull Obsidian Markdown โ€” bold, italic, highlight, [[wikilinks]], links, lists, multi-lineโœ…โ€”
Math formulas โ€” inline KaTeX, $E=mc^2$โœ…โ€”
Images โ€” ![](url) or ![[local.png]], drag an edge to resizeโœ…โ€”
Another table embedded read-only in a cell๐Ÿ”œP3
Columns & dataTyped columns โ€” colored pills, click to pick; six built-in types plus your own in Settingsโœ…โ€”
Filter rows by value โ€” funnel icon on each column headerโœ…โ€”
Sort rows โ€” one-time, or live with an indicator until clearedโœ…โ€”
Summary rows โ€” Sum / Average / Min / Max / Count over the visible rowsโœ…โ€”
Formulas โ€” Excel-style =SUM(A1:B3), arithmetic, click/drag to insert a referenceโœ…โ€”
Progress-bar column type๐Ÿ”œP1
A chart of the table's own data๐Ÿ”œP2
StylingPer-cell background, text color and font size โ€” via panel or YAMLโœ…โ€”
Row / column selector strips โ€” hover to reveal, style a whole row or column at onceโœ…โ€”
Themes โ€” academic, grid, plain; plus a few CSS variables for small tweaks (see Themes)โœ…โ€”
Conditional formatting โ€” styles applied automatically from value rules๐Ÿ”œP2
StructureMerge cells, and split a plain cell into two rows or columns โ€” including the header row, which can split and merge downward into data rowsโœ…โ€”
Drag to reorder rows / columns; drag to resize (fixes a size) or double-click / โŠž to clear back to auto (tracks content)โœ…โ€”
Insert, hide and delete rows / columns; hover an edge for + stripsโœ…โ€”
Freeze the header plus the first N rows / columnsโœ…โ€”
Transpose in place โ€” swap rows and columnsโœ…โ€”
Transposed starting template โ€” row and column headers the same๐Ÿ”œP1
Row grouping โ€” collapsible groups๐Ÿ”œP3
Nest a rich-table block inside a cell of another one โ€” renders and edits fully in placeโœ…โ€”
ViewsKanban โ€” lanes from any choice column; drag a card to change its valueโœ…โ€”
Calendar โ€” a month grid from any date column; drag an event to rescheduleโœ…โ€”
Multi-sheetWorkbooks โ€” an Excel-style tab bar once a table has two or more sheets, each with its own columns, rows, styles and viewsโœ…โ€”
Tabs โ€” click to switch, double-click to rename, drag to reorder, right-click for color / deleteโœ…โ€”
Whole tableLock โ€” ๐Ÿ”’ disables every graphical edit for that tableโœ…โ€”
Collapse โ€” hide the body, keeping the title and header rowโœ…โ€”
Status bar โ€” row/column totals and, with a range selected, its size and sum/average; own scrollbar with an adjustable track; pinned or hover-onlyโœ…โ€”
Zoom โ€” Excel-style โˆ’/slider/+ control in the status bar scales the whole table (content, images, cell sizes) 25%โ€“400%, persisted per tableโœ…โ€”
Snapshot โ€” export the current table as a sharp PNG (copy to clipboard, or save) or SVG, hover-only chrome excluded and the full table captured even if it's scrolled/boundedโœ…โ€”
Export as .xlsx (see Export as .xlsx) โ€” a native (non xlsx-backed) table only; pick a destination folder/filename, every sheet if it's a workbookโœ…โ€”
Back a table with an external .xlsx file (see External .xlsx) โ€” auto-refreshes on external edits, tracks the file if renamed, one click to open it in Excel/LibreOffice or convert to a plain tableโœ…โ€”
Edit that external .xlsx file's cell content and merges directly from Obsidian (see External .xlsx) โ€” writes straight to the file, not the note; other edits (style, sort, rows/columns) stay view-only for nowโœ…โ€”

Format

```rich-table
---
version: 2
title: Project tracker
columns:
  - id: c_000000
    name: Task
    width: 200
  - id: c_000001
    name: Status
    type: task-status
    width: 110
rows:
  - id: r_000000
    cells:
      c_000000: "**Design** โ€” architecture review"
      c_000001: done
  - id: r_000001
    cells:
      c_000000: Build
      c_000001: pending
  - id: r_000002
    cells:
      c_000000: |-
        - Write tests
        - Fix edge cases
      c_000001: todo
merges:
  - anchor: r_000000.c_000000
    end: r_000001.c_000000
styles:
  - target: header
    bold: true
    bg: "#e8f0fe"
  - target: r_000000.c_000001
    bg: "#f0fdf4"
footer: "Updated weekly ยท click any cell to edit"
---
```

The YAML front-matter is the only data source โ€” everything is edited through the table UI, not by hand-editing this block.

Cell content supports full Obsidian Markdown: **bold**, *italic*, [[wikilinks]], [links](url), ![images](url), - lists, $math$, <br> for line breaks.

width/height are both optional โ€” a column/row with no width/height field is "auto": it renders at whatever size fits its content and keeps tracking that as content changes. Setting either to a specific number (by dragging) pins it; double-clicking a resize handle or clicking Auto-fit all removes the field again rather than writing a computed number.

Style targets (v2 ID-based):

TargetMeaning
headerEntire header row
header.c_xxxSingle header cell
r_xxxEntire data row
c_xxxEntire column (including header)
r_aaa:r_bbbRow range
c_aaa:c_bbbColumn range
r_aaa.c_aaa:r_bbb.c_bbbRectangle range
r_xxx.c_yyySingle data cell

Upgrading from v0.x? Tables written in the old format automatically show an upgrade banner. Click Convert to new format for one-click migration, or Keep old format to continue reading without converting.


Export as .xlsx

Any native table (one using the block's own columns/rows โ€” not backed by an external file, see External .xlsx below for that case) can be exported to a real .xlsx file via the folder-with-an-up-arrow icon in the table's left toolbar. The modal has two independent ways to finish, pick whichever fits:

  • In this vault โ€” a folder field (with vault-folder autocomplete) and a file name (defaulting to the table's own title, or the note's name if it has none), then its own Export button.
  • Custom location (desktop only) โ€” one Choose locationโ€ฆ button that opens your system's own save dialog; exporting happens the instant you confirm a location there, no separate Export click needed. This uses an Electron capability Obsidian doesn't officially document, so it's a best-effort convenience โ€” the vault section above always works regardless, and is the only option on mobile.

A multi-sheet workbook exports every sheet into the one file, each becoming its own xlsx worksheet. Cell content, merges, background/text color, bold/italic, font size, and column/row sizing all carry over into the exported file. A column/row you've resized in Obsidian keeps that exact size; any column/row you haven't gets a width/height estimated from its own content (longest line, CJK counted double-width) instead of Excel's flat default, so cell text isn't clipped the moment you open the file. The note itself is never touched โ€” the export writes only the new .xlsx file. Exporting to a path that already exists asks to confirm before overwriting it.

External .xlsx

A table can be backed by an external .xlsx file instead of the block's own columns/rows โ€” useful for viewing a spreadsheet someone else maintains without duplicating it into the note:

```rich-table
---
version: 2
xlsxSource:
  path: data/budget.xlsx
---
```

path is resolved the same way a wikilink target is (relative to the note, or a full vault path). sheet is optional โ€” omit it to show every sheet as a workbook (or the single sheet, if the file only has one); name a specific sheet to show just that one.

The easiest way to create one: insert an empty rich-table block, then click Import from .xlsx among the template buttons and pick a file already in your vault.

Editing cell content and merges writes straight back into the .xlsx file itself โ€” never into the note, which only ever holds the xlsxSource reference. Click a cell to edit its text (including the header row) the same way as any other table; drag-select a range and choose Merge cells, or double-click/right-click an existing merge for Unmerge. Everything else (sort, style, freeze, row/column insert-delete, โ€ฆ) stays view-only for now โ€” those actions aren't offered at all, rather than appearing and silently doing nothing. Editing preserves whatever else the cell already had (a number stays a number if the new text still parses as one, a boolean stays a boolean for TRUE/FALSE, otherwise Excel's own "General" auto-detect applies); a leading = makes it a formula, and clearing the text deletes the cell outright. If the file can't be saved (e.g. it's open and locked in Excel), a Notice reports the failure and the table reverts to the file's real (unchanged) content instead of leaving a stale-looking edit on screen.

  • Auto-refresh โ€” editing the file in Excel/LibreOffice/etc. and saving updates the table within about half a second, no reload needed. The same refresh picks up the plugin's own writes.
  • Follows renames โ€” moving or renaming the file updates xlsxSource.path in the block automatically.
  • Deleted-file handling โ€” if the file goes away, the table shows an error instead of silently going stale.
  • Open in default app and Convert to plain table โ€” two buttons in the table's left toolbar. The first hands the file to whatever your OS associates with .xlsx (desktop only). The second snapshots the file's current content into the block itself as ordinary columns/rows, permanently dropping the xlsxSource reference โ€” after that it's a normal, fully-editable rich-table.
  • Theme โ€” defaults to grid (no interactive picker, since theme switching isn't part of what this table can edit yet); add theme: <id> to the block's own YAML alongside xlsxSource to use a different built-in theme instead.

Known gaps: no concurrency control (last write wins, same as the file itself); theme-relative/indexed colors, cell borders and number formats aren't carried over on read; formula cells show only their last-saved value (no formula engine); rich-text runs are flattened to plain text; the style panel hides background/text-color/size/bold/italic for an xlsx-backed cell (readable, not yet writable).


Themes

Add theme: to the YAML front-matter to apply a built-in visual theme:

theme: academic   # LaTeX booktabs style โ€” three horizontal rules, no grid lines
theme: grid       # Excel "All Borders" style โ€” full grid, bold outer frame + header rule
theme: plain      # Colorful gradient header + animated border
ThemeDescription
(none)Default โ€” no special styling
academic ๐Ÿ“Inspired by LaTeX's booktabs package: toprule / midrule / bottomrule, no vertical lines, no cell backgrounds
grid ๐Ÿ”ฒFull grid on every cell, a bolder outer frame, and a bolder rule separating the header from the data
plain ๐Ÿ™‚Animated rainbow border, gradient header with breathing effect, cursor-reactive row glow

Themes are purely visual โ€” they never affect data or layout.

Quick customization without a theme: for a small tweak (not a full theme), set one of these CSS variables on .bt-render-root in an Obsidian CSS snippet โ€” no selectors needed:

VariableControlsDefault
--bt-border-outerTable's outer edgenone
--bt-cell-border (+ -right/-bottom)Gridlines between cellsnone
--bt-cell-bgData cell backgroundtransparent
--bt-header-bgHeader cell backgroundtheme default

A cell draws only its right and bottom edge; the table's own --bt-border-outer supplies the grid's top and left edge. --bt-cell-border-top/-left are still accepted but no longer contribute to gridlines โ€” with one border per edge, drawing all four would render every internal line at double thickness. This is what lets frozen rows/columns keep their gridlines while scrolling.

.bt-render-root {
  --bt-header-bg: #223;
  --bt-cell-bg: #fafafa;
  --bt-border-outer: 2px solid #888;
}

A manually-set per-cell style (via the style panel) always wins over both themes and these variables.


Known Issues

IssueWorkaround
Reading mode: v2 tables remain interactive โ€” In Obsidian reading view, v2-format tables still show hover strips and allow editing. The allowReadingViewEdit setting has no effect on v2 tables. v1 tables (awaiting upgrade) are correctly read-only.Use the ๐Ÿ”’ lock button to prevent accidental edits in reading mode.

License

AGPL-3.0 โ€” derivatives must be open-sourced under the same license.

For commercial licensing: sdkxyx@gmail.com


Acknowledgements

.xlsx parsing/writing is powered by @office-kit/xlsx.


Support the Project

Rich Table is free and open-source under the AGPL-3.0 license. If this plugin has improved your workflow, you can support its ongoing development with a voluntary donation. Every contribution helps fix bugs, add new features, and maintain compatibility with future Obsidian updates.

๐Ÿ’ณ PayPal

Donate via PayPal

๐Ÿงง WeChat Pay / Alipay

WeChat PayAlipay
WeChat Pay donation QR codeAlipay donation QR code

Thank you for your support! ๐Ÿ™


Feedback

Issues and feature requests: GitHub Issues


Star History Chart

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.