diff --git a/lib/utils.js b/lib/utils.js index 6a22455..b29a359 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -133,7 +133,7 @@ module.exports = { } else if (_.isBoolean(v)) { t = 'b'; v = '' + (v === true ? '1' : '0') + ''; - } else if (v) { + } else if (v !== undefined) { v = '' + escapeXML(v) + ''; t = 'inlineStr'; } diff --git a/package.json b/package.json index 9a79100..c8ae766 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@brandwatch/xlsx-stream", "description": "Creates SpreadsheetML (.xlsx) files in sequence with streaming interface.", - "version": "0.2.0", + "version": "0.2.1", "homepage": "https://github.com/BrandwatchLtd/node-xlsx-stream", "author": { "name": "Ryota Suzuki", diff --git a/test/test.js b/test/test.js index feaacc6..d02a775 100644 --- a/test/test.js +++ b/test/test.js @@ -168,6 +168,32 @@ describe("xlsx-stream", () => { }); }); + describe("empty string", () => { + const filePath = path.join(dirPath, "emptyString.xlsx"); + const expectedRows = [ + ['Place Holder', ''], + ]; + + it("should create an xlsx file and preserve empty string", (done) => { + const x = xlsx_stream(); + const out = fs.createWriteStream(filePath); + x.pipe(out); + expectedRows.forEach((row) => x.write(row)); + x.end(); + out.on("finish", () => { + const workSheetsFromFile = xlsx.parse(filePath); + const rows = workSheetsFromFile[0].data; + + assert.deepStrictEqual( + rows, + expectedRows, + `Rows do not match. Expected ${JSON.stringify(expectedRows)}, but got ${JSON.stringify(rows)}`, + ); + done(); + }); + }); + }); + describe("Large dataset", () => { it("should handle large dataset", (done) => { const randRows = 10000 + _.random(10000);