Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


JSON2Excel is a Rust and WebAssembly-based library that allows converting JSON files into Excel ones at ease.

npm version

How to build

cargo install wasm-pack
wasm-pack build

How to use via npm

  • install the module
yarn add json2excel-wasm
  • import and use the module
// worker.js
import {convert} "json2excel-wasm";
const blob = 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); = "data.xlsx";

How to use from CDN

CDN links are the following:

You can import and use lib dynamically like

const convert = import("");
const blob = 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 ( === "ready"){
        const blob =;
        // do something with result
    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([
], { type: "text/javascript" }));

var worker = new Promise((res) => {
    const x = Worker(url); 
    worker.addEventListener("message", ev => {
        if ( === "ready"){
            const json =;
            // do something with result
        } else if ( === "init"){
            // service is ready

worker.then(x => x.postMessage({
    data: raw_json_data

Input format

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;