Skip to content

Latest commit

 

History

History
63 lines (48 loc) · 1.88 KB

README.md

File metadata and controls

63 lines (48 loc) · 1.88 KB

XLSX Stream Writer


This repo is a fork of https://github.com/baranovxyz/xlsx-stream-writer. I moved the code to TypeScript.


This was rewritten from coffee script https://github.com/rubenv/node-xlsx-writer and changed to work both in browser and nodejs. Api is completely different from rubenv implementation.

It is actually capable of streaming rows into xlsx file both in browser and nodejs.

It uses JSZip to compress resulting structure. Lucky for us JSZip is capable of processing readable streams, so we just stream rows into xlxs file (which is a zip file).

Plans:

  • improve api
  • add tests
  • make browser build, put on some cdn
  • optimize shared string stuff
  • (maybe) use web workers to build xlsx in browser
  • (maybe) implement some specifis for nodejs

Example on express server:

import { Request, Response } from 'express';
import { XlsxStreamWriter } from 'xlsx-stream-writer';

function generateFile(req: Request, res: Response) {
  const rows = [['Name', 'Location'], ['Alpha', 'Adams'], ['Bravo', 'Boston'], ['Charlie', 'Chicago']];
  const xlsxWriter = new XlsxStreamWriter();

  xlsxWriter.addRows(rows);

  res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  res.setHeader('Content-Disposition', 'attachment; filename=' + 'example.xlsx');

  xlsxWriter
    .getStream()
    .on('end', function() {
      console.log('zip stream ended.');
    })
    .pipe(res)
    .on('finish', function() {
      // JSZip generates a readable stream with a "end" event,
      // but is piped here in a writable stream which emits a "finish" event.
      console.log('zip finished.');
      res.end();
    });

  for (let i = 0; i < 1; i++) {
    const rowsData = [['Name', 'Location'], ['Alpha', 'Adams'], ['Bravo', 'Boston'], ['Charlie', 'Chicago']];
    console.log('Added new data.');
    xlsxWriter.addRows(rowsData);
  }

  // All data was read 
  xlsxWriter.commit();
}