XLSX workbook model
retab-ui/xlsx-workbookFreeUtility
Sparse compact workbook helpers for the XLSX viewer: cell lookup, metadata projection, column labels, and bounded source caching.
Install it
npx shadcn@latest add https://ui.retab.com/r/xlsx-workbook.jsonSource
1export interface CompactSheet {2 name: string;3 rowCount: number;4 columnCount: number;5 /** Sorted row-major indexes for non-empty cells only. */6 cellIndexes: Uint32Array;7 /** Length cellIndexes.length + 1; cell i's text is text.slice(textOffsets[i], textOffsets[i + 1]). */8 textOffsets: Uint32Array;9 /** Length cellIndexes.length; 1 = numeric/date. */10 numericFlags: Uint8Array;11 /** All non-empty display texts concatenated in row-major order. */12 text: string;13}1415export interface XlsxCell {16 /** Display text: the workbook's formatted value when available. */17 text: string;18 /** Right-align numbers and dates. */19 numeric: boolean;20}2122export interface XlsxSheetMeta {23 name: string;24 rowCount: number;25 columnCount: number;26 nonEmptyCellCount: number;27}2829export interface XlsxSource {30 sheets: XlsxSheetMeta[];31 getCell(sheetIndex: number, rowIndex: number, columnIndex: number): XlsxCell;32 dispose?: () => void;33 estimatedByteSize?: number;34}3536export interface XlsxCacheOptions {37 maxEntries?: number;38 maxBytes?: number;39}4041export interface XlsxSheetChangeResult {42 accepted: boolean;43 changed: boolean;44 sheetIndex: number;45}4647interface CacheEntry {48 promise: Promise<XlsxSource>;49 source?: XlsxSource;50 bytes: number;51}5253export const EMPTY_XLSX_CELL: XlsxCell = { text: "", numeric: false };54const MAX_COMPACT_CELL_INDEX = 0xffffffff;5556export function resolveXlsxSheetChange({57 activeSheet,58 requestedSheet,59 sheetCount,60}: {61 activeSheet: number;62 requestedSheet: number;63 sheetCount?: number | null;64}): XlsxSheetChangeResult {65 if (!Number.isSafeInteger(requestedSheet) || requestedSheet < 0) {66 return { accepted: false, changed: false, sheetIndex: activeSheet };67 }68 if (69 sheetCount != null &&70 (!Number.isSafeInteger(sheetCount) ||71 sheetCount < 0 ||72 requestedSheet >= sheetCount)73 ) {74 return { accepted: false, changed: false, sheetIndex: activeSheet };75 }76 return {77 accepted: true,78 changed: requestedSheet !== activeSheet,79 sheetIndex: requestedSheet,80 };81}8283/** Spreadsheet column label: 0 -> A, 25 -> Z, 26 -> AA. */84export function xlsxColumnLabel(index: number): string {85 if (!Number.isSafeInteger(index) || index < 0) return "";86 let i = Math.floor(index) + 1;87 let label = "";88 while (i > 0) {89 const m = (i - 1) % 26;90 label = String.fromCharCode(65 + m) + label;91 i = Math.floor((i - 1) / 26);92 }93 return label;94}9596// … truncated
Files it writes
More from retab-ui
All 130 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| CSV parsercsv | retab-ui | Utilities | Free | no deps · 4 files | |
| Document source modeldocument-source | retab-ui | Utilities | Free | no deps | |
| DOCX Document Resourcedocx-document-resource | retab-ui | Utilities | Free | no deps · 5 files | |
| Effect Keyeffect-key | retab-ui | Utilities | Free | no deps | |
| PDF Document Resourcepdf-document-resource | retab-ui | Utilities | Free | 1 dep · 6 files | |
| Segment Interactionsegment-interaction | retab-ui | Utilities | Free | no deps | |
| Segments modelsegments | retab-ui | Utilities | Free | no deps | |
| Utilsutils | retab-ui | Utilities | Free | 2 deps |
