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.
- package/CHANGELOG.md +2 -0
- package/README.md +11 -3
- package/bundle/read-excel-file.min.js +1 -1
- package/bundle/read-excel-file.min.js.map +1 -1
- package/commonjs/readXlsx.js +37 -2
- package/commonjs/readXlsx.js.map +1 -1
- package/commonjs/readXlsxFileContents.js +1 -1
- package/commonjs/readXlsxFileContents.js.map +1 -1
- package/commonjs/xmlBrowser.js +3 -1
- package/commonjs/xmlBrowser.js.map +1 -1
- package/index.commonjs.js +1 -0
- package/index.js +1 -0
- package/modules/readXlsx.js +37 -2
- package/modules/readXlsx.js.map +1 -1
- package/modules/readXlsxFileContents.js +1 -1
- package/modules/readXlsxFileContents.js.map +1 -1
- package/modules/xmlBrowser.js +3 -1
- package/modules/xmlBrowser.js.map +1 -1
- package/package.json +1 -1
package/commonjs/readXlsx.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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 (_) {
|
package/commonjs/readXlsx.js.map
CHANGED
|
@@ -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":";;;;;;;;;;kBAiBwBA,Q;QA0MRC,a,GAAAA,a;QAgCAC,gB,GAAAA,gB;;AA3PhB;;;;;;AAEA,IAAMC,aAAa;AACjBC,KAAG;;AAGL;AAJmB,CAAnB,CAKA,IAAMC,UAAU,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,EAAoB,GAApB,EAAyB,GAAzB,EAA8B,GAA9B,EAAmC,GAAnC,EAAwC,GAAxC,EAA6C,GAA7C,EAAkD,GAAlD,EAAuD,GAAvD,EAA4D,GAA5D,EAAiE,GAAjE,EAAsE,GAAtE,EAA2E,GAA3E,EAAgF,GAAhF,EAAqF,GAArF,EAA0F,GAA1F,EAA+F,GAA/F,EAAoG,GAApG,EAAyG,GAAzG,EAA8G,GAA9G,EAAmH,GAAnH,EAAwH,GAAxH,EAA6H,GAA7H,EAAkI,GAAlI,CAAhB;;AAEA;;;;;;;;AAQe,SAASL,QAAT,CAAkBM,QAAlB,EAA4BC,GAA5B,EAA+C;AAAA,MAAdC,OAAc,uEAAJ,EAAI;;AAC5D;AACA,MAAI,OAAOA,OAAP,KAAmB,QAAnB,IAA+B,OAAOA,OAAP,KAAmB,QAAtD,EAAgE;AAC9DA,cAAU,EAAEC,OAAOD,OAAT,EAAV;AACD,GAFD,MAEO,IAAI,CAACA,QAAQC,KAAb,EAAoB;AACzBD,2BAAeA,OAAf,IAAwBC,OAAO,CAA/B;AACD;;AAED,MAAIA,cAAJ;AACA,MAAIC,mBAAJ;;AAEA;AACA,MAAIC,sBAAJ;;AAEA,MAAI;AACF,QAAMC,SAASC,YAAYP,gCAAZ,EAA8CC,GAA9C,CAAf;AACA,QAAMO,SAASC,YAAYT,yBAAZ,EAAuCC,GAAvC,CAAf;AACA,QAAMG,cAAaM,gBAAgBV,2BAAhB,EAA6CC,GAA7C,CAAnB;;AAEA;AACA;AACA,QAAIC,QAAQS,SAAZ,EAAuB;AACrB,aAAOP,YAAWQ,MAAlB;AACD;;AAED;;AAEA,QAAMC,UAAU,OAAOX,QAAQC,KAAf,KAAyB,QAAzB,GAAoCD,QAAQC,KAA5C,GAAoDW,WAAWV,YAAWQ,MAAtB,EAA8BV,QAAQC,KAAtC,CAApE;;AAEA,QAAI,CAACU,OAAD,IAAY,CAACb,iCAA+Ba,OAA/B,UAAjB,EAAgE;AAC9DR,sBAAgBU,yBAAyBb,QAAQC,KAAjC,EAAwCC,YAAWQ,MAAnD,CAAhB;AACA,YAAMP,aAAN;AACD;;AAEDF,YAAQa,WAAWhB,iCAA+Ba,OAA/B,UAAX,EAA0DZ,GAA1D,EAA+DK,MAA/D,EAAuEE,MAAvE,EAA+EJ,WAA/E,EAA2FF,OAA3F,CAAR;AACD,GArBD,CAsBA,OAAOe,KAAP,EAAc;AACZ,QAAIA,UAAUZ,aAAd,EAA6B;AAC3B,YAAMY,KAAN;AACD;AACD;AACA;AACA;AACAC,YAAQD,KAAR,CAAcA,KAAd;AACA;AACA;AACA,QAAIf,QAAQS,SAAZ,EAAuB;AACrB,aAAO,EAAP;AACD;AACD;AACA,QAAIT,QAAQE,UAAZ,EAAwB;AACtB,aAAO;AACLe,cAAM,EADD;AAELf,oBAAY;AAFP,OAAP;AAID;AACD,WAAO,EAAP;AACD;;AAED,MAAID,MAAMiB,KAAN,CAAYC,MAAZ,KAAuB,CAA3B,EAA8B;AAC5B,QAAInB,QAAQE,UAAZ,EAAwB;AACtB,aAAO;AACLe,cAAM,EADD;AAELf;AAFK,OAAP;AAID;AACD,WAAO,EAAP;AACD;;AAnE2D,yCAqE3BD,MAAMmB,UArEqB;AAAA,MAqEpDC,OArEoD;AAAA,MAqE3CC,WArE2C;;AAuE5D,MAAMC,OAAQD,YAAYE,MAAZ,GAAqBH,QAAQG,MAA9B,GAAwC,CAArD;AACA,MAAMC,OAAQH,YAAYI,GAAZ,GAAkBL,QAAQK,GAA3B,GAAkC,CAA/C;;AAEA,MAAIR,QAAQ,EAAZ;;AAEAS,QAAMF,IAAN,EAAY,YAAM;AAChB,QAAMC,MAAM,EAAZ;AACAC,UAAMJ,IAAN,EAAY;AAAA,aAAMG,IAAIE,IAAJ,CAAS,EAAEC,OAAO,IAAT,EAAT,CAAN;AAAA,KAAZ;AACAX,UAAMU,IAAN,CAAWF,GAAX;AACD,GAJD;;AAMA,uBAAmBzB,MAAMiB,KAAzB,kHAAgC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAArBY,IAAqB;;AAC9B,QAAMJ,MAAMI,KAAKJ,GAAL,GAAWL,QAAQK,GAA/B;AACA,QAAMF,SAASM,KAAKN,MAAL,GAAcH,QAAQG,MAArC;AACA,QAAIN,MAAMQ,GAAN,CAAJ,EAAgB;AACdR,YAAMQ,GAAN,EAAWF,MAAX,IAAqBM,IAArB;AACD;AACF;;AAED,MAAIb,OAAOC,MAAMa,GAAN,CAAU;AAAA,WAAOL,IAAIK,GAAJ,CAAQ;AAAA,aAAQD,KAAKD,KAAb;AAAA,KAAR,CAAP;AAAA,GAAV,CAAX;AACAZ,SAAOxB,cAAcC,iBAAiBuB,IAAjB,CAAd,EAAsCjB,QAAQgC,MAA9C,CAAP;;AAEA;;AAEA,MAAIhC,QAAQE,UAAZ,EAAwB;AACtB,WAAO;AACLe,gBADK;AAELf;AAFK,KAAP;AAID;;AAED,SAAOe,IAAP;AACD;;AAED,SAASgB,mBAAT,CAA8Bf,KAA9B,EAAqC;AACnC,MAAMgB,aAAa,SAAbA,UAAa,CAACtC,CAAD,EAAIuC,CAAJ;AAAA,WAAUvC,IAAIuC,CAAd;AAAA,GAAnB;AACA,MAAMC,UAAUlB,MAAMa,GAAN,CAAU;AAAA,WAAQD,KAAKJ,GAAb;AAAA,GAAV,EAA4BW,IAA5B,CAAiCH,UAAjC,CAAhB;AACA,MAAMI,UAAUpB,MAAMa,GAAN,CAAU;AAAA,WAAQD,KAAKN,MAAb;AAAA,GAAV,EAA+Ba,IAA/B,CAAoCH,UAApC,CAAhB;AACA,MAAMK,SAASH,QAAQ,CAAR,CAAf;AACA,MAAMI,SAASJ,QAAQA,QAAQjB,MAAR,GAAiB,CAAzB,CAAf;AACA,MAAMsB,SAASH,QAAQ,CAAR,CAAf;AACA,MAAMI,SAASJ,QAAQA,QAAQnB,MAAR,GAAiB,CAAzB,CAAf;;AAEA,SAAO,CACL,EAAEO,KAAKa,MAAP,EAAef,QAAQiB,MAAvB,EADK,EAEL,EAAEf,KAAKc,MAAP,EAAehB,QAAQkB,MAAvB,EAFK,CAAP;AAID;;AAED,SAASf,KAAT,CAAegB,CAAf,EAAkBC,MAAlB,EAA0B;AACxB,MAAIC,IAAI,CAAR;AACA,SAAOA,IAAIF,CAAX,EAAc;AACZC;AACAC;AACD;AACF;;AAED,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;AACrBA,QAAMA,IAAIC,IAAJ,GAAWC,KAAX,CAAiB,EAAjB,CAAN;;AAEA,MAAIN,IAAI,CAAR;;AAEA,OAAK,IAAIE,IAAI,CAAb,EAAgBA,IAAIE,IAAI5B,MAAxB,EAAgC0B,GAAhC,EAAqC;AACnCF,SAAK,EAAL;AACAA,SAAK9C,QAAQqD,OAAR,CAAgBH,IAAIF,CAAJ,CAAhB,CAAL;AACD;;AAED,SAAOF,CAAP;AACD;;AAED,SAASQ,UAAT,CAAoBC,MAApB,EAA4B;AAC1BA,WAASA,OAAOH,KAAP,CAAa,OAAb,CAAT;AACA,SAAO;AACLvB,SAAS2B,SAASD,OAAO,CAAP,CAAT,CADJ;AAEL5B,YAASsB,SAASM,OAAO,CAAP,CAAT;AAFJ,GAAP;AAID;;AAED,SAASE,IAAT,CAAcC,QAAd,EAAwBtD,KAAxB,EAA+BF,GAA/B,EAAoCK,MAApC,EAA4CE,MAA5C,EAAoDJ,UAApD,EAAgEF,OAAhE,EAAyE;AACvE,MAAMoD,SAASD,WAAWI,SAASC,YAAT,CAAsB,GAAtB,CAAX,CAAf;;AAEA,MAAI3B,QAAQ9B,IAAI0D,MAAJ,CAAWxD,KAAX,EAAkBsD,QAAlB,EAA4B,KAA5B,EAAmC5D,UAAnC,EAA+C,CAA/C,CAAZ;AACA;AACAkC,UAAQA,SAASA,MAAM6B,WAAvB;;AAEA;AACA,UAAQH,SAASC,YAAT,CAAsB,GAAtB,CAAR;AACE,SAAK,GAAL;AACE3B,cAAQzB,OAAOiD,SAASxB,KAAT,CAAP,EAAwBmB,IAAxB,EAAR;AACA,UAAInB,UAAU,EAAd,EAAkB;AAChBA,gBAAQ8B,SAAR;AACD;AACD;;AAEF,SAAK,GAAL;AACE9B,cAAQA,UAAU,GAAV,GAAgB,IAAhB,GAAuB,KAA/B;AACA;;AAEF,SAAK,GAAL;AACA;AACA;AACA;AACE,UAAIA,UAAU8B,SAAd,EAAyB;AACvB;AACD;AACD9B,cAAQ+B,WAAW/B,KAAX,CAAR;AACA;AACA;AACA;AACA,UAAMgC,QAAQvD,OAAO+C,SAASE,SAASC,YAAT,CAAsB,GAAtB,KAA8B,CAAvC,CAAP,CAAd;AACA,UAAKK,MAAMC,YAAN,CAAmBC,EAAnB,IAAyB,EAAzB,IAA+BF,MAAMC,YAAN,CAAmBC,EAAnB,IAAyB,EAAzD,IACDF,MAAMC,YAAN,CAAmBC,EAAnB,IAAyB,EAAzB,IAA+BF,MAAMC,YAAN,CAAmBC,EAAnB,IAAyB,EADvD,IAED/D,QAAQgE,UAAR,IAAsBH,MAAMC,YAAN,CAAmBG,QAAnB,KAAgCjE,QAAQgE,UAF7D,IAGDhE,QAAQkE,eAAR,KAA4B,KAA5B,IAAqCL,MAAMC,YAAN,CAAmBG,QAAxD,IAAoEE,eAAeN,MAAMC,YAAN,CAAmBG,QAAlC,CAHvE,EAGqH;AACnHpC,gBAAQ,yBAAUA,KAAV,EAAiB3B,UAAjB,CAAR;AACD;AACD;AA9BJ;;AAiCA;AACA,MAAI2B,UAAU8B,SAAd,EAAyB;AACvB9B,YAAQ,IAAR;AACD;;AAED,SAAO;AACLH,SAAS0B,OAAO1B,GADX;AAELF,YAAS4B,OAAO5B,MAFX;AAGLK;AAHK,GAAP;AAKD;;AAEM,SAASpC,aAAT,CAAuBwB,IAAvB,EAA6Be,MAA7B,EAAwD;AAAA,MAAnBoC,QAAmB,uEAAR;AAAA,WAAKC,CAAL;AAAA,GAAQ;;AAC7D;AACA,MAAIrC,MAAJ,EAAY;AACV,QAAIsC,IAAI,CAAR;AACA,WAAOA,IAAIrD,KAAKE,MAAhB,EAAwB;AACtBa,aAAOsC,CAAP,IAAYA,CAAZ;AACAA;AACD;AACF;AACD;AACA,MAAIzB,IAAI5B,KAAKE,MAAL,GAAc,CAAtB;AACA,SAAO0B,KAAK,CAAZ,EAAe;AACb;AACA,QAAI0B,QAAQ,IAAZ;AACA,0BAAmBtD,KAAK4B,CAAL,CAAnB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjBf,IAAiB;;AAC1B,UAAIsC,SAAStC,IAAT,MAAmB,IAAvB,EAA6B;AAC3ByC,gBAAQ,KAAR;AACA;AACD;AACF;AACD;AACA,QAAIA,KAAJ,EAAW;AACTtD,WAAKuD,MAAL,CAAY3B,CAAZ,EAAe,CAAf;AACA,UAAIb,MAAJ,EAAY;AACVA,eAAOwC,MAAP,CAAc3B,CAAd,EAAiB,CAAjB;AACD;AACF;AACDA;AACD;AACD,SAAO5B,IAAP;AACD;;AAEM,SAASvB,gBAAT,CAA0BuB,IAA1B,EAAmD;AAAA,MAAnBmD,QAAmB,uEAAR;AAAA,WAAKC,CAAL;AAAA,GAAQ;;AACxD,MAAIxB,IAAI5B,KAAK,CAAL,EAAQE,MAAR,GAAiB,CAAzB;AACA,SAAO0B,KAAK,CAAZ,EAAe;AACb,QAAI0B,QAAQ,IAAZ;AACA,0BAAkBtD,IAAlB,yHAAwB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAbS,GAAa;;AACtB,UAAI0C,SAAS1C,IAAImB,CAAJ,CAAT,MAAqB,IAAzB,EAA+B;AAC7B0B,gBAAQ,KAAR;AACA;AACD;AACF;AACD,QAAIA,KAAJ,EAAW;AACT,UAAID,IAAI,CAAR;AACA,aAAOA,IAAIrD,KAAKE,MAAhB,EAAwB;AACtBF,aAAKqD,CAAL,EAAQE,MAAR,CAAe3B,CAAf,EAAkB,CAAlB;AACAyB;AACD;AACF;AACDzB;AACD;AACD,SAAO5B,IAAP;AACD;;AAED,SAASH,UAAT,CAAoB2D,OAApB,EAA6B1E,GAA7B,EAAkCK,MAAlC,EAA0CE,MAA1C,EAAkDJ,UAAlD,EAA8DF,OAA9D,EAAuE;AACrE,MAAMC,QAAQF,IAAI2E,cAAJ,CAAmBD,OAAnB,CAAd;;AAEA,MAAMvD,QAAQnB,IAAI0D,MAAJ,CAAWxD,KAAX,EAAkB,IAAlB,EAAwB,oCAAxB,EAA8DN,UAA9D,EAA0EoC,GAA1E,CAA8E;AAAA,WAAQuB,KAAKqB,IAAL,EAAW1E,KAAX,EAAkBF,GAAlB,EAAuBK,MAAvB,EAA+BE,MAA/B,EAAuCJ,UAAvC,EAAmDF,OAAnD,CAAR;AAAA,GAA9E,CAAd;;AAEA,MAAIkB,MAAMC,MAAN,KAAiB,CAArB,EAAwB;AACtB,WAAO,EAAED,YAAF,EAAP;AACD;;AAED,MAAIE,aAAarB,IAAI0D,MAAJ,CAAWxD,KAAX,EAAkB,IAAlB,EAAwB,oBAAxB,EAA8CN,UAA9C,EAA0D,CAA1D,CAAjB;;AAEA,MAAIyB,UAAJ,EAAgB;AACdA,iBAAaA,WAAWsC,WAAX,CAAuBT,KAAvB,CAA6B,GAA7B,EAAkClB,GAAlC,CAAsCoB,UAAtC,CAAb;AACA;AACA;AACA,QAAI/B,WAAWD,MAAX,KAAsB,CAA1B,EAA6B;AAC3BC,mBAAa,CAACA,WAAW,CAAX,CAAD,EAAgBA,WAAW,CAAX,CAAhB,CAAb;AACD;AACF,GAPD,MAOO;AACLA,iBAAaa,oBAAoBf,KAApB,CAAb;AACD;;AAED,SAAO,EAAEA,YAAF,EAASE,sBAAT,EAAP;AACD;;AAED,SAASf,WAAT,CAAqBoE,OAArB,EAA8B1E,GAA9B,EAAmC;AACjC,MAAI,CAAC0E,OAAL,EAAc;AACZ,WAAO,EAAP;AACD;AACD,MAAMG,UAAU7E,IAAI2E,cAAJ,CAAmBD,OAAnB,CAAhB;AACA,SAAO1E,IAAI0D,MAAJ,CAAWmB,OAAX,EAAoB,IAApB,EAA0B,QAA1B,EAAoCjF,UAApC,EACJoC,GADI,CACA;AAAA,WAAUhC,IAAI0D,MAAJ,CAAWmB,OAAX,EAAoBC,MAApB,EAA4B,8BAA5B,EAA4DlF,UAA5D,EAAwEoC,GAAxE,CAA4E;AAAA,aAAKsC,EAAEX,WAAP;AAAA,KAA5E,EAAgGoB,IAAhG,CAAqG,EAArG,CAAV;AAAA,GADA,CAAP;AAED;;AAED;AACA,SAASvE,WAAT,CAAqBkE,OAArB,EAA8B1E,GAA9B,EAAmC;AACjC,MAAI,CAAC0E,OAAL,EAAc;AACZ,WAAO,EAAP;AACD;AACD;AACA;AACA,MAAMM,MAAMhF,IAAI2E,cAAJ,CAAmBD,OAAnB,CAAZ;AACA,MAAMO,aAAajF,IAAI0D,MAAJ,CAAWsB,GAAX,EAAgB,IAAhB,EAAsB,oCAAtB,EAA4DpF,UAA5D,EAAwEoC,GAAxE,CAA4EkD,cAA5E,CAAnB;AACA,MAAMC,UAAUnF,IAAI0D,MAAJ,CAAWsB,GAAX,EAAgB,IAAhB,EAAsB,mCAAtB,EAA2DpF,UAA3D,EACboC,GADa,CACToD,sBADS,EAEbC,MAFa,CAEN,UAACC,OAAD,EAAUC,MAAV,EAAqB;AAC3BD,YAAQC,OAAOvB,EAAf,IAAqBuB,MAArB;AACA,WAAOD,OAAP;AACD,GALa,EAKX,EALW,CAAhB;;AAOA,SAAOtF,IAAI0D,MAAJ,CAAWsB,GAAX,EAAgB,IAAhB,EAAsB,+BAAtB,EAAuDpF,UAAvD,EAAmEoC,GAAnE,CAAuE,UAACwD,EAAD,EAAQ;AACpF,QAAIA,GAAGC,YAAH,CAAgB,MAAhB,CAAJ,EAA6B;AAC3B,0BACKR,WAAWO,GAAGE,IAAd,CADL,EAEKR,eAAeM,EAAf,EAAmBL,OAAnB,CAFL;AAID;AACD,WAAOD,eAAeM,EAAf,EAAmBL,OAAnB,CAAP;AACD,GARM,CAAP;AASD;;AAED,SAASC,sBAAT,CAAgCO,MAAhC,EAAwC;AACtC,SAAO;AACL3B,QAAI2B,OAAOlC,YAAP,CAAoB,UAApB,CADC;AAELS,cAAUyB,OAAOlC,YAAP,CAAoB,YAApB;AAFL,GAAP;AAID;;AAED;AACA,SAASyB,cAAT,CAAwBM,EAAxB,EAA4BL,OAA5B,EAAqC;AACnC,MAAMrB,QAAQ,EAAd;AACA,MAAI0B,GAAGC,YAAH,CAAgB,UAAhB,CAAJ,EAAiC;AAC/B,QAAMG,iBAAiBJ,GAAG/B,YAAH,CAAgB,UAAhB,CAAvB;AACA,QAAI0B,QAAQS,cAAR,CAAJ,EAA6B;AAC3B9B,YAAMC,YAAN,GAAqBoB,QAAQS,cAAR,CAArB;AACD,KAFD,MAEO;AACL9B,YAAMC,YAAN,GAAqB,EAAEC,IAAI4B,cAAN,EAArB;AACD;AACF;AACD,SAAO9B,KAAP;AACD;;AAED,SAASrD,eAAT,CAAyBiE,OAAzB,EAAkC1E,GAAlC,EAAuC;AACrC,MAAI,CAAC0E,OAAL,EAAc;AACZ,WAAO,EAAP;AACD;AACD,MAAMmB,OAAO7F,IAAI2E,cAAJ,CAAmBD,OAAnB,CAAb;AACA;AACA,MAAMoB,qBAAqB9F,IAAI0D,MAAJ,CAAWmC,IAAX,EAAiB,IAAjB,EAAuB,gBAAvB,EAAyCjG,UAAzC,EAAqD,CAArD,CAA3B;AACA,MAAI,CAACkG,kBAAL,EAAyB;AACvB,WAAO,EAAP;AACD;AACD,MAAM3F,aAAa,EAAnB;AACA;AACA,MAAI2F,mBAAmBrC,YAAnB,CAAgC,UAAhC,MAAgD,GAApD,EAAyD;AACvDtD,eAAW4F,SAAX,GAAuB,IAAvB;AACD;AACD;AACA,wBAAoB/F,IAAI0D,MAAJ,CAAWmC,IAAX,EAAiB,IAAjB,EAAuB,oBAAvB,EAA6CjG,UAA7C,CAApB,yHAA8E;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAnEM,KAAmE;;AAC5E,QAAIA,MAAMuD,YAAN,CAAmB,MAAnB,CAAJ,EAAgC;AAC9BtD,iBAAWQ,MAAX,GAAoBR,WAAWQ,MAAX,IAAqB,EAAzC;AACAR,iBAAWQ,MAAX,CAAkBT,MAAMuD,YAAN,CAAmB,SAAnB,CAAlB,IAAmDvD,MAAMuD,YAAN,CAAmB,MAAnB,CAAnD;AACD;AACF;AACD,SAAOtD,UAAP;AACD;;AAED,SAASiE,cAAT,CAAwBF,QAAxB,EAAkC;AAChC,MAAM8B,SAAS9B,SAAShB,KAAT,CAAe,KAAf,CAAf;AACA,wBAAoB8C,MAApB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjBC,KAAiB;;AAC1B,QAAI,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,EAAmB,MAAnB,EAA2B9C,OAA3B,CAAmC8C,KAAnC,IAA4C,CAAhD,EAAmD;AACjD,aAAO,KAAP;AACD;AACF;AACD,SAAO,IAAP;AACD;;AAED,SAASpF,UAAT,CAAoBF,MAApB,EAA4BuF,IAA5B,EAAkC;AAChC,MAAI,CAACvF,MAAL,EAAa;AACX;AACD;AACD,wBAAsBwF,OAAOC,IAAP,CAAYzF,MAAZ,CAAtB,yHAA2C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAhCC,OAAgC;;AACzC,QAAID,OAAOC,OAAP,MAAoBsF,IAAxB,EAA8B;AAC5B,aAAOtF,OAAP;AACD;AACF;AACD;AACA;AACA,MAAMoD,KAAKV,SAAS4C,IAAT,EAAe,EAAf,CAAX;AACA,MAAIG,OAAOrC,EAAP,MAAekC,IAAnB,EAAyB;AACvB,WAAOlC,EAAP;AACD;AACF;;AAED,SAASlD,wBAAT,CAAkCZ,KAAlC,EAAyCS,MAAzC,EAAiD;AAC/C,MAAI2F,aAAa,EAAjB;AACA,MAAI3F,MAAJ,EAAY;AACV2F,iBAAaH,OAAOC,IAAP,CAAYzF,MAAZ,EACV4F,MADU,CACH;AAAA,aAAM5F,OAAOqD,EAAP,CAAN;AAAA,KADG,EAEVqB,MAFU,CAEH,UAACmB,KAAD,EAAQxC,EAAR,EAAe;AACrBwC,YAAMxC,EAAN,IAAYrD,OAAOqD,EAAP,CAAZ;AACA,aAAOwC,KAAP;AACD,KALU,EAKR,EALQ,CAAb;AAMD;AACD,MAAMC,iBAAiBN,OAAOC,IAAP,CAAYE,UAAZ,EAAwBtE,GAAxB,CAA4B;AAAA,iBAAUsE,WAAWtC,EAAX,CAAV,YAA+BA,EAA/B;AAAA,GAA5B,EAAkEe,IAAlE,CAAuE,IAAvE,CAAvB;AACA,SAAO,IAAI2B,KAAJ,aAAmB,OAAOxG,KAAP,KAAiB,QAAjB,GAA4B,MAAMA,KAAlC,GAA0C,MAAMA,KAAN,GAAc,GAA3E,oCAA2GuG,iBAAiB,wBAAwBA,cAAxB,GAAyC,GAA1D,GAAgE,EAA3K,EAAP;AACD","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","
|
|
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}"]}
|
package/commonjs/xmlBrowser.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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'
|
package/modules/readXlsx.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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 (_) {
|
package/modules/readXlsx.js.map
CHANGED
|
@@ -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","
|
|
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}"]}
|
package/modules/xmlBrowser.js
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
// https://github.com/goto100/xpath/issues/85
|
|
3
3
|
export default {
|
|
4
4
|
createDocument: function createDocument(content) {
|
|
5
|
-
|
|
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,
|
|
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}"]}
|