Render .xlsx workbooks to a <canvas> or PNG — in the browser, in Node, or
from the CLI. Published as @hewliyang/xlsx-preview.
npm install @hewliyang/xlsx-previewimport { createWorkbookPreviewerFromFile } from "@hewliyang/xlsx-preview/browser";
const file = /* File from an <input type="file"> */;
await createWorkbookPreviewerFromFile(container, file);The browser entry runs the Rust extractor as wasm inside a Web Worker, so the xlsx never leaves the page.
import { ExcelPreviewer } from "@hewliyang/xlsx-preview/react";
<ExcelPreviewer file={file} />;import { renderXlsxToPng } from "@hewliyang/xlsx-preview";
await renderXlsxToPng("model.xlsx", "out.png", { scale: 2 });xlsx-preview model.xlsx --info
xlsx-preview model.xlsx -o cover.png --sheet Cover --range B3:E12 --scale 2
xlsx-preview model.xlsx -o previews/{index}-{sheet}.png --allRunnable HTML demos live under
packages/xlsx-preview/examples/:
xlsx-app.html— full previewer app (file picker, sheet tabs, zoom).xlsx-tiles.html— multi-workbook tiled previews
This repo is a Rust workspace (the extractor + wasm + a xlcore CLI) plus the
TypeScript renderer package.
xlsx
│ ooxmlsdk (xlcore-io)
▼
SpreadsheetDocument (full OOXML tree, charts/CF/etc preserved verbatim)
│ walk sheets/rows/cells, resolve fonts/fills/borders/numFmts;
│ extract drawings + charts; resolve chart range refs
▼ (xlcore-export)
WorkbookLayout JSON ──► @hewliyang/xlsx-preview canvas renderer ──► <canvas> / PNG
Three runtime paths share the same render() core:
- In-browser end-to-end:
createWorkbookPreviewerFromFile()runsxlcore-wasminside a Web Worker and hands the JSON to the canvas renderer in the main thread. No server. - Node / CLI:
renderToPng()/renderXlsxToPng()useskia-canvasagainst the same render pass; thexlsx-previewbin shells out to it. - Static HTML preview:
xlcore preview <file.xlsx>(Rust CLI) extracts server-side and inlines{ layout JSON (gzip+base64), renderer bundle }into one self-contained.html.
The JSON contract is generated from one source via
ts-rs — Rust types in
crates/xlcore-export/src/schema.rs produce the TS in
packages/xlsx-preview/src/schema/. Regenerate after schema changes with
cargo test --release -p xlcore-export export_bindings.
Contributor docs:
docs/plan-excel-rust-lib.md— architecture and roadmap.docs/PARITY.md— feature-by-feature scoreboard against Excel / SpreadJS.docs/TESTING.md— fixture + visual-diff workflow.