js-xlsx-gen

Generates XLSX files from JSON definition

Usage no npm install needed!

<script type="module">
  import jsXlsxGen from 'https://cdn.skypack.dev/js-xlsx-gen';
</script>

README

js-xlsx-gen

Simple declarative layer built on top of protobi/js-xlsx which is a fork of SheetJS/js-xlsx that adds styles.

npm version

Installation

npm install js-xlsx-gen

Usage

var xlsGen = require('js-xlsx-gen')({
    defaultDateFormat: 'yyyy-mm-dd' // optional override of default date format of mm/dd/yyyy
});

// define some common styles
// see: https://github.com/protobi/js-xlsx/blob/master/tests/test-style.js for examples of styling AND https://github.com/SheetJS/ssf/blob/master/ssf.js for examples of numFmt
var commonStyles = {
    header: {
        alignment: {horizontal: 'center'},
        font: {bold: true}
    },
    positive: {
        numFmt: '$#,##0.00;$(#,##0.00)',
        font: {color: {rgb: '00ffff'}},
        fill: {fgColor: {rgb: 'ffffff'}}
    }
};
// next define the spreadsheet with each key as the sheet name
var spreadsheet = {
    sheetA: {
        header: {
            styles: {
                row: commonStyles.header,
                columns: {
                    1: {font: {italic: true}}
                }
            },
            columns: [
                {v :'ColA', s: commonStyles.header},
                {v :'ColB', s: commonStyles.header}
            ]
        },
        data: {
            rows: [
                [1, 2],
                [2, 3]
            ]
        }
    },
    sheetB: {
        header: {
            columns: [
                'Column A',
                'Column B',
                'Column C',
                'Column D'
            ]
        },
        data: {
            styles: {
                columns: {
                    2: {numFmt: '$#,##0.00;$(#,##0.00)'},
                    3: {font: {color: {rgb: '00ff00'}}}
                }
            },
            rows: [
                [
                    new Date(),
                    true,
                    {v: new Date(), s: {numFmt: 'mm-dd-yyyy'}},
                    20
                ],
                [
                    {v: -0.02, s: {numFmt: '$#,##0.00;$(#,##0.00)', font: {color: {rgb: 'ffffff'}}, fill: {fgColor: {rgb: 'ff0000'}}}}, // inline styling
                    {v: 3, s: commonStyles.positive}, // inline styling to global styling
                    1.23,
                    40
                ]
            ]
        }
    }
};
// build workbook with OPTIONAL default cell styling
var workbook = xlsGen.generate(spreadsheet, {
    header: {font: { name: "Verdana", sz: 18, color: {rgb: "FF8800"}}, fill: {fgColor: {rgb: "aa00ff"}}},
    data: {font: { name: "Verdana", sz: 11, color: {rgb: "FF0000"}}, fill: {fgColor: {rgb: "ffaa00"}}}
});
// write out XLSX
xlsGen.writeFile(workbook, 'workbook.xlsx');

API


generate ( spreadsheet, defaultStyle )

Generate a workbook from a spreadsheet definition with default cell styles.

Arguments

  • spreadsheet - Spreadsheet definition
  • defaultStyle - OPTIONAL styling for headers and data

Example

var workbook = xlsGen.generate(spreadsheet, {
    header: {font: { name: "Verdana", sz: 18, color: {rgb: "FF8800"}}, fill: {fgColor: {rgb: "aa00ff"}}},
    data: {font: { name: "Verdana", sz: 11, color: {rgb: "FF0000"}}, fill: {fgColor: {rgb: "ffaa00"}}}
});

write ( workbook, wopts )

Write workbook to Binary string. For more details see js-xlsx write()


writeFile ( workbook, filePath )

Write workbook to Binary string. For more details see js-xlsx writeFile()

Spreadsheet Definition

The Spreadsheet Definition contains multiple sheets:

var spreadsheet = {
    sheetA: {
    },
    sheetB: {		
    }
};

Each sheet has an optional header section and a data section:

var spreadsheet = {
    sheetA: {
        header: {
        },
        data: {
        }
    }
};

The optional header section has an optional style section and columns section:

var spreadsheet = {
    sheetA: {
        header: {
            styles: {
            },
            columns: [
            ]
        }
    }
};

The data section has an optional style section and data section:

var spreadsheet = {
    sheetA: {
        data: {
            styles: {
            },
            rows: [
            ]
        }
    }
};

The styles section under the header and data sections contains an optional row section and an optional columns section:

var spreadsheet = {
    sheetA: {
        header: {
            styles: {
                row: {
                    alignment: {horizontal: 'center'},
                    font: {bold: true}
                },
                columns {
                    1: {font: {italic: true}}
                }
            },
            columns: [
            ]
        },
        data: {
            styles: {
                row: {
                    alignment: {horizontal: 'right'},
                    font: {bold: true, italic: true, sz: 14}
                },
                columns {
                    1: {
                        numFmt: '$#,##0.00;$(#,##0.00)',
                        font: {color: {rgb: '00ffff'}},
                        fill: {fgColor: {rgb: 'ffffff'}}
                    }
                }
            },
            rows: [
            ]
        }
    }
};

Unfortunately, these styles aren't documented well, but examples can be found in the style test code of protobi/js-xlsx.

The columns array of the header section contains cell data:

var spreadsheet = {
    sheetA: {
        header: {
            columns: [
                {v :'ColA', s: commonStyles.header},
                'ColB'
            ]
        },
        data: {
        }
    }
};

Notice that the columns array contains either objects that conform to Cell Objects in protobi/js-xlsx OR raw data, i.e. number, date, string, boolean.

The rows array of the data section contains row data:

var spreadsheet = {
    sheetA: {
        data: {
            rows: [
                [
                    new Date(),
                    true,
                    {v: new Date(), s: {numFmt: 'mm-dd-yyyy'}},
                    20
                ],
                [
                    {v: -0.02, s: {numFmt: '$#,##0.00;$(#,##0.00)', font: {color: {rgb: 'ffffff'}}, fill: {fgColor: {rgb: 'ff0000'}}}},
                    {v: 3, s: commonStyles.positive},
                    1.23,
                    40
                ]
            ]
        }
    }
};

Notice that the rows array contains an array for each row which contains either objects that conform to Cell Objects in protobi/js-xlsx OR raw data, i.e. number, date, string, boolean.