read-excel-file 2.0.5 → 2.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -53,6 +53,12 @@ function readXlsx(contents, xml) {
53
53
  var styles = parseStyles(contents['xl/styles.xml'], xml);
54
54
  var _properties = parseProperties(contents['xl/workbook.xml'], xml);
55
55
 
56
+ // A hack for `getSheets()` method.
57
+ // https://github.com/catamphetamine/read-excel-file/issues/14
58
+ if (options.getSheets) {
59
+ return _properties.sheets;
60
+ }
61
+
56
62
  // Parse sheet data.
57
63
 
58
64
  var sheetId = typeof options.sheet === 'number' ? options.sheet : getSheetId(_properties.sheets, options.sheet);
@@ -71,7 +77,13 @@ function readXlsx(contents, xml) {
71
77
  // Actually perhaps remove this in some next major version.
72
78
  // So marking this `catch` "Deprecated".
73
79
  console.error(error);
74
- if (options.schema) {
80
+ // A hack for `getSheets()` method.
81
+ // https://github.com/catamphetamine/read-excel-file/issues/14
82
+ if (options.getSheets) {
83
+ return {};
84
+ }
85
+ // Return sheet data.
86
+ if (options.properties) {
75
87
  return {
76
88
  data: [],
77
89
  properties: {}
@@ -80,6 +92,16 @@ function readXlsx(contents, xml) {
80
92
  return [];
81
93
  }
82
94
 
95
+ if (sheet.cells.length === 0) {
96
+ if (options.properties) {
97
+ return {
98
+ data: [],
99
+ properties: properties
100
+ };
101
+ }
102
+ return [];
103
+ }
104
+
83
105
  var _sheet$dimensions = _slicedToArray(sheet.dimensions, 2),
84
106
  leftTop = _sheet$dimensions[0],
85
107
  rightBottom = _sheet$dimensions[1];
@@ -127,7 +149,7 @@ function readXlsx(contents, xml) {
127
149
 
128
150
  // cells = dropEmptyRows(dropEmptyColumns(cells, _ => _.value), options.rowMap, _ => _.value)
129
151
 
130
- if (options.schema) {
152
+ if (options.properties) {
131
153
  return {
132
154
  data: data,
133
155
  properties: properties
@@ -329,9 +351,19 @@ function parseSheet(content, xml, values, styles, properties, options) {
329
351
  return Cell(node, sheet, xml, values, styles, properties, options);
330
352
  });
331
353
 
354
+ if (cells.length === 0) {
355
+ return { cells: cells };
356
+ }
357
+
332
358
  var dimensions = xml.select(sheet, null, '//a:dimension/@ref', namespaces)[0];
359
+
333
360
  if (dimensions) {
334
361
  dimensions = dimensions.textContent.split(':').map(CellCoords);
362
+ // When there's only a single cell on a sheet
363
+ // there can sometimes be just "A1" for the dimensions string.
364
+ if (dimensions.length === 1) {
365
+ dimensions = [dimensions[0], dimensions[0]];
366
+ }
335
367
  } else {
336
368
  dimensions = calculateDimensions(cells);
337
369
  }
@@ -340,6 +372,9 @@ function parseSheet(content, xml, values, styles, properties, options) {
340
372
  }
341
373
 
342
374
  function parseValues(content, xml) {
375
+ if (!content) {
376
+ return [];
377
+ }
343
378
  var strings = xml.createDocument(content);
344
379
  return xml.select(strings, null, '//a:si', namespaces).map(function (string) {
345
380
  return xml.select(strings, string, './/a:t[not(ancestor::a:rPh)]', namespaces).map(function (_) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/readXlsx.js"],"names":["readXlsx","dropEmptyRows","dropEmptyColumns","namespaces","a","letters","contents","xml","options","sheet","properties","criticalError","values","parseValues","styles","parseStyles","parseProperties","sheetId","getSheetId","sheets","createSheetNotFoundError","parseSheet","error","console","schema","data","dimensions","leftTop","rightBottom","cols","column","rows","row","cells","times","push","value","cell","map","rowMap","calculateDimensions","comparator","b","allRows","sort","allCols","minRow","maxRow","length","minCol","maxCol","n","action","i","colToInt","col","trim","split","indexOf","CellCoords","coords","parseInt","Cell","cellNode","getAttribute","select","textContent","undefined","parseFloat","style","numberFormat","id","dateFormat","template","smartDateParser","isDateTemplate","accessor","_","j","empty","splice","content","createDocument","node","strings","string","join","doc","baseStyles","parseCellStyle","numFmts","parseNumberFormatStyle","reduce","formats","format","xf","hasAttribute","xfId","numFmt","numberFormatId","book","workbookProperties","epoch1904","tokens","token","name","Object","keys","String","sheetNames","filter","names","sheetNamesText","Error"],"mappings":"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","file":"readXlsx.js","sourcesContent":["import parseDate from './parseDate'\r\n\r\nconst namespaces = {\r\n a: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'\r\n}\r\n\r\n// Maps \"A1\"-like coordinates to `{ row, column }` numeric coordinates.\r\nconst letters = [\"\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"]\r\n\r\n/**\r\n * Reads an (unzipped) XLSX file structure into a 2D array of cells.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @param {number?} options.sheet - Workbook sheet id (`1` by default).\r\n * @param {string?} options.dateFormat - Date format, e.g. \"MM/DD/YY\". Values having this format template set will be parsed as dates.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @return {object} An object of shape `{ data, cells, properties }`. `data: string[][]` is an array of rows, each row being an array of cell values. `cells: string[][]` is an array of rows, each row being an array of cells. `properties: object` is the spreadsheet properties (e.g. whether date epoch is 1904 instead of 1900).\r\n */\r\nexport default function readXlsx(contents, xml, options = {}) {\r\n // Deprecated 1.0.0 `sheet` argument. Will be removed in some next major release.\r\n if (typeof options === 'string' || typeof options === 'number') {\r\n options = { sheet: options }\r\n } else if (!options.sheet) {\r\n options = { ...options, sheet: 1 }\r\n }\r\n\r\n let sheet\r\n let properties\r\n\r\n // Error which will not be skipped.\r\n let criticalError\r\n\r\n try {\r\n const values = parseValues(contents[`xl/sharedStrings.xml`], xml)\r\n const styles = parseStyles(contents[`xl/styles.xml`], xml)\r\n const properties = parseProperties(contents[`xl/workbook.xml`], xml)\r\n\r\n // Parse sheet data.\r\n\r\n const sheetId = typeof options.sheet === 'number' ? options.sheet : getSheetId(properties.sheets, options.sheet)\r\n\r\n if (!sheetId || !contents[`xl/worksheets/sheet${sheetId}.xml`]) {\r\n criticalError = createSheetNotFoundError(options.sheet, properties.sheets)\r\n throw criticalError\r\n }\r\n\r\n sheet = parseSheet(contents[`xl/worksheets/sheet${sheetId}.xml`], xml, values, styles, properties, options)\r\n }\r\n catch (error) {\r\n if (error === criticalError) {\r\n throw error\r\n }\r\n // Guards against malformed XLSX files.\r\n // Actually perhaps remove this in some next major version.\r\n // So marking this `catch` \"Deprecated\".\r\n console.error(error)\r\n if (options.schema) {\r\n return {\r\n data: [],\r\n properties: {}\r\n }\r\n }\r\n return []\r\n }\r\n\r\n const [ leftTop, rightBottom ] = sheet.dimensions\r\n\r\n const cols = (rightBottom.column - leftTop.column) + 1\r\n const rows = (rightBottom.row - leftTop.row) + 1\r\n\r\n let cells = []\r\n\r\n times(rows, () => {\r\n const row = []\r\n times(cols, () => row.push({ value: null }))\r\n cells.push(row)\r\n })\r\n\r\n for (const cell of sheet.cells) {\r\n const row = cell.row - leftTop.row\r\n const column = cell.column - leftTop.column\r\n if (cells[row]) {\r\n cells[row][column] = cell\r\n }\r\n }\r\n\r\n let data = cells.map(row => row.map(cell => cell.value))\r\n data = dropEmptyRows(dropEmptyColumns(data), options.rowMap)\r\n\r\n // cells = dropEmptyRows(dropEmptyColumns(cells, _ => _.value), options.rowMap, _ => _.value)\r\n\r\n if (options.schema) {\r\n return {\r\n data,\r\n properties\r\n }\r\n }\r\n\r\n return data\r\n}\r\n\r\nfunction calculateDimensions (cells) {\r\n const comparator = (a, b) => a - b\r\n const allRows = cells.map(cell => cell.row).sort(comparator)\r\n const allCols = cells.map(cell => cell.column).sort(comparator)\r\n const minRow = allRows[0]\r\n const maxRow = allRows[allRows.length - 1]\r\n const minCol = allCols[0]\r\n const maxCol = allCols[allCols.length - 1]\r\n\r\n return [\r\n { row: minRow, column: minCol },\r\n { row: maxRow, column: maxCol }\r\n ]\r\n}\r\n\r\nfunction times(n, action) {\r\n let i = 0\r\n while (i < n) {\r\n action()\r\n i++\r\n }\r\n}\r\n\r\nfunction colToInt(col) {\r\n col = col.trim().split('')\r\n\r\n let n = 0;\r\n\r\n for (let i = 0; i < col.length; i++) {\r\n n *= 26\r\n n += letters.indexOf(col[i])\r\n }\r\n\r\n return n\r\n}\r\n\r\nfunction CellCoords(coords) {\r\n coords = coords.split(/(\\d+)/)\r\n return {\r\n row : parseInt(coords[1]),\r\n column : colToInt(coords[0])\r\n }\r\n}\r\n\r\nfunction Cell(cellNode, sheet, xml, values, styles, properties, options) {\r\n const coords = CellCoords(cellNode.getAttribute('r'))\r\n\r\n let value = xml.select(sheet, cellNode, 'a:v', namespaces)[0]\r\n // For `xpath` `value` can be `undefined` while for native `DOMParser` it's `null`.\r\n value = value && value.textContent\r\n\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n switch (cellNode.getAttribute('t')) {\r\n case 's':\r\n value = values[parseInt(value)].trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n case 'b':\r\n value = value === '1' ? true : false\r\n break\r\n\r\n case 'n':\r\n // Default type is \"n\".\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n default:\r\n if (value === undefined) {\r\n break\r\n }\r\n value = parseFloat(value)\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n const style = styles[parseInt(cellNode.getAttribute('s') || 0)]\r\n if ((style.numberFormat.id >= 14 && style.numberFormat.id <= 22) ||\r\n (style.numberFormat.id >= 45 && style.numberFormat.id <= 47) ||\r\n (options.dateFormat && style.numberFormat.template === options.dateFormat) ||\r\n (options.smartDateParser !== false && style.numberFormat.template && isDateTemplate(style.numberFormat.template))) {\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return {\r\n row : coords.row,\r\n column : coords.column,\r\n value\r\n }\r\n}\r\n\r\nexport function dropEmptyRows(data, rowMap, accessor = _ => _) {\r\n // Fill in row map.\r\n if (rowMap) {\r\n let j = 0\r\n while (j < data.length) {\r\n rowMap[j] = j\r\n j++\r\n }\r\n }\r\n // Drop empty rows.\r\n let i = data.length - 1\r\n while (i >= 0) {\r\n // Check if the row is empty.\r\n let empty = true\r\n for (const cell of data[i]) {\r\n if (accessor(cell) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n // Remove the empty row.\r\n if (empty) {\r\n data.splice(i, 1)\r\n if (rowMap) {\r\n rowMap.splice(i, 1)\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nexport function dropEmptyColumns(data, accessor = _ => _) {\r\n let i = data[0].length - 1\r\n while (i >= 0) {\r\n let empty = true\r\n for (const row of data) {\r\n if (accessor(row[i]) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n if (empty) {\r\n let j = 0;\r\n while (j < data.length) {\r\n data[j].splice(i, 1)\r\n j++\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nfunction parseSheet(content, xml, values, styles, properties, options) {\r\n const sheet = xml.createDocument(content)\r\n\r\n const cells = xml.select(sheet, null, '/a:worksheet/a:sheetData/a:row/a:c', namespaces).map(node => Cell(node, sheet, xml, values, styles, properties, options))\r\n\r\n let dimensions = xml.select(sheet, null, '//a:dimension/@ref', namespaces)[0]\r\n if (dimensions) {\r\n dimensions = dimensions.textContent.split(':').map(CellCoords)\r\n } else {\r\n dimensions = calculateDimensions(cells)\r\n }\r\n\r\n return { cells, dimensions }\r\n}\r\n\r\nfunction parseValues(content, xml) {\r\n const strings = xml.createDocument(content)\r\n return xml.select(strings, null, '//a:si', namespaces)\r\n .map(string => xml.select(strings, string, './/a:t[not(ancestor::a:rPh)]', namespaces).map(_ => _.textContent).join(''))\r\n}\r\n\r\n// http://officeopenxml.com/SSstyles.php\r\nfunction parseStyles(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n // https://social.msdn.microsoft.com/Forums/sqlserver/en-US/708978af-b598-45c4-a598-d3518a5a09f0/howwhen-is-cellstylexfs-vs-cellxfs-applied-to-a-cell?forum=os_binaryfile\r\n // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/\r\n const doc = xml.createDocument(content)\r\n const baseStyles = xml.select(doc, null, '//a:styleSheet/a:cellStyleXfs/a:xf', namespaces).map(parseCellStyle);\r\n const numFmts = xml.select(doc, null, '//a:styleSheet/a:numFmts/a:numFmt', namespaces)\r\n .map(parseNumberFormatStyle)\r\n .reduce((formats, format) => {\r\n formats[format.id] = format\r\n return formats\r\n }, [])\r\n\r\n return xml.select(doc, null, '//a:styleSheet/a:cellXfs/a:xf', namespaces).map((xf) => {\r\n if (xf.hasAttribute('xfId')) {\r\n return {\r\n ...baseStyles[xf.xfId],\r\n ...parseCellStyle(xf, numFmts)\r\n }\r\n }\r\n return parseCellStyle(xf, numFmts)\r\n })\r\n}\r\n\r\nfunction parseNumberFormatStyle(numFmt) {\r\n return {\r\n id: numFmt.getAttribute('numFmtId'),\r\n template: numFmt.getAttribute('formatCode')\r\n }\r\n}\r\n\r\n// http://www.datypic.com/sc/ooxml/e-ssml_xf-2.html\r\nfunction parseCellStyle(xf, numFmts) {\r\n const style = {}\r\n if (xf.hasAttribute('numFmtId')) {\r\n const numberFormatId = xf.getAttribute('numFmtId')\r\n if (numFmts[numberFormatId]) {\r\n style.numberFormat = numFmts[numberFormatId]\r\n } else {\r\n style.numberFormat = { id: numberFormatId }\r\n }\r\n }\r\n return style\r\n}\r\n\r\nfunction parseProperties(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n const book = xml.createDocument(content)\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html\r\n const workbookProperties = xml.select(book, null, '//a:workbookPr', namespaces)[0]\r\n if (!workbookProperties) {\r\n return {}\r\n }\r\n const properties = {};\r\n // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel\r\n if (workbookProperties.getAttribute('date1904') === '1') {\r\n properties.epoch1904 = true\r\n }\r\n // Get sheet names (just because they're available).\r\n for (const sheet of xml.select(book, null, '//a:sheets/a:sheet', namespaces)) {\r\n if (sheet.getAttribute('name')) {\r\n properties.sheets = properties.sheets || {}\r\n properties.sheets[sheet.getAttribute('sheetId')] = sheet.getAttribute('name')\r\n }\r\n }\r\n return properties;\r\n}\r\n\r\nfunction isDateTemplate(template) {\r\n const tokens = template.split(/\\W+/)\r\n for (const token of tokens) {\r\n if (['MM', 'DD', 'YY', 'YYYY'].indexOf(token) < 0) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction getSheetId(sheets, name) {\r\n if (!sheets) {\r\n return\r\n }\r\n for (const sheetId of Object.keys(sheets)) {\r\n if (sheets[sheetId] === name) {\r\n return sheetId\r\n }\r\n }\r\n // Deprecated.\r\n // Legacy support for `sheet: '1'`, etc.\r\n const id = parseInt(name, 10)\r\n if (String(id) === name) {\r\n return id\r\n }\r\n}\r\n\r\nfunction createSheetNotFoundError(sheet, sheets) {\r\n let sheetNames = {}\r\n if (sheets) {\r\n sheetNames = Object.keys(sheets)\r\n .filter(id => sheets[id])\r\n .reduce((names, id) => {\r\n names[id] = sheets[id]\r\n return names\r\n }, {})\r\n }\r\n const sheetNamesText = Object.keys(sheetNames).map(id => `\"${sheetNames[id]}\" (#${id})`).join(', ')\r\n return new Error(`Sheet ${typeof sheet === 'number' ? '#' + sheet : '\"' + sheet + '\"'} not found in *.xlsx file.${sheetNamesText ? ' Available sheets: ' + sheetNamesText + '.' : ''}`)\r\n}"]}
1
+ {"version":3,"sources":["../source/readXlsx.js"],"names":["readXlsx","dropEmptyRows","dropEmptyColumns","namespaces","a","letters","contents","xml","options","sheet","properties","criticalError","values","parseValues","styles","parseStyles","parseProperties","getSheets","sheets","sheetId","getSheetId","createSheetNotFoundError","parseSheet","error","console","data","cells","length","dimensions","leftTop","rightBottom","cols","column","rows","row","times","push","value","cell","map","rowMap","calculateDimensions","comparator","b","allRows","sort","allCols","minRow","maxRow","minCol","maxCol","n","action","i","colToInt","col","trim","split","indexOf","CellCoords","coords","parseInt","Cell","cellNode","getAttribute","select","textContent","undefined","parseFloat","style","numberFormat","id","dateFormat","template","smartDateParser","isDateTemplate","accessor","_","j","empty","splice","content","createDocument","node","strings","string","join","doc","baseStyles","parseCellStyle","numFmts","parseNumberFormatStyle","reduce","formats","format","xf","hasAttribute","xfId","numFmt","numberFormatId","book","workbookProperties","epoch1904","tokens","token","name","Object","keys","String","sheetNames","filter","names","sheetNamesText","Error"],"mappings":"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","file":"readXlsx.js","sourcesContent":["import parseDate from './parseDate'\r\n\r\nconst namespaces = {\r\n a: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'\r\n}\r\n\r\n// Maps \"A1\"-like coordinates to `{ row, column }` numeric coordinates.\r\nconst letters = [\"\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"]\r\n\r\n/**\r\n * Reads an (unzipped) XLSX file structure into a 2D array of cells.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @param {number?} options.sheet - Workbook sheet id (`1` by default).\r\n * @param {string?} options.dateFormat - Date format, e.g. \"MM/DD/YY\". Values having this format template set will be parsed as dates.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @return {object} An object of shape `{ data, cells, properties }`. `data: string[][]` is an array of rows, each row being an array of cell values. `cells: string[][]` is an array of rows, each row being an array of cells. `properties: object` is the spreadsheet properties (e.g. whether date epoch is 1904 instead of 1900).\r\n */\r\nexport default function readXlsx(contents, xml, options = {}) {\r\n // Deprecated 1.0.0 `sheet` argument. Will be removed in some next major release.\r\n if (typeof options === 'string' || typeof options === 'number') {\r\n options = { sheet: options }\r\n } else if (!options.sheet) {\r\n options = { ...options, sheet: 1 }\r\n }\r\n\r\n let sheet\r\n let properties\r\n\r\n // Error which will not be skipped.\r\n let criticalError\r\n\r\n try {\r\n const values = parseValues(contents[`xl/sharedStrings.xml`], xml)\r\n const styles = parseStyles(contents[`xl/styles.xml`], xml)\r\n const properties = parseProperties(contents[`xl/workbook.xml`], xml)\r\n\r\n // A hack for `getSheets()` method.\r\n // https://github.com/catamphetamine/read-excel-file/issues/14\r\n if (options.getSheets) {\r\n return properties.sheets\r\n }\r\n\r\n // Parse sheet data.\r\n\r\n const sheetId = typeof options.sheet === 'number' ? options.sheet : getSheetId(properties.sheets, options.sheet)\r\n\r\n if (!sheetId || !contents[`xl/worksheets/sheet${sheetId}.xml`]) {\r\n criticalError = createSheetNotFoundError(options.sheet, properties.sheets)\r\n throw criticalError\r\n }\r\n\r\n sheet = parseSheet(contents[`xl/worksheets/sheet${sheetId}.xml`], xml, values, styles, properties, options)\r\n }\r\n catch (error) {\r\n if (error === criticalError) {\r\n throw error\r\n }\r\n // Guards against malformed XLSX files.\r\n // Actually perhaps remove this in some next major version.\r\n // So marking this `catch` \"Deprecated\".\r\n console.error(error)\r\n // A hack for `getSheets()` method.\r\n // https://github.com/catamphetamine/read-excel-file/issues/14\r\n if (options.getSheets) {\r\n return {}\r\n }\r\n // Return sheet data.\r\n if (options.properties) {\r\n return {\r\n data: [],\r\n properties: {}\r\n }\r\n }\r\n return []\r\n }\r\n\r\n if (sheet.cells.length === 0) {\r\n if (options.properties) {\r\n return {\r\n data: [],\r\n properties\r\n }\r\n }\r\n return []\r\n }\r\n\r\n const [ leftTop, rightBottom ] = sheet.dimensions\r\n\r\n const cols = (rightBottom.column - leftTop.column) + 1\r\n const rows = (rightBottom.row - leftTop.row) + 1\r\n\r\n let cells = []\r\n\r\n times(rows, () => {\r\n const row = []\r\n times(cols, () => row.push({ value: null }))\r\n cells.push(row)\r\n })\r\n\r\n for (const cell of sheet.cells) {\r\n const row = cell.row - leftTop.row\r\n const column = cell.column - leftTop.column\r\n if (cells[row]) {\r\n cells[row][column] = cell\r\n }\r\n }\r\n\r\n let data = cells.map(row => row.map(cell => cell.value))\r\n data = dropEmptyRows(dropEmptyColumns(data), options.rowMap)\r\n\r\n // cells = dropEmptyRows(dropEmptyColumns(cells, _ => _.value), options.rowMap, _ => _.value)\r\n\r\n if (options.properties) {\r\n return {\r\n data,\r\n properties\r\n }\r\n }\r\n\r\n return data\r\n}\r\n\r\nfunction calculateDimensions (cells) {\r\n const comparator = (a, b) => a - b\r\n const allRows = cells.map(cell => cell.row).sort(comparator)\r\n const allCols = cells.map(cell => cell.column).sort(comparator)\r\n const minRow = allRows[0]\r\n const maxRow = allRows[allRows.length - 1]\r\n const minCol = allCols[0]\r\n const maxCol = allCols[allCols.length - 1]\r\n\r\n return [\r\n { row: minRow, column: minCol },\r\n { row: maxRow, column: maxCol }\r\n ]\r\n}\r\n\r\nfunction times(n, action) {\r\n let i = 0\r\n while (i < n) {\r\n action()\r\n i++\r\n }\r\n}\r\n\r\nfunction colToInt(col) {\r\n col = col.trim().split('')\r\n\r\n let n = 0;\r\n\r\n for (let i = 0; i < col.length; i++) {\r\n n *= 26\r\n n += letters.indexOf(col[i])\r\n }\r\n\r\n return n\r\n}\r\n\r\nfunction CellCoords(coords) {\r\n coords = coords.split(/(\\d+)/)\r\n return {\r\n row : parseInt(coords[1]),\r\n column : colToInt(coords[0])\r\n }\r\n}\r\n\r\nfunction Cell(cellNode, sheet, xml, values, styles, properties, options) {\r\n const coords = CellCoords(cellNode.getAttribute('r'))\r\n\r\n let value = xml.select(sheet, cellNode, 'a:v', namespaces)[0]\r\n // For `xpath` `value` can be `undefined` while for native `DOMParser` it's `null`.\r\n value = value && value.textContent\r\n\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n switch (cellNode.getAttribute('t')) {\r\n case 's':\r\n value = values[parseInt(value)].trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n case 'b':\r\n value = value === '1' ? true : false\r\n break\r\n\r\n case 'n':\r\n // Default type is \"n\".\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n default:\r\n if (value === undefined) {\r\n break\r\n }\r\n value = parseFloat(value)\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n const style = styles[parseInt(cellNode.getAttribute('s') || 0)]\r\n if ((style.numberFormat.id >= 14 && style.numberFormat.id <= 22) ||\r\n (style.numberFormat.id >= 45 && style.numberFormat.id <= 47) ||\r\n (options.dateFormat && style.numberFormat.template === options.dateFormat) ||\r\n (options.smartDateParser !== false && style.numberFormat.template && isDateTemplate(style.numberFormat.template))) {\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return {\r\n row : coords.row,\r\n column : coords.column,\r\n value\r\n }\r\n}\r\n\r\nexport function dropEmptyRows(data, rowMap, accessor = _ => _) {\r\n // Fill in row map.\r\n if (rowMap) {\r\n let j = 0\r\n while (j < data.length) {\r\n rowMap[j] = j\r\n j++\r\n }\r\n }\r\n // Drop empty rows.\r\n let i = data.length - 1\r\n while (i >= 0) {\r\n // Check if the row is empty.\r\n let empty = true\r\n for (const cell of data[i]) {\r\n if (accessor(cell) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n // Remove the empty row.\r\n if (empty) {\r\n data.splice(i, 1)\r\n if (rowMap) {\r\n rowMap.splice(i, 1)\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nexport function dropEmptyColumns(data, accessor = _ => _) {\r\n let i = data[0].length - 1\r\n while (i >= 0) {\r\n let empty = true\r\n for (const row of data) {\r\n if (accessor(row[i]) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n if (empty) {\r\n let j = 0;\r\n while (j < data.length) {\r\n data[j].splice(i, 1)\r\n j++\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nfunction parseSheet(content, xml, values, styles, properties, options) {\r\n const sheet = xml.createDocument(content)\r\n\r\n const cells = xml.select(sheet, null, '/a:worksheet/a:sheetData/a:row/a:c', namespaces).map(node => Cell(node, sheet, xml, values, styles, properties, options))\r\n\r\n if (cells.length === 0) {\r\n return { cells }\r\n }\r\n\r\n let dimensions = xml.select(sheet, null, '//a:dimension/@ref', namespaces)[0]\r\n\r\n if (dimensions) {\r\n dimensions = dimensions.textContent.split(':').map(CellCoords)\r\n // When there's only a single cell on a sheet\r\n // there can sometimes be just \"A1\" for the dimensions string.\r\n if (dimensions.length === 1) {\r\n dimensions = [dimensions[0], dimensions[0]]\r\n }\r\n } else {\r\n dimensions = calculateDimensions(cells)\r\n }\r\n\r\n return { cells, dimensions }\r\n}\r\n\r\nfunction parseValues(content, xml) {\r\n if (!content) {\r\n return []\r\n }\r\n const strings = xml.createDocument(content)\r\n return xml.select(strings, null, '//a:si', namespaces)\r\n .map(string => xml.select(strings, string, './/a:t[not(ancestor::a:rPh)]', namespaces).map(_ => _.textContent).join(''))\r\n}\r\n\r\n// http://officeopenxml.com/SSstyles.php\r\nfunction parseStyles(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n // https://social.msdn.microsoft.com/Forums/sqlserver/en-US/708978af-b598-45c4-a598-d3518a5a09f0/howwhen-is-cellstylexfs-vs-cellxfs-applied-to-a-cell?forum=os_binaryfile\r\n // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/\r\n const doc = xml.createDocument(content)\r\n const baseStyles = xml.select(doc, null, '//a:styleSheet/a:cellStyleXfs/a:xf', namespaces).map(parseCellStyle);\r\n const numFmts = xml.select(doc, null, '//a:styleSheet/a:numFmts/a:numFmt', namespaces)\r\n .map(parseNumberFormatStyle)\r\n .reduce((formats, format) => {\r\n formats[format.id] = format\r\n return formats\r\n }, [])\r\n\r\n return xml.select(doc, null, '//a:styleSheet/a:cellXfs/a:xf', namespaces).map((xf) => {\r\n if (xf.hasAttribute('xfId')) {\r\n return {\r\n ...baseStyles[xf.xfId],\r\n ...parseCellStyle(xf, numFmts)\r\n }\r\n }\r\n return parseCellStyle(xf, numFmts)\r\n })\r\n}\r\n\r\nfunction parseNumberFormatStyle(numFmt) {\r\n return {\r\n id: numFmt.getAttribute('numFmtId'),\r\n template: numFmt.getAttribute('formatCode')\r\n }\r\n}\r\n\r\n// http://www.datypic.com/sc/ooxml/e-ssml_xf-2.html\r\nfunction parseCellStyle(xf, numFmts) {\r\n const style = {}\r\n if (xf.hasAttribute('numFmtId')) {\r\n const numberFormatId = xf.getAttribute('numFmtId')\r\n if (numFmts[numberFormatId]) {\r\n style.numberFormat = numFmts[numberFormatId]\r\n } else {\r\n style.numberFormat = { id: numberFormatId }\r\n }\r\n }\r\n return style\r\n}\r\n\r\nfunction parseProperties(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n const book = xml.createDocument(content)\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html\r\n const workbookProperties = xml.select(book, null, '//a:workbookPr', namespaces)[0]\r\n if (!workbookProperties) {\r\n return {}\r\n }\r\n const properties = {};\r\n // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel\r\n if (workbookProperties.getAttribute('date1904') === '1') {\r\n properties.epoch1904 = true\r\n }\r\n // Get sheet names (just because they're available).\r\n for (const sheet of xml.select(book, null, '//a:sheets/a:sheet', namespaces)) {\r\n if (sheet.getAttribute('name')) {\r\n properties.sheets = properties.sheets || {}\r\n properties.sheets[sheet.getAttribute('sheetId')] = sheet.getAttribute('name')\r\n }\r\n }\r\n return properties;\r\n}\r\n\r\nfunction isDateTemplate(template) {\r\n const tokens = template.split(/\\W+/)\r\n for (const token of tokens) {\r\n if (['MM', 'DD', 'YY', 'YYYY'].indexOf(token) < 0) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction getSheetId(sheets, name) {\r\n if (!sheets) {\r\n return\r\n }\r\n for (const sheetId of Object.keys(sheets)) {\r\n if (sheets[sheetId] === name) {\r\n return sheetId\r\n }\r\n }\r\n // Deprecated.\r\n // Legacy support for `sheet: '1'`, etc.\r\n const id = parseInt(name, 10)\r\n if (String(id) === name) {\r\n return id\r\n }\r\n}\r\n\r\nfunction createSheetNotFoundError(sheet, sheets) {\r\n let sheetNames = {}\r\n if (sheets) {\r\n sheetNames = Object.keys(sheets)\r\n .filter(id => sheets[id])\r\n .reduce((names, id) => {\r\n names[id] = sheets[id]\r\n return names\r\n }, {})\r\n }\r\n const sheetNamesText = Object.keys(sheetNames).map(id => `\"${sheetNames[id]}\" (#${id})`).join(', ')\r\n return new Error(`Sheet ${typeof sheet === 'number' ? '#' + sheet : '\"' + sheet + '\"'} not found in *.xlsx file.${sheetNamesText ? ' Available sheets: ' + sheetNamesText + '.' : ''}`)\r\n}"]}
@@ -19,7 +19,7 @@ var _convertToJson2 = _interopRequireDefault(_convertToJson);
19
19
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
20
 
21
21
  function readXlsxFileContents(entries, xml, options) {
22
- var result = (0, _readXlsx2.default)(entries, xml, options);
22
+ var result = (0, _readXlsx2.default)(entries, xml, _extends({}, options, { properties: options.schema || options.properties }));
23
23
  if (options.schema) {
24
24
  return (0, _convertToJson2.default)(result.data, options.schema, _extends({}, options, { properties: result.properties }));
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/readXlsxFileContents.js"],"names":["readXlsxFileContents","entries","xml","options","result","schema","data","properties"],"mappings":";;;;;;;;kBAGwBA,oB;;AAHxB;;;;AACA;;;;;;AAEe,SAASA,oBAAT,CAA8BC,OAA9B,EAAuCC,GAAvC,EAA4CC,OAA5C,EAAqD;AACnE,KAAMC,SAAS,wBAASH,OAAT,EAAkBC,GAAlB,EAAuBC,OAAvB,CAAf;AACA,KAAIA,QAAQE,MAAZ,EAAoB;AACnB,SAAO,6BAAcD,OAAOE,IAArB,EAA2BH,QAAQE,MAAnC,eAAgDF,OAAhD,IAAyDI,YAAYH,OAAOG,UAA5E,IAAP;AACA;AACD,QAAOH,MAAP;AACA","file":"readXlsxFileContents.js","sourcesContent":["import readXlsx from './readXlsx'\r\nimport convertToJson from './convertToJson'\r\n\r\nexport default function readXlsxFileContents(entries, xml, options) {\r\n\tconst result = readXlsx(entries, xml, options)\r\n\tif (options.schema) {\r\n\t\treturn convertToJson(result.data, options.schema, { ...options, properties: result.properties })\r\n\t}\r\n\treturn result\r\n}"]}
1
+ {"version":3,"sources":["../source/readXlsxFileContents.js"],"names":["readXlsxFileContents","entries","xml","options","result","properties","schema","data"],"mappings":";;;;;;;;kBAGwBA,oB;;AAHxB;;;;AACA;;;;;;AAEe,SAASA,oBAAT,CAA8BC,OAA9B,EAAuCC,GAAvC,EAA4CC,OAA5C,EAAqD;AACnE,KAAMC,SAAS,wBAASH,OAAT,EAAkBC,GAAlB,eAA4BC,OAA5B,IAAqCE,YAAYF,QAAQG,MAAR,IAAkBH,QAAQE,UAA3E,IAAf;AACA,KAAIF,QAAQG,MAAZ,EAAoB;AACnB,SAAO,6BAAcF,OAAOG,IAArB,EAA2BJ,QAAQG,MAAnC,eAAgDH,OAAhD,IAAyDE,YAAYD,OAAOC,UAA5E,IAAP;AACA;AACD,QAAOD,MAAP;AACA","file":"readXlsxFileContents.js","sourcesContent":["import readXlsx from './readXlsx'\r\nimport convertToJson from './convertToJson'\r\n\r\nexport default function readXlsxFileContents(entries, xml, options) {\r\n\tconst result = readXlsx(entries, xml, { ...options, properties: options.schema || options.properties })\r\n\tif (options.schema) {\r\n\t\treturn convertToJson(result.data, options.schema, { ...options, properties: result.properties })\r\n\t}\r\n\treturn result\r\n}"]}
@@ -7,7 +7,9 @@ Object.defineProperty(exports, "__esModule", {
7
7
  // https://github.com/goto100/xpath/issues/85
8
8
  exports.default = {
9
9
  createDocument: function createDocument(content) {
10
- return new DOMParser().parseFromString(content, 'text/xml');
10
+ // A weird bug: it won't parse XML unless it's trimmed.
11
+ // https://github.com/catamphetamine/read-excel-file/issues/21
12
+ return new DOMParser().parseFromString(content.trim(), 'text/xml');
11
13
  },
12
14
  select: function select(doc, node, path) {
13
15
  var namespaces = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/xmlBrowser.js"],"names":["createDocument","content","DOMParser","parseFromString","select","doc","node","path","namespaces","nodes","evaluate","prefix","XPathResult","ANY_TYPE","results","result","iterateNext","push"],"mappings":";;;;;AAAA;AACA;kBACe;AACdA,eADc,0BACCC,OADD,EACU;AACvB,SAAO,IAAIC,SAAJ,GAAgBC,eAAhB,CAAgCF,OAAhC,EAAyC,UAAzC,CAAP;AACA,EAHa;AAKdG,OALc,kBAKPC,GALO,EAKFC,IALE,EAKIC,IALJ,EAK2B;AAAA,MAAjBC,UAAiB,uEAAJ,EAAI;;AACxC,MAAMC,QAAQJ,IAAIK,QAAJ,CACbH,IADa,EAEbD,QAAQD,GAFK,EAGb;AAAA,UAAUG,WAAWG,MAAX,CAAV;AAAA,GAHa,EAIbC,YAAYC,QAJC,EAKb,IALa,CAAd;AAOA;AACA,MAAMC,UAAU,EAAhB;AACA,MAAIC,SAASN,MAAMO,WAAN,EAAb;AACA,SAAOD,MAAP,EAAe;AACdD,WAAQG,IAAR,CAAaF,MAAb;AACAA,YAASN,MAAMO,WAAN,EAAT;AACA;AACD,SAAOF,OAAP;AACA;AArBa,C","file":"xmlBrowser.js","sourcesContent":["// Using native `DOMParser` because `xpath` + `xmldom` doesn't work.\r\n// https://github.com/goto100/xpath/issues/85\r\nexport default {\r\n\tcreateDocument(content) {\r\n\t\treturn new DOMParser().parseFromString(content, 'text/xml')\r\n\t},\r\n\r\n\tselect(doc, node, path, namespaces = {}) {\r\n\t\tconst nodes = doc.evaluate(\r\n\t\t\tpath,\r\n\t\t\tnode || doc,\r\n\t\t\tprefix => namespaces[prefix],\r\n\t\t\tXPathResult.ANY_TYPE,\r\n\t\t\tnull\r\n\t\t)\r\n\t\t// Convert iterator to an array.\r\n\t\tconst results = []\r\n\t\tlet result = nodes.iterateNext()\r\n\t\twhile (result) {\r\n\t\t\tresults.push(result)\r\n\t\t\tresult = nodes.iterateNext()\r\n\t\t}\r\n\t\treturn results\r\n\t}\r\n}"]}
1
+ {"version":3,"sources":["../source/xmlBrowser.js"],"names":["createDocument","content","DOMParser","parseFromString","trim","select","doc","node","path","namespaces","nodes","evaluate","prefix","XPathResult","ANY_TYPE","results","result","iterateNext","push"],"mappings":";;;;;AAAA;AACA;kBACe;AACdA,eADc,0BACCC,OADD,EACU;AACvB;AACA;AACA,SAAO,IAAIC,SAAJ,GAAgBC,eAAhB,CAAgCF,QAAQG,IAAR,EAAhC,EAAgD,UAAhD,CAAP;AACA,EALa;AAOdC,OAPc,kBAOPC,GAPO,EAOFC,IAPE,EAOIC,IAPJ,EAO2B;AAAA,MAAjBC,UAAiB,uEAAJ,EAAI;;AACxC,MAAMC,QAAQJ,IAAIK,QAAJ,CACbH,IADa,EAEbD,QAAQD,GAFK,EAGb;AAAA,UAAUG,WAAWG,MAAX,CAAV;AAAA,GAHa,EAIbC,YAAYC,QAJC,EAKb,IALa,CAAd;AAOA;AACA,MAAMC,UAAU,EAAhB;AACA,MAAIC,SAASN,MAAMO,WAAN,EAAb;AACA,SAAOD,MAAP,EAAe;AACdD,WAAQG,IAAR,CAAaF,MAAb;AACAA,YAASN,MAAMO,WAAN,EAAT;AACA;AACD,SAAOF,OAAP;AACA;AAvBa,C","file":"xmlBrowser.js","sourcesContent":["// Using native `DOMParser` because `xpath` + `xmldom` doesn't work.\r\n// https://github.com/goto100/xpath/issues/85\r\nexport default {\r\n\tcreateDocument(content) {\r\n\t\t// A weird bug: it won't parse XML unless it's trimmed.\r\n\t\t// https://github.com/catamphetamine/read-excel-file/issues/21\r\n\t\treturn new DOMParser().parseFromString(content.trim(), 'text/xml')\r\n\t},\r\n\r\n\tselect(doc, node, path, namespaces = {}) {\r\n\t\tconst nodes = doc.evaluate(\r\n\t\t\tpath,\r\n\t\t\tnode || doc,\r\n\t\t\tprefix => namespaces[prefix],\r\n\t\t\tXPathResult.ANY_TYPE,\r\n\t\t\tnull\r\n\t\t)\r\n\t\t// Convert iterator to an array.\r\n\t\tconst results = []\r\n\t\tlet result = nodes.iterateNext()\r\n\t\twhile (result) {\r\n\t\t\tresults.push(result)\r\n\t\t\tresult = nodes.iterateNext()\r\n\t\t}\r\n\t\treturn results\r\n\t}\r\n}"]}
package/index.commonjs.js CHANGED
@@ -1,4 +1,5 @@
1
1
  exports = module.exports = require('./commonjs/readXlsxFileBrowser').default
2
+ exports.convertToJson = require('./commonjs/convertToJson').default
2
3
  exports.Integer = require('./commonjs/types/Integer').default
3
4
  exports.Email = require('./commonjs/types/Email').default
4
5
  exports.URL = require('./commonjs/types/URL').default
package/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { default as default } from './modules/readXlsxFileBrowser'
2
+ export { default as convertToJson } from './modules/convertToJson'
2
3
  export { default as Integer } from './modules/types/Integer'
3
4
  export { default as Email } from './modules/types/Email'
4
5
  export { default as URL } from './modules/types/URL'
@@ -39,6 +39,12 @@ export default function readXlsx(contents, xml) {
39
39
  var styles = parseStyles(contents['xl/styles.xml'], xml);
40
40
  var _properties = parseProperties(contents['xl/workbook.xml'], xml);
41
41
 
42
+ // A hack for `getSheets()` method.
43
+ // https://github.com/catamphetamine/read-excel-file/issues/14
44
+ if (options.getSheets) {
45
+ return _properties.sheets;
46
+ }
47
+
42
48
  // Parse sheet data.
43
49
 
44
50
  var sheetId = typeof options.sheet === 'number' ? options.sheet : getSheetId(_properties.sheets, options.sheet);
@@ -57,7 +63,13 @@ export default function readXlsx(contents, xml) {
57
63
  // Actually perhaps remove this in some next major version.
58
64
  // So marking this `catch` "Deprecated".
59
65
  console.error(error);
60
- if (options.schema) {
66
+ // A hack for `getSheets()` method.
67
+ // https://github.com/catamphetamine/read-excel-file/issues/14
68
+ if (options.getSheets) {
69
+ return {};
70
+ }
71
+ // Return sheet data.
72
+ if (options.properties) {
61
73
  return {
62
74
  data: [],
63
75
  properties: {}
@@ -66,6 +78,16 @@ export default function readXlsx(contents, xml) {
66
78
  return [];
67
79
  }
68
80
 
81
+ if (sheet.cells.length === 0) {
82
+ if (options.properties) {
83
+ return {
84
+ data: [],
85
+ properties: properties
86
+ };
87
+ }
88
+ return [];
89
+ }
90
+
69
91
  var _sheet$dimensions = _slicedToArray(sheet.dimensions, 2),
70
92
  leftTop = _sheet$dimensions[0],
71
93
  rightBottom = _sheet$dimensions[1];
@@ -113,7 +135,7 @@ export default function readXlsx(contents, xml) {
113
135
 
114
136
  // cells = dropEmptyRows(dropEmptyColumns(cells, _ => _.value), options.rowMap, _ => _.value)
115
137
 
116
- if (options.schema) {
138
+ if (options.properties) {
117
139
  return {
118
140
  data: data,
119
141
  properties: properties
@@ -315,9 +337,19 @@ function parseSheet(content, xml, values, styles, properties, options) {
315
337
  return Cell(node, sheet, xml, values, styles, properties, options);
316
338
  });
317
339
 
340
+ if (cells.length === 0) {
341
+ return { cells: cells };
342
+ }
343
+
318
344
  var dimensions = xml.select(sheet, null, '//a:dimension/@ref', namespaces)[0];
345
+
319
346
  if (dimensions) {
320
347
  dimensions = dimensions.textContent.split(':').map(CellCoords);
348
+ // When there's only a single cell on a sheet
349
+ // there can sometimes be just "A1" for the dimensions string.
350
+ if (dimensions.length === 1) {
351
+ dimensions = [dimensions[0], dimensions[0]];
352
+ }
321
353
  } else {
322
354
  dimensions = calculateDimensions(cells);
323
355
  }
@@ -326,6 +358,9 @@ function parseSheet(content, xml, values, styles, properties, options) {
326
358
  }
327
359
 
328
360
  function parseValues(content, xml) {
361
+ if (!content) {
362
+ return [];
363
+ }
329
364
  var strings = xml.createDocument(content);
330
365
  return xml.select(strings, null, '//a:si', namespaces).map(function (string) {
331
366
  return xml.select(strings, string, './/a:t[not(ancestor::a:rPh)]', namespaces).map(function (_) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/readXlsx.js"],"names":["parseDate","namespaces","a","letters","readXlsx","contents","xml","options","sheet","properties","criticalError","values","parseValues","styles","parseStyles","parseProperties","sheetId","getSheetId","sheets","createSheetNotFoundError","parseSheet","error","console","schema","data","dimensions","leftTop","rightBottom","cols","column","rows","row","cells","times","push","value","cell","map","dropEmptyRows","dropEmptyColumns","rowMap","calculateDimensions","comparator","b","allRows","sort","allCols","minRow","maxRow","length","minCol","maxCol","n","action","i","colToInt","col","trim","split","indexOf","CellCoords","coords","parseInt","Cell","cellNode","getAttribute","select","textContent","undefined","parseFloat","style","numberFormat","id","dateFormat","template","smartDateParser","isDateTemplate","accessor","_","j","empty","splice","content","createDocument","node","strings","string","join","doc","baseStyles","parseCellStyle","numFmts","parseNumberFormatStyle","reduce","formats","format","xf","hasAttribute","xfId","numFmt","numberFormatId","book","workbookProperties","epoch1904","tokens","token","name","Object","keys","String","sheetNames","filter","names","sheetNamesText","Error"],"mappings":"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","file":"readXlsx.js","sourcesContent":["import parseDate from './parseDate'\r\n\r\nconst namespaces = {\r\n a: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'\r\n}\r\n\r\n// Maps \"A1\"-like coordinates to `{ row, column }` numeric coordinates.\r\nconst letters = [\"\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"]\r\n\r\n/**\r\n * Reads an (unzipped) XLSX file structure into a 2D array of cells.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @param {number?} options.sheet - Workbook sheet id (`1` by default).\r\n * @param {string?} options.dateFormat - Date format, e.g. \"MM/DD/YY\". Values having this format template set will be parsed as dates.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @return {object} An object of shape `{ data, cells, properties }`. `data: string[][]` is an array of rows, each row being an array of cell values. `cells: string[][]` is an array of rows, each row being an array of cells. `properties: object` is the spreadsheet properties (e.g. whether date epoch is 1904 instead of 1900).\r\n */\r\nexport default function readXlsx(contents, xml, options = {}) {\r\n // Deprecated 1.0.0 `sheet` argument. Will be removed in some next major release.\r\n if (typeof options === 'string' || typeof options === 'number') {\r\n options = { sheet: options }\r\n } else if (!options.sheet) {\r\n options = { ...options, sheet: 1 }\r\n }\r\n\r\n let sheet\r\n let properties\r\n\r\n // Error which will not be skipped.\r\n let criticalError\r\n\r\n try {\r\n const values = parseValues(contents[`xl/sharedStrings.xml`], xml)\r\n const styles = parseStyles(contents[`xl/styles.xml`], xml)\r\n const properties = parseProperties(contents[`xl/workbook.xml`], xml)\r\n\r\n // Parse sheet data.\r\n\r\n const sheetId = typeof options.sheet === 'number' ? options.sheet : getSheetId(properties.sheets, options.sheet)\r\n\r\n if (!sheetId || !contents[`xl/worksheets/sheet${sheetId}.xml`]) {\r\n criticalError = createSheetNotFoundError(options.sheet, properties.sheets)\r\n throw criticalError\r\n }\r\n\r\n sheet = parseSheet(contents[`xl/worksheets/sheet${sheetId}.xml`], xml, values, styles, properties, options)\r\n }\r\n catch (error) {\r\n if (error === criticalError) {\r\n throw error\r\n }\r\n // Guards against malformed XLSX files.\r\n // Actually perhaps remove this in some next major version.\r\n // So marking this `catch` \"Deprecated\".\r\n console.error(error)\r\n if (options.schema) {\r\n return {\r\n data: [],\r\n properties: {}\r\n }\r\n }\r\n return []\r\n }\r\n\r\n const [ leftTop, rightBottom ] = sheet.dimensions\r\n\r\n const cols = (rightBottom.column - leftTop.column) + 1\r\n const rows = (rightBottom.row - leftTop.row) + 1\r\n\r\n let cells = []\r\n\r\n times(rows, () => {\r\n const row = []\r\n times(cols, () => row.push({ value: null }))\r\n cells.push(row)\r\n })\r\n\r\n for (const cell of sheet.cells) {\r\n const row = cell.row - leftTop.row\r\n const column = cell.column - leftTop.column\r\n if (cells[row]) {\r\n cells[row][column] = cell\r\n }\r\n }\r\n\r\n let data = cells.map(row => row.map(cell => cell.value))\r\n data = dropEmptyRows(dropEmptyColumns(data), options.rowMap)\r\n\r\n // cells = dropEmptyRows(dropEmptyColumns(cells, _ => _.value), options.rowMap, _ => _.value)\r\n\r\n if (options.schema) {\r\n return {\r\n data,\r\n properties\r\n }\r\n }\r\n\r\n return data\r\n}\r\n\r\nfunction calculateDimensions (cells) {\r\n const comparator = (a, b) => a - b\r\n const allRows = cells.map(cell => cell.row).sort(comparator)\r\n const allCols = cells.map(cell => cell.column).sort(comparator)\r\n const minRow = allRows[0]\r\n const maxRow = allRows[allRows.length - 1]\r\n const minCol = allCols[0]\r\n const maxCol = allCols[allCols.length - 1]\r\n\r\n return [\r\n { row: minRow, column: minCol },\r\n { row: maxRow, column: maxCol }\r\n ]\r\n}\r\n\r\nfunction times(n, action) {\r\n let i = 0\r\n while (i < n) {\r\n action()\r\n i++\r\n }\r\n}\r\n\r\nfunction colToInt(col) {\r\n col = col.trim().split('')\r\n\r\n let n = 0;\r\n\r\n for (let i = 0; i < col.length; i++) {\r\n n *= 26\r\n n += letters.indexOf(col[i])\r\n }\r\n\r\n return n\r\n}\r\n\r\nfunction CellCoords(coords) {\r\n coords = coords.split(/(\\d+)/)\r\n return {\r\n row : parseInt(coords[1]),\r\n column : colToInt(coords[0])\r\n }\r\n}\r\n\r\nfunction Cell(cellNode, sheet, xml, values, styles, properties, options) {\r\n const coords = CellCoords(cellNode.getAttribute('r'))\r\n\r\n let value = xml.select(sheet, cellNode, 'a:v', namespaces)[0]\r\n // For `xpath` `value` can be `undefined` while for native `DOMParser` it's `null`.\r\n value = value && value.textContent\r\n\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n switch (cellNode.getAttribute('t')) {\r\n case 's':\r\n value = values[parseInt(value)].trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n case 'b':\r\n value = value === '1' ? true : false\r\n break\r\n\r\n case 'n':\r\n // Default type is \"n\".\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n default:\r\n if (value === undefined) {\r\n break\r\n }\r\n value = parseFloat(value)\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n const style = styles[parseInt(cellNode.getAttribute('s') || 0)]\r\n if ((style.numberFormat.id >= 14 && style.numberFormat.id <= 22) ||\r\n (style.numberFormat.id >= 45 && style.numberFormat.id <= 47) ||\r\n (options.dateFormat && style.numberFormat.template === options.dateFormat) ||\r\n (options.smartDateParser !== false && style.numberFormat.template && isDateTemplate(style.numberFormat.template))) {\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return {\r\n row : coords.row,\r\n column : coords.column,\r\n value\r\n }\r\n}\r\n\r\nexport function dropEmptyRows(data, rowMap, accessor = _ => _) {\r\n // Fill in row map.\r\n if (rowMap) {\r\n let j = 0\r\n while (j < data.length) {\r\n rowMap[j] = j\r\n j++\r\n }\r\n }\r\n // Drop empty rows.\r\n let i = data.length - 1\r\n while (i >= 0) {\r\n // Check if the row is empty.\r\n let empty = true\r\n for (const cell of data[i]) {\r\n if (accessor(cell) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n // Remove the empty row.\r\n if (empty) {\r\n data.splice(i, 1)\r\n if (rowMap) {\r\n rowMap.splice(i, 1)\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nexport function dropEmptyColumns(data, accessor = _ => _) {\r\n let i = data[0].length - 1\r\n while (i >= 0) {\r\n let empty = true\r\n for (const row of data) {\r\n if (accessor(row[i]) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n if (empty) {\r\n let j = 0;\r\n while (j < data.length) {\r\n data[j].splice(i, 1)\r\n j++\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nfunction parseSheet(content, xml, values, styles, properties, options) {\r\n const sheet = xml.createDocument(content)\r\n\r\n const cells = xml.select(sheet, null, '/a:worksheet/a:sheetData/a:row/a:c', namespaces).map(node => Cell(node, sheet, xml, values, styles, properties, options))\r\n\r\n let dimensions = xml.select(sheet, null, '//a:dimension/@ref', namespaces)[0]\r\n if (dimensions) {\r\n dimensions = dimensions.textContent.split(':').map(CellCoords)\r\n } else {\r\n dimensions = calculateDimensions(cells)\r\n }\r\n\r\n return { cells, dimensions }\r\n}\r\n\r\nfunction parseValues(content, xml) {\r\n const strings = xml.createDocument(content)\r\n return xml.select(strings, null, '//a:si', namespaces)\r\n .map(string => xml.select(strings, string, './/a:t[not(ancestor::a:rPh)]', namespaces).map(_ => _.textContent).join(''))\r\n}\r\n\r\n// http://officeopenxml.com/SSstyles.php\r\nfunction parseStyles(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n // https://social.msdn.microsoft.com/Forums/sqlserver/en-US/708978af-b598-45c4-a598-d3518a5a09f0/howwhen-is-cellstylexfs-vs-cellxfs-applied-to-a-cell?forum=os_binaryfile\r\n // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/\r\n const doc = xml.createDocument(content)\r\n const baseStyles = xml.select(doc, null, '//a:styleSheet/a:cellStyleXfs/a:xf', namespaces).map(parseCellStyle);\r\n const numFmts = xml.select(doc, null, '//a:styleSheet/a:numFmts/a:numFmt', namespaces)\r\n .map(parseNumberFormatStyle)\r\n .reduce((formats, format) => {\r\n formats[format.id] = format\r\n return formats\r\n }, [])\r\n\r\n return xml.select(doc, null, '//a:styleSheet/a:cellXfs/a:xf', namespaces).map((xf) => {\r\n if (xf.hasAttribute('xfId')) {\r\n return {\r\n ...baseStyles[xf.xfId],\r\n ...parseCellStyle(xf, numFmts)\r\n }\r\n }\r\n return parseCellStyle(xf, numFmts)\r\n })\r\n}\r\n\r\nfunction parseNumberFormatStyle(numFmt) {\r\n return {\r\n id: numFmt.getAttribute('numFmtId'),\r\n template: numFmt.getAttribute('formatCode')\r\n }\r\n}\r\n\r\n// http://www.datypic.com/sc/ooxml/e-ssml_xf-2.html\r\nfunction parseCellStyle(xf, numFmts) {\r\n const style = {}\r\n if (xf.hasAttribute('numFmtId')) {\r\n const numberFormatId = xf.getAttribute('numFmtId')\r\n if (numFmts[numberFormatId]) {\r\n style.numberFormat = numFmts[numberFormatId]\r\n } else {\r\n style.numberFormat = { id: numberFormatId }\r\n }\r\n }\r\n return style\r\n}\r\n\r\nfunction parseProperties(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n const book = xml.createDocument(content)\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html\r\n const workbookProperties = xml.select(book, null, '//a:workbookPr', namespaces)[0]\r\n if (!workbookProperties) {\r\n return {}\r\n }\r\n const properties = {};\r\n // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel\r\n if (workbookProperties.getAttribute('date1904') === '1') {\r\n properties.epoch1904 = true\r\n }\r\n // Get sheet names (just because they're available).\r\n for (const sheet of xml.select(book, null, '//a:sheets/a:sheet', namespaces)) {\r\n if (sheet.getAttribute('name')) {\r\n properties.sheets = properties.sheets || {}\r\n properties.sheets[sheet.getAttribute('sheetId')] = sheet.getAttribute('name')\r\n }\r\n }\r\n return properties;\r\n}\r\n\r\nfunction isDateTemplate(template) {\r\n const tokens = template.split(/\\W+/)\r\n for (const token of tokens) {\r\n if (['MM', 'DD', 'YY', 'YYYY'].indexOf(token) < 0) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction getSheetId(sheets, name) {\r\n if (!sheets) {\r\n return\r\n }\r\n for (const sheetId of Object.keys(sheets)) {\r\n if (sheets[sheetId] === name) {\r\n return sheetId\r\n }\r\n }\r\n // Deprecated.\r\n // Legacy support for `sheet: '1'`, etc.\r\n const id = parseInt(name, 10)\r\n if (String(id) === name) {\r\n return id\r\n }\r\n}\r\n\r\nfunction createSheetNotFoundError(sheet, sheets) {\r\n let sheetNames = {}\r\n if (sheets) {\r\n sheetNames = Object.keys(sheets)\r\n .filter(id => sheets[id])\r\n .reduce((names, id) => {\r\n names[id] = sheets[id]\r\n return names\r\n }, {})\r\n }\r\n const sheetNamesText = Object.keys(sheetNames).map(id => `\"${sheetNames[id]}\" (#${id})`).join(', ')\r\n return new Error(`Sheet ${typeof sheet === 'number' ? '#' + sheet : '\"' + sheet + '\"'} not found in *.xlsx file.${sheetNamesText ? ' Available sheets: ' + sheetNamesText + '.' : ''}`)\r\n}"]}
1
+ {"version":3,"sources":["../source/readXlsx.js"],"names":["parseDate","namespaces","a","letters","readXlsx","contents","xml","options","sheet","properties","criticalError","values","parseValues","styles","parseStyles","parseProperties","getSheets","sheets","sheetId","getSheetId","createSheetNotFoundError","parseSheet","error","console","data","cells","length","dimensions","leftTop","rightBottom","cols","column","rows","row","times","push","value","cell","map","dropEmptyRows","dropEmptyColumns","rowMap","calculateDimensions","comparator","b","allRows","sort","allCols","minRow","maxRow","minCol","maxCol","n","action","i","colToInt","col","trim","split","indexOf","CellCoords","coords","parseInt","Cell","cellNode","getAttribute","select","textContent","undefined","parseFloat","style","numberFormat","id","dateFormat","template","smartDateParser","isDateTemplate","accessor","_","j","empty","splice","content","createDocument","node","strings","string","join","doc","baseStyles","parseCellStyle","numFmts","parseNumberFormatStyle","reduce","formats","format","xf","hasAttribute","xfId","numFmt","numberFormatId","book","workbookProperties","epoch1904","tokens","token","name","Object","keys","String","sheetNames","filter","names","sheetNamesText","Error"],"mappings":"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","file":"readXlsx.js","sourcesContent":["import parseDate from './parseDate'\r\n\r\nconst namespaces = {\r\n a: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'\r\n}\r\n\r\n// Maps \"A1\"-like coordinates to `{ row, column }` numeric coordinates.\r\nconst letters = [\"\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"]\r\n\r\n/**\r\n * Reads an (unzipped) XLSX file structure into a 2D array of cells.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @param {number?} options.sheet - Workbook sheet id (`1` by default).\r\n * @param {string?} options.dateFormat - Date format, e.g. \"MM/DD/YY\". Values having this format template set will be parsed as dates.\r\n * @param {object} contents - A list of XML files inside XLSX file (which is a zipped directory).\r\n * @return {object} An object of shape `{ data, cells, properties }`. `data: string[][]` is an array of rows, each row being an array of cell values. `cells: string[][]` is an array of rows, each row being an array of cells. `properties: object` is the spreadsheet properties (e.g. whether date epoch is 1904 instead of 1900).\r\n */\r\nexport default function readXlsx(contents, xml, options = {}) {\r\n // Deprecated 1.0.0 `sheet` argument. Will be removed in some next major release.\r\n if (typeof options === 'string' || typeof options === 'number') {\r\n options = { sheet: options }\r\n } else if (!options.sheet) {\r\n options = { ...options, sheet: 1 }\r\n }\r\n\r\n let sheet\r\n let properties\r\n\r\n // Error which will not be skipped.\r\n let criticalError\r\n\r\n try {\r\n const values = parseValues(contents[`xl/sharedStrings.xml`], xml)\r\n const styles = parseStyles(contents[`xl/styles.xml`], xml)\r\n const properties = parseProperties(contents[`xl/workbook.xml`], xml)\r\n\r\n // A hack for `getSheets()` method.\r\n // https://github.com/catamphetamine/read-excel-file/issues/14\r\n if (options.getSheets) {\r\n return properties.sheets\r\n }\r\n\r\n // Parse sheet data.\r\n\r\n const sheetId = typeof options.sheet === 'number' ? options.sheet : getSheetId(properties.sheets, options.sheet)\r\n\r\n if (!sheetId || !contents[`xl/worksheets/sheet${sheetId}.xml`]) {\r\n criticalError = createSheetNotFoundError(options.sheet, properties.sheets)\r\n throw criticalError\r\n }\r\n\r\n sheet = parseSheet(contents[`xl/worksheets/sheet${sheetId}.xml`], xml, values, styles, properties, options)\r\n }\r\n catch (error) {\r\n if (error === criticalError) {\r\n throw error\r\n }\r\n // Guards against malformed XLSX files.\r\n // Actually perhaps remove this in some next major version.\r\n // So marking this `catch` \"Deprecated\".\r\n console.error(error)\r\n // A hack for `getSheets()` method.\r\n // https://github.com/catamphetamine/read-excel-file/issues/14\r\n if (options.getSheets) {\r\n return {}\r\n }\r\n // Return sheet data.\r\n if (options.properties) {\r\n return {\r\n data: [],\r\n properties: {}\r\n }\r\n }\r\n return []\r\n }\r\n\r\n if (sheet.cells.length === 0) {\r\n if (options.properties) {\r\n return {\r\n data: [],\r\n properties\r\n }\r\n }\r\n return []\r\n }\r\n\r\n const [ leftTop, rightBottom ] = sheet.dimensions\r\n\r\n const cols = (rightBottom.column - leftTop.column) + 1\r\n const rows = (rightBottom.row - leftTop.row) + 1\r\n\r\n let cells = []\r\n\r\n times(rows, () => {\r\n const row = []\r\n times(cols, () => row.push({ value: null }))\r\n cells.push(row)\r\n })\r\n\r\n for (const cell of sheet.cells) {\r\n const row = cell.row - leftTop.row\r\n const column = cell.column - leftTop.column\r\n if (cells[row]) {\r\n cells[row][column] = cell\r\n }\r\n }\r\n\r\n let data = cells.map(row => row.map(cell => cell.value))\r\n data = dropEmptyRows(dropEmptyColumns(data), options.rowMap)\r\n\r\n // cells = dropEmptyRows(dropEmptyColumns(cells, _ => _.value), options.rowMap, _ => _.value)\r\n\r\n if (options.properties) {\r\n return {\r\n data,\r\n properties\r\n }\r\n }\r\n\r\n return data\r\n}\r\n\r\nfunction calculateDimensions (cells) {\r\n const comparator = (a, b) => a - b\r\n const allRows = cells.map(cell => cell.row).sort(comparator)\r\n const allCols = cells.map(cell => cell.column).sort(comparator)\r\n const minRow = allRows[0]\r\n const maxRow = allRows[allRows.length - 1]\r\n const minCol = allCols[0]\r\n const maxCol = allCols[allCols.length - 1]\r\n\r\n return [\r\n { row: minRow, column: minCol },\r\n { row: maxRow, column: maxCol }\r\n ]\r\n}\r\n\r\nfunction times(n, action) {\r\n let i = 0\r\n while (i < n) {\r\n action()\r\n i++\r\n }\r\n}\r\n\r\nfunction colToInt(col) {\r\n col = col.trim().split('')\r\n\r\n let n = 0;\r\n\r\n for (let i = 0; i < col.length; i++) {\r\n n *= 26\r\n n += letters.indexOf(col[i])\r\n }\r\n\r\n return n\r\n}\r\n\r\nfunction CellCoords(coords) {\r\n coords = coords.split(/(\\d+)/)\r\n return {\r\n row : parseInt(coords[1]),\r\n column : colToInt(coords[0])\r\n }\r\n}\r\n\r\nfunction Cell(cellNode, sheet, xml, values, styles, properties, options) {\r\n const coords = CellCoords(cellNode.getAttribute('r'))\r\n\r\n let value = xml.select(sheet, cellNode, 'a:v', namespaces)[0]\r\n // For `xpath` `value` can be `undefined` while for native `DOMParser` it's `null`.\r\n value = value && value.textContent\r\n\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n switch (cellNode.getAttribute('t')) {\r\n case 's':\r\n value = values[parseInt(value)].trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n case 'b':\r\n value = value === '1' ? true : false\r\n break\r\n\r\n case 'n':\r\n // Default type is \"n\".\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n default:\r\n if (value === undefined) {\r\n break\r\n }\r\n value = parseFloat(value)\r\n // XLSX has no specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n const style = styles[parseInt(cellNode.getAttribute('s') || 0)]\r\n if ((style.numberFormat.id >= 14 && style.numberFormat.id <= 22) ||\r\n (style.numberFormat.id >= 45 && style.numberFormat.id <= 47) ||\r\n (options.dateFormat && style.numberFormat.template === options.dateFormat) ||\r\n (options.smartDateParser !== false && style.numberFormat.template && isDateTemplate(style.numberFormat.template))) {\r\n value = parseDate(value, properties)\r\n }\r\n break\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return {\r\n row : coords.row,\r\n column : coords.column,\r\n value\r\n }\r\n}\r\n\r\nexport function dropEmptyRows(data, rowMap, accessor = _ => _) {\r\n // Fill in row map.\r\n if (rowMap) {\r\n let j = 0\r\n while (j < data.length) {\r\n rowMap[j] = j\r\n j++\r\n }\r\n }\r\n // Drop empty rows.\r\n let i = data.length - 1\r\n while (i >= 0) {\r\n // Check if the row is empty.\r\n let empty = true\r\n for (const cell of data[i]) {\r\n if (accessor(cell) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n // Remove the empty row.\r\n if (empty) {\r\n data.splice(i, 1)\r\n if (rowMap) {\r\n rowMap.splice(i, 1)\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nexport function dropEmptyColumns(data, accessor = _ => _) {\r\n let i = data[0].length - 1\r\n while (i >= 0) {\r\n let empty = true\r\n for (const row of data) {\r\n if (accessor(row[i]) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n if (empty) {\r\n let j = 0;\r\n while (j < data.length) {\r\n data[j].splice(i, 1)\r\n j++\r\n }\r\n }\r\n i--\r\n }\r\n return data\r\n}\r\n\r\nfunction parseSheet(content, xml, values, styles, properties, options) {\r\n const sheet = xml.createDocument(content)\r\n\r\n const cells = xml.select(sheet, null, '/a:worksheet/a:sheetData/a:row/a:c', namespaces).map(node => Cell(node, sheet, xml, values, styles, properties, options))\r\n\r\n if (cells.length === 0) {\r\n return { cells }\r\n }\r\n\r\n let dimensions = xml.select(sheet, null, '//a:dimension/@ref', namespaces)[0]\r\n\r\n if (dimensions) {\r\n dimensions = dimensions.textContent.split(':').map(CellCoords)\r\n // When there's only a single cell on a sheet\r\n // there can sometimes be just \"A1\" for the dimensions string.\r\n if (dimensions.length === 1) {\r\n dimensions = [dimensions[0], dimensions[0]]\r\n }\r\n } else {\r\n dimensions = calculateDimensions(cells)\r\n }\r\n\r\n return { cells, dimensions }\r\n}\r\n\r\nfunction parseValues(content, xml) {\r\n if (!content) {\r\n return []\r\n }\r\n const strings = xml.createDocument(content)\r\n return xml.select(strings, null, '//a:si', namespaces)\r\n .map(string => xml.select(strings, string, './/a:t[not(ancestor::a:rPh)]', namespaces).map(_ => _.textContent).join(''))\r\n}\r\n\r\n// http://officeopenxml.com/SSstyles.php\r\nfunction parseStyles(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n // https://social.msdn.microsoft.com/Forums/sqlserver/en-US/708978af-b598-45c4-a598-d3518a5a09f0/howwhen-is-cellstylexfs-vs-cellxfs-applied-to-a-cell?forum=os_binaryfile\r\n // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/\r\n const doc = xml.createDocument(content)\r\n const baseStyles = xml.select(doc, null, '//a:styleSheet/a:cellStyleXfs/a:xf', namespaces).map(parseCellStyle);\r\n const numFmts = xml.select(doc, null, '//a:styleSheet/a:numFmts/a:numFmt', namespaces)\r\n .map(parseNumberFormatStyle)\r\n .reduce((formats, format) => {\r\n formats[format.id] = format\r\n return formats\r\n }, [])\r\n\r\n return xml.select(doc, null, '//a:styleSheet/a:cellXfs/a:xf', namespaces).map((xf) => {\r\n if (xf.hasAttribute('xfId')) {\r\n return {\r\n ...baseStyles[xf.xfId],\r\n ...parseCellStyle(xf, numFmts)\r\n }\r\n }\r\n return parseCellStyle(xf, numFmts)\r\n })\r\n}\r\n\r\nfunction parseNumberFormatStyle(numFmt) {\r\n return {\r\n id: numFmt.getAttribute('numFmtId'),\r\n template: numFmt.getAttribute('formatCode')\r\n }\r\n}\r\n\r\n// http://www.datypic.com/sc/ooxml/e-ssml_xf-2.html\r\nfunction parseCellStyle(xf, numFmts) {\r\n const style = {}\r\n if (xf.hasAttribute('numFmtId')) {\r\n const numberFormatId = xf.getAttribute('numFmtId')\r\n if (numFmts[numberFormatId]) {\r\n style.numberFormat = numFmts[numberFormatId]\r\n } else {\r\n style.numberFormat = { id: numberFormatId }\r\n }\r\n }\r\n return style\r\n}\r\n\r\nfunction parseProperties(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n const book = xml.createDocument(content)\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html\r\n const workbookProperties = xml.select(book, null, '//a:workbookPr', namespaces)[0]\r\n if (!workbookProperties) {\r\n return {}\r\n }\r\n const properties = {};\r\n // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel\r\n if (workbookProperties.getAttribute('date1904') === '1') {\r\n properties.epoch1904 = true\r\n }\r\n // Get sheet names (just because they're available).\r\n for (const sheet of xml.select(book, null, '//a:sheets/a:sheet', namespaces)) {\r\n if (sheet.getAttribute('name')) {\r\n properties.sheets = properties.sheets || {}\r\n properties.sheets[sheet.getAttribute('sheetId')] = sheet.getAttribute('name')\r\n }\r\n }\r\n return properties;\r\n}\r\n\r\nfunction isDateTemplate(template) {\r\n const tokens = template.split(/\\W+/)\r\n for (const token of tokens) {\r\n if (['MM', 'DD', 'YY', 'YYYY'].indexOf(token) < 0) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction getSheetId(sheets, name) {\r\n if (!sheets) {\r\n return\r\n }\r\n for (const sheetId of Object.keys(sheets)) {\r\n if (sheets[sheetId] === name) {\r\n return sheetId\r\n }\r\n }\r\n // Deprecated.\r\n // Legacy support for `sheet: '1'`, etc.\r\n const id = parseInt(name, 10)\r\n if (String(id) === name) {\r\n return id\r\n }\r\n}\r\n\r\nfunction createSheetNotFoundError(sheet, sheets) {\r\n let sheetNames = {}\r\n if (sheets) {\r\n sheetNames = Object.keys(sheets)\r\n .filter(id => sheets[id])\r\n .reduce((names, id) => {\r\n names[id] = sheets[id]\r\n return names\r\n }, {})\r\n }\r\n const sheetNamesText = Object.keys(sheetNames).map(id => `\"${sheetNames[id]}\" (#${id})`).join(', ')\r\n return new Error(`Sheet ${typeof sheet === 'number' ? '#' + sheet : '\"' + sheet + '\"'} not found in *.xlsx file.${sheetNamesText ? ' Available sheets: ' + sheetNamesText + '.' : ''}`)\r\n}"]}
@@ -4,7 +4,7 @@ import readXlsx from './readXlsx';
4
4
  import convertToJson from './convertToJson';
5
5
 
6
6
  export default function readXlsxFileContents(entries, xml, options) {
7
- var result = readXlsx(entries, xml, options);
7
+ var result = readXlsx(entries, xml, _extends({}, options, { properties: options.schema || options.properties }));
8
8
  if (options.schema) {
9
9
  return convertToJson(result.data, options.schema, _extends({}, options, { properties: result.properties }));
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/readXlsxFileContents.js"],"names":["readXlsx","convertToJson","readXlsxFileContents","entries","xml","options","result","schema","data","properties"],"mappings":";;AAAA,OAAOA,QAAP,MAAqB,YAArB;AACA,OAAOC,aAAP,MAA0B,iBAA1B;;AAEA,eAAe,SAASC,oBAAT,CAA8BC,OAA9B,EAAuCC,GAAvC,EAA4CC,OAA5C,EAAqD;AACnE,KAAMC,SAASN,SAASG,OAAT,EAAkBC,GAAlB,EAAuBC,OAAvB,CAAf;AACA,KAAIA,QAAQE,MAAZ,EAAoB;AACnB,SAAON,cAAcK,OAAOE,IAArB,EAA2BH,QAAQE,MAAnC,eAAgDF,OAAhD,IAAyDI,YAAYH,OAAOG,UAA5E,IAAP;AACA;AACD,QAAOH,MAAP;AACA","file":"readXlsxFileContents.js","sourcesContent":["import readXlsx from './readXlsx'\r\nimport convertToJson from './convertToJson'\r\n\r\nexport default function readXlsxFileContents(entries, xml, options) {\r\n\tconst result = readXlsx(entries, xml, options)\r\n\tif (options.schema) {\r\n\t\treturn convertToJson(result.data, options.schema, { ...options, properties: result.properties })\r\n\t}\r\n\treturn result\r\n}"]}
1
+ {"version":3,"sources":["../source/readXlsxFileContents.js"],"names":["readXlsx","convertToJson","readXlsxFileContents","entries","xml","options","result","properties","schema","data"],"mappings":";;AAAA,OAAOA,QAAP,MAAqB,YAArB;AACA,OAAOC,aAAP,MAA0B,iBAA1B;;AAEA,eAAe,SAASC,oBAAT,CAA8BC,OAA9B,EAAuCC,GAAvC,EAA4CC,OAA5C,EAAqD;AACnE,KAAMC,SAASN,SAASG,OAAT,EAAkBC,GAAlB,eAA4BC,OAA5B,IAAqCE,YAAYF,QAAQG,MAAR,IAAkBH,QAAQE,UAA3E,IAAf;AACA,KAAIF,QAAQG,MAAZ,EAAoB;AACnB,SAAOP,cAAcK,OAAOG,IAArB,EAA2BJ,QAAQG,MAAnC,eAAgDH,OAAhD,IAAyDE,YAAYD,OAAOC,UAA5E,IAAP;AACA;AACD,QAAOD,MAAP;AACA","file":"readXlsxFileContents.js","sourcesContent":["import readXlsx from './readXlsx'\r\nimport convertToJson from './convertToJson'\r\n\r\nexport default function readXlsxFileContents(entries, xml, options) {\r\n\tconst result = readXlsx(entries, xml, { ...options, properties: options.schema || options.properties })\r\n\tif (options.schema) {\r\n\t\treturn convertToJson(result.data, options.schema, { ...options, properties: result.properties })\r\n\t}\r\n\treturn result\r\n}"]}
@@ -2,7 +2,9 @@
2
2
  // https://github.com/goto100/xpath/issues/85
3
3
  export default {
4
4
  createDocument: function createDocument(content) {
5
- return new DOMParser().parseFromString(content, 'text/xml');
5
+ // A weird bug: it won't parse XML unless it's trimmed.
6
+ // https://github.com/catamphetamine/read-excel-file/issues/21
7
+ return new DOMParser().parseFromString(content.trim(), 'text/xml');
6
8
  },
7
9
  select: function select(doc, node, path) {
8
10
  var namespaces = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/xmlBrowser.js"],"names":["createDocument","content","DOMParser","parseFromString","select","doc","node","path","namespaces","nodes","evaluate","prefix","XPathResult","ANY_TYPE","results","result","iterateNext","push"],"mappings":"AAAA;AACA;AACA,eAAe;AACdA,eADc,0BACCC,OADD,EACU;AACvB,SAAO,IAAIC,SAAJ,GAAgBC,eAAhB,CAAgCF,OAAhC,EAAyC,UAAzC,CAAP;AACA,EAHa;AAKdG,OALc,kBAKPC,GALO,EAKFC,IALE,EAKIC,IALJ,EAK2B;AAAA,MAAjBC,UAAiB,uEAAJ,EAAI;;AACxC,MAAMC,QAAQJ,IAAIK,QAAJ,CACbH,IADa,EAEbD,QAAQD,GAFK,EAGb;AAAA,UAAUG,WAAWG,MAAX,CAAV;AAAA,GAHa,EAIbC,YAAYC,QAJC,EAKb,IALa,CAAd;AAOA;AACA,MAAMC,UAAU,EAAhB;AACA,MAAIC,SAASN,MAAMO,WAAN,EAAb;AACA,SAAOD,MAAP,EAAe;AACdD,WAAQG,IAAR,CAAaF,MAAb;AACAA,YAASN,MAAMO,WAAN,EAAT;AACA;AACD,SAAOF,OAAP;AACA;AArBa,CAAf","file":"xmlBrowser.js","sourcesContent":["// Using native `DOMParser` because `xpath` + `xmldom` doesn't work.\r\n// https://github.com/goto100/xpath/issues/85\r\nexport default {\r\n\tcreateDocument(content) {\r\n\t\treturn new DOMParser().parseFromString(content, 'text/xml')\r\n\t},\r\n\r\n\tselect(doc, node, path, namespaces = {}) {\r\n\t\tconst nodes = doc.evaluate(\r\n\t\t\tpath,\r\n\t\t\tnode || doc,\r\n\t\t\tprefix => namespaces[prefix],\r\n\t\t\tXPathResult.ANY_TYPE,\r\n\t\t\tnull\r\n\t\t)\r\n\t\t// Convert iterator to an array.\r\n\t\tconst results = []\r\n\t\tlet result = nodes.iterateNext()\r\n\t\twhile (result) {\r\n\t\t\tresults.push(result)\r\n\t\t\tresult = nodes.iterateNext()\r\n\t\t}\r\n\t\treturn results\r\n\t}\r\n}"]}
1
+ {"version":3,"sources":["../source/xmlBrowser.js"],"names":["createDocument","content","DOMParser","parseFromString","trim","select","doc","node","path","namespaces","nodes","evaluate","prefix","XPathResult","ANY_TYPE","results","result","iterateNext","push"],"mappings":"AAAA;AACA;AACA,eAAe;AACdA,eADc,0BACCC,OADD,EACU;AACvB;AACA;AACA,SAAO,IAAIC,SAAJ,GAAgBC,eAAhB,CAAgCF,QAAQG,IAAR,EAAhC,EAAgD,UAAhD,CAAP;AACA,EALa;AAOdC,OAPc,kBAOPC,GAPO,EAOFC,IAPE,EAOIC,IAPJ,EAO2B;AAAA,MAAjBC,UAAiB,uEAAJ,EAAI;;AACxC,MAAMC,QAAQJ,IAAIK,QAAJ,CACbH,IADa,EAEbD,QAAQD,GAFK,EAGb;AAAA,UAAUG,WAAWG,MAAX,CAAV;AAAA,GAHa,EAIbC,YAAYC,QAJC,EAKb,IALa,CAAd;AAOA;AACA,MAAMC,UAAU,EAAhB;AACA,MAAIC,SAASN,MAAMO,WAAN,EAAb;AACA,SAAOD,MAAP,EAAe;AACdD,WAAQG,IAAR,CAAaF,MAAb;AACAA,YAASN,MAAMO,WAAN,EAAT;AACA;AACD,SAAOF,OAAP;AACA;AAvBa,CAAf","file":"xmlBrowser.js","sourcesContent":["// Using native `DOMParser` because `xpath` + `xmldom` doesn't work.\r\n// https://github.com/goto100/xpath/issues/85\r\nexport default {\r\n\tcreateDocument(content) {\r\n\t\t// A weird bug: it won't parse XML unless it's trimmed.\r\n\t\t// https://github.com/catamphetamine/read-excel-file/issues/21\r\n\t\treturn new DOMParser().parseFromString(content.trim(), 'text/xml')\r\n\t},\r\n\r\n\tselect(doc, node, path, namespaces = {}) {\r\n\t\tconst nodes = doc.evaluate(\r\n\t\t\tpath,\r\n\t\t\tnode || doc,\r\n\t\t\tprefix => namespaces[prefix],\r\n\t\t\tXPathResult.ANY_TYPE,\r\n\t\t\tnull\r\n\t\t)\r\n\t\t// Convert iterator to an array.\r\n\t\tconst results = []\r\n\t\tlet result = nodes.iterateNext()\r\n\t\twhile (result) {\r\n\t\t\tresults.push(result)\r\n\t\t\tresult = nodes.iterateNext()\r\n\t\t}\r\n\t\treturn results\r\n\t}\r\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "read-excel-file",
3
- "version": "2.0.5",
3
+ "version": "2.0.10",
4
4
  "description": "Read `*.xlsx` files in a browser or Node.js. Parse to JSON with a strict schema.",
5
5
  "module": "index.js",
6
6
  "sideEffects": false,