Creating Transform stream using ExcelJS for writing xlsx Creating Transform stream using ExcelJS for writing xlsx node.js node.js

Creating Transform stream using ExcelJS for writing xlsx


The output is empty because you're pushing nothing out of your transform stream. You're in object mode so it never goes in this if:

if (buffer.Buffer.isBuffer(chunk)) {  this.push(chunk);}

Here is a working pipeable version (the data is streamed at once at the end):

var stream = require('stream');var util = require('util');var Excel = require('exceljs');var bl = require('bl');var ExcelTransform = function(options) {  stream.Transform.call(this, { objectMode: true });  this.workbook = options.workbook;  // you can make this optional by checking for it and  // creating an empty worksheet if none provided  this.worksheet = options.worksheet;}util.inherits(ExcelTransform, stream.Transform);ExcelTransform.prototype._transform = function(doc, encoding, callback) {  this.worksheet.addRow({ name: doc.name });      callback();};ExcelTransform.prototype._flush = function(callback) {  this.workbook.commit(); // commit only when you're done  var that = this;  // bl drains the stream and create a Buffer object you can then push  this.workbook.stream.pipe(bl(function(err, data) {    that.push(data);    callback();  }));};// it's better to provide the workbook as a parameter to ExcelTransformvar workbook = new Excel.stream.xlsx.WorkbookWriter();var worksheet = workbook.addWorksheet('sheet 1');worksheet.columns = [{  header: 'Name',  key: 'name'}];var rs = new stream.Readable({ objectMode: true });rs.push({ name: 'one' });rs.push({ name: 'two' });rs.push({ name: 'three' });rs.push(null);rs.pipe(new ExcelTransform({  workbook: workbook,  worksheet: worksheet})).pipe(process.stdout);

Another solution, streaming all the time:

var stream = require('stream');var util = require('util');var Excel = require('exceljs');var ExcelTransform = function(options) {  stream.Transform.call(this, {    writableObjectMode: true,    readableObjectMode: false  });  this.workbook = options.workbook;  var that = this;  this.workbook.stream.on('readable', function() {    var chunk = workbook.stream.read();    that.push(chunk);  });  this.worksheet = options.worksheet;}util.inherits(ExcelTransform, stream.Transform);ExcelTransform.prototype._transform = function(doc, encoding, callback) {  this.worksheet.addRow({    name: doc.name  }).commit();  callback();};ExcelTransform.prototype._flush = function(callback) {  this.workbook.commit(); // final commit};// it's better to provide the workbook as a parameter to the ExcelTransformvar workbook = new Excel.stream.xlsx.WorkbookWriter();var worksheet = workbook.addWorksheet('sheet 1');worksheet.columns = [{  header: 'Name',  key: 'name'}];var rs = new stream.Readable({ objectMode: true });rs.push({ name: 'one' });rs.push({ name: 'two' });rs.push({ name: 'three' });rs.push(null);rs.pipe(new ExcelTransform({  workbook: workbook,  worksheet: worksheet})).pipe(process.stdout);


Below code snippet works for me

import { Workbook } from 'exceljs';import { createReadStream } from 'fs';function readExcelFile(){const stream = createReadStream("./test.xlsx");const workbook = new Workbook();const streamWorkBook = await workbook.xlsx.read(stream);const sheet = streamWorkBook.getWorksheet("Sheet1");//Get all the rows data [1st and 2nd column] for (let i = 1; i <= sheet.rowCount; i++) {  console.log(sheet.getRow(i).getCell(1).value);  console.log(sheet.getRow(i).getCell(2).value); }}