Spreadsheets
Render XLSX worksheets, edit values and formulas, and recalculate supported dependencies.
Render a worksheet
Svelte
<script lang="ts">
import { createGridSelection } from '@tumblerjs/core';
import { openSpreadsheetArtifact } from '@tumblerjs/sheets';
import { SpreadsheetGrid } from '@tumblerjs/svelte';
let { bytes }: { bytes: Uint8Array } = $props();
let artifact = $state(openSpreadsheetArtifact(bytes));
let selection = $state(createGridSelection({ row: 1, column: 1 }));
</script>
<div class="sheet" style="height: 560px; min-width: 0">
<SpreadsheetGrid
worksheet={artifact.worksheet}
calculation={artifact.calculation}
{selection}
onselectionchange={(next) => selection = next}
onedit={(edit) => artifact = artifact.editCell(edit.reference, edit.value)}
/>
</div>
<style>
.sheet :global(.tumbler-grid) { height: 100%; }
</style>Values and formulas
Inline grid edits are literal values. SpreadsheetFormulaBar interprets a leading equals sign as a formula. The headless API takes formula source without that leading sign.
TypeScript
artifact = artifact
.editCell('B2', 120)
.editCell('B3', 80)
.editFormula('B4', 'SUM(B2:B3)');
artifact.worksheet.cell('B4')?.formula; // SUM(B2:B3)
artifact.calculation.displayText('B4'); // 200Switch worksheets
Selecting a sheet returns an artifact for that sheet without throwing away workbook edits. Use the sheet name or numeric identifier.
TypeScript
const sheets = artifact.workbook.sheets;
artifact = artifact.selectSheet(sheets[1]!.name);Formatting and export
TypeScript
artifact = artifact.applyFormatting('A1:D1', {
text: { bold: { set: true } },
block: { horizontalAlignment: { set: 'center' } }
});
const output = artifact.bytes();Ordinary formulas are editable. Shared, array, data-table, dynamic-array, and external-workbook formula structures are not currently editable.