JSON2Excel is a Rust and WebAssembly-based library that allows converting JSON files into Excel ones at ease.
cargo install wasm-pack
wasm-pack build
// worker.js import { convert } "json2excel-wasm"; const blob = await convert(json_data_to_export);
you can use code like next to force download of the result blob
const a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = "data.xlsx"; document.body.append(a); a.click(); document.body.remove(a);
CDN links are the following:
You can import and use lib dynamically like
const convert = import("https://cdn.dhtmlx.com/libs/json2excel/1.3/module.js"); const blob = await convert(json_data_to_export);
or use it as web worker
// you need to server worker from the same domain as the main script var worker = new Worker("./worker.js"); worker.addEventListener("message", ev => { if (ev.data.type === "ready"){ const blob = ev.data.blob; // do something with result } }); worker.postMessage({ type:"convert", data: raw_json_data });
if you want to load worker script from CDN and not from your domain it requires a more complicated approach, as you need to catch the moment when service inside of the worker will be fully initialized
var url = window.URL.createObjectURL(new Blob([ "importScripts('https://cdn.dhtmlx.com/libs/json2excel/1.3/worker.js');" ], { type: "text/javascript" })); var worker = new Promise((res) => { const x = Worker(url); worker.addEventListener("message", ev => { if (ev.data.type === "ready"){ const json = ev.data.data; // do something with result } else if (ev.data.type === "init"){ // service is ready res(x); } }); }); worker.then(x => x.postMessage({ type:"convert", data: raw_json_data }));
interface IConvertMessageData { uid?: string; data: ISheetData; styles?: IStyles[]; wasmPath?: string; // use cdn by default } interface IReadyMessageData { uid: string; // same as incoming uid blob: Blob; } interface ISheetData { name?: string; cols?: IColumnData[]; rows?: IRowData[]; cells?: IDataCell[][]; // if cells mising, use plain plain?: string[][]; merged?: IMergedCells; } interface IMergedCells { from: IDataPoint; to: IDataPoint; } interface IDataPoint { column: number; row: number; } interface IColumnData { width: number; } interface IRowData { height: number; } interface IDataCell{ v: string; s: number; } interface IStyle { fontSize?: string; align?: string; // left | center | right verticalAlign?: string; // top | center | bottom background?: string; color?: string; fontWeight?: string; // bold fontStyle?: string; // italic textDecoration?: string; // underline format?: string; // border valie format: {size} {style} {color} // size: 0.5px | 1px | 2px (works only with 'solid' style) // style: dashed | dotted | double | thin | solid // color: #000 | #000000 borderTop?: string; borderRight?: string; borderBottom?: string; borderLeft?: string; }
MIT
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4