read-excel-file 9.3.3 → 9.3.5
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 +9 -0
- package/README.md +32 -2
- package/browser/index.cjs +3 -0
- package/browser/index.d.ts +16 -0
- package/browser/index.js +4 -1
- package/bundle/read-excel-file.min.js +1 -1
- package/bundle/read-excel-file.min.js.map +1 -1
- package/commonjs/export/convertInputToNodeStream.js +0 -12
- package/commonjs/export/convertInputToNodeStream.js.map +1 -1
- package/commonjs/export/parseSheet.js +14 -7
- package/commonjs/export/parseSheet.js.map +1 -1
- package/commonjs/export/readSheetBrowser.js +3 -6
- package/commonjs/export/readSheetBrowser.js.map +1 -1
- package/commonjs/export/readSheetNode.js +3 -6
- package/commonjs/export/readSheetNode.js.map +1 -1
- package/commonjs/export/readSheetUniversal.js +2 -2
- package/commonjs/export/readSheetUniversal.js.map +1 -1
- package/commonjs/export/readSheetWebWorker.js +5 -5
- package/commonjs/export/readSheetWebWorker.js.map +1 -1
- package/commonjs/export/readXlsxFileBrowser.js +3 -6
- package/commonjs/export/readXlsxFileBrowser.js.map +1 -1
- package/commonjs/export/readXlsxFileNode.js +3 -6
- package/commonjs/export/readXlsxFileNode.js.map +1 -1
- package/commonjs/export/readXlsxFileUniversal.js +2 -2
- package/commonjs/export/readXlsxFileUniversal.js.map +1 -1
- package/commonjs/export/readXlsxFileWebWorker.js +5 -5
- package/commonjs/export/readXlsxFileWebWorker.js.map +1 -1
- package/commonjs/export/unpackXlsxFileBrowser.js +15 -4
- package/commonjs/export/unpackXlsxFileBrowser.js.map +1 -1
- package/commonjs/export/unpackXlsxFileBrowser.test.js.map +1 -0
- package/commonjs/export/unpackXlsxFileNode.js +32 -5
- package/commonjs/export/unpackXlsxFileNode.js.map +1 -1
- package/commonjs/export/unpackXlsxFileNode.test.js.map +1 -0
- package/commonjs/export/unpackXlsxFileUniversal.js +14 -3
- package/commonjs/export/unpackXlsxFileUniversal.js.map +1 -1
- package/commonjs/export/unpackXlsxFileUniversal.test.js.map +1 -0
- package/commonjs/parseSheetData/parseSheetData.js +9 -6
- package/commonjs/parseSheetData/parseSheetData.js.map +1 -1
- package/commonjs/saxen/parser.js +1 -1
- package/commonjs/saxen/parser.js.map +1 -1
- package/commonjs/utility/convertValuesFromUint8ArraysToStrings.js +100 -0
- package/commonjs/utility/convertValuesFromUint8ArraysToStrings.js.map +1 -0
- package/commonjs/xlsx/InvalidSpreadsheetError.js +55 -0
- package/commonjs/xlsx/InvalidSpreadsheetError.js.map +1 -0
- package/commonjs/xlsx/SheetNotFoundError.js +55 -0
- package/commonjs/xlsx/SheetNotFoundError.js.map +1 -0
- package/commonjs/xlsx/file/InputValidationStream.js +101 -0
- package/commonjs/xlsx/file/InputValidationStream.js.map +1 -0
- package/commonjs/xlsx/file/InputValidationStream.test.js.map +1 -0
- package/commonjs/xlsx/file/InvalidInputError.js +105 -0
- package/commonjs/xlsx/file/InvalidInputError.js.map +1 -0
- package/commonjs/xlsx/file/createFileTypeDetector.js +70 -0
- package/commonjs/xlsx/file/createFileTypeDetector.js.map +1 -0
- package/commonjs/xlsx/file/createFileTypeDetector.test.js.map +1 -0
- package/commonjs/xlsx/file/validateLeadingBytes.js +47 -0
- package/commonjs/xlsx/file/validateLeadingBytes.js.map +1 -0
- package/commonjs/xlsx/file/validateLeadingBytes.test.js.map +1 -0
- package/commonjs/xlsx/isDateFormat.js +32 -27
- package/commonjs/xlsx/isDateFormat.js.map +1 -1
- package/commonjs/xlsx/isDateFormatStyle.js +19 -21
- package/commonjs/xlsx/isDateFormatStyle.js.map +1 -1
- package/commonjs/xlsx/parseCell.js +252 -115
- package/commonjs/xlsx/parseCell.js.map +1 -1
- package/commonjs/xlsx/parseCellAddress.js +22 -18
- package/commonjs/xlsx/parseCellAddress.js.map +1 -1
- package/commonjs/xlsx/parseExcelDate.js +4 -124
- package/commonjs/xlsx/parseExcelDate.js.map +1 -1
- package/commonjs/xlsx/parseExcelDate.test.js.map +1 -1
- package/commonjs/xlsx/parseExcelTimestamp.js +139 -0
- package/commonjs/xlsx/parseExcelTimestamp.js.map +1 -0
- package/commonjs/xlsx/parseFilePaths.js +48 -47
- package/commonjs/xlsx/parseFilePaths.js.map +1 -1
- package/commonjs/xlsx/parseSharedStrings.js +91 -36
- package/commonjs/xlsx/parseSharedStrings.js.map +1 -1
- package/commonjs/xlsx/parseSheet.js +527 -69
- package/commonjs/xlsx/parseSheet.js.map +1 -1
- package/commonjs/xlsx/parseSpreadsheetContents.js +154 -83
- package/commonjs/xlsx/parseSpreadsheetContents.js.map +1 -1
- package/commonjs/xlsx/parseSpreadsheetInfo.js +60 -59
- package/commonjs/xlsx/parseSpreadsheetInfo.js.map +1 -1
- package/commonjs/xlsx/parseStyles.js +75 -75
- package/commonjs/xlsx/parseStyles.js.map +1 -1
- package/commonjs/xml/parseXml.js +112 -0
- package/commonjs/xml/parseXml.js.map +1 -0
- package/commonjs/xml/parseXml.test.js.map +1 -0
- package/commonjs/xml/parseXmlStream.js.map +1 -1
- package/commonjs/xml/parseXmlStream.sax.js +69 -28
- package/commonjs/xml/parseXmlStream.sax.js.map +1 -1
- package/commonjs/xml/parseXmlStream.saxen.js +66 -40
- package/commonjs/xml/parseXmlStream.saxen.js.map +1 -1
- package/commonjs/zip/UnzipError.js +55 -0
- package/commonjs/zip/UnzipError.js.map +1 -0
- package/commonjs/zip/unzipFromArrayBuffer.js +21 -1
- package/commonjs/zip/unzipFromArrayBuffer.js.map +1 -1
- package/commonjs/zip/unzipFromArrayBuffer.test.js.map +1 -0
- package/commonjs/zip/unzipFromStream.fflate.js +43 -35
- package/commonjs/zip/unzipFromStream.fflate.js.map +1 -1
- package/commonjs/zip/unzipFromStream.js +188 -6
- package/commonjs/zip/unzipFromStream.js.map +1 -1
- package/commonjs/zip/unzipFromStream.unzipper.js +19 -34
- package/commonjs/zip/unzipFromStream.unzipper.js.map +1 -1
- package/modules/export/convertInputToNodeStream.js +0 -12
- package/modules/export/convertInputToNodeStream.js.map +1 -1
- package/modules/export/parseSheet.js +13 -6
- package/modules/export/parseSheet.js.map +1 -1
- package/modules/export/readSheetBrowser.js +3 -5
- package/modules/export/readSheetBrowser.js.map +1 -1
- package/modules/export/readSheetNode.js +3 -5
- package/modules/export/readSheetNode.js.map +1 -1
- package/modules/export/readSheetUniversal.js +2 -2
- package/modules/export/readSheetUniversal.js.map +1 -1
- package/modules/export/readSheetWebWorker.js +7 -8
- package/modules/export/readSheetWebWorker.js.map +1 -1
- package/modules/export/readXlsxFileBrowser.js +3 -5
- package/modules/export/readXlsxFileBrowser.js.map +1 -1
- package/modules/export/readXlsxFileNode.js +3 -5
- package/modules/export/readXlsxFileNode.js.map +1 -1
- package/modules/export/readXlsxFileUniversal.js +2 -2
- package/modules/export/readXlsxFileUniversal.js.map +1 -1
- package/modules/export/readXlsxFileWebWorker.js +7 -8
- package/modules/export/readXlsxFileWebWorker.js.map +1 -1
- package/modules/export/unpackXlsxFileBrowser.js +15 -4
- package/modules/export/unpackXlsxFileBrowser.js.map +1 -1
- package/modules/export/unpackXlsxFileBrowser.test.js.map +1 -0
- package/modules/export/unpackXlsxFileNode.js +32 -5
- package/modules/export/unpackXlsxFileNode.js.map +1 -1
- package/modules/export/unpackXlsxFileNode.test.js.map +1 -0
- package/modules/export/unpackXlsxFileUniversal.js +14 -3
- package/modules/export/unpackXlsxFileUniversal.js.map +1 -1
- package/modules/export/unpackXlsxFileUniversal.test.js.map +1 -0
- package/modules/parseSheetData/parseSheetData.js +9 -6
- package/modules/parseSheetData/parseSheetData.js.map +1 -1
- package/modules/saxen/parser.js +1 -1
- package/modules/saxen/parser.js.map +1 -1
- package/modules/utility/convertValuesFromUint8ArraysToStrings.js +92 -0
- package/modules/utility/convertValuesFromUint8ArraysToStrings.js.map +1 -0
- package/modules/xlsx/InvalidSpreadsheetError.js +50 -0
- package/modules/xlsx/InvalidSpreadsheetError.js.map +1 -0
- package/modules/xlsx/SheetNotFoundError.js +50 -0
- package/modules/xlsx/SheetNotFoundError.js.map +1 -0
- package/modules/xlsx/file/InputValidationStream.js +96 -0
- package/modules/xlsx/file/InputValidationStream.js.map +1 -0
- package/modules/xlsx/file/InputValidationStream.test.js.map +1 -0
- package/modules/xlsx/file/InvalidInputError.js +100 -0
- package/modules/xlsx/file/InvalidInputError.js.map +1 -0
- package/modules/xlsx/file/createFileTypeDetector.js +63 -0
- package/modules/xlsx/file/createFileTypeDetector.js.map +1 -0
- package/modules/xlsx/file/createFileTypeDetector.test.js.map +1 -0
- package/modules/xlsx/file/validateLeadingBytes.js +37 -0
- package/modules/xlsx/file/validateLeadingBytes.js.map +1 -0
- package/modules/xlsx/file/validateLeadingBytes.test.js.map +1 -0
- package/modules/xlsx/isDateFormat.js +31 -27
- package/modules/xlsx/isDateFormat.js.map +1 -1
- package/modules/xlsx/isDateFormatStyle.js +18 -21
- package/modules/xlsx/isDateFormatStyle.js.map +1 -1
- package/modules/xlsx/parseCell.js +251 -111
- package/modules/xlsx/parseCell.js.map +1 -1
- package/modules/xlsx/parseCellAddress.js +21 -18
- package/modules/xlsx/parseCellAddress.js.map +1 -1
- package/modules/xlsx/parseExcelDate.js +4 -124
- package/modules/xlsx/parseExcelDate.js.map +1 -1
- package/modules/xlsx/parseExcelDate.test.js.map +1 -1
- package/modules/xlsx/parseExcelTimestamp.js +133 -0
- package/modules/xlsx/parseExcelTimestamp.js.map +1 -0
- package/modules/xlsx/parseFilePaths.js +48 -47
- package/modules/xlsx/parseFilePaths.js.map +1 -1
- package/modules/xlsx/parseSharedStrings.js +91 -37
- package/modules/xlsx/parseSharedStrings.js.map +1 -1
- package/modules/xlsx/parseSheet.js +526 -68
- package/modules/xlsx/parseSheet.js.map +1 -1
- package/modules/xlsx/parseSpreadsheetContents.js +153 -81
- package/modules/xlsx/parseSpreadsheetContents.js.map +1 -1
- package/modules/xlsx/parseSpreadsheetInfo.js +60 -59
- package/modules/xlsx/parseSpreadsheetInfo.js.map +1 -1
- package/modules/xlsx/parseStyles.js +75 -75
- package/modules/xlsx/parseStyles.js.map +1 -1
- package/modules/xml/parseXml.js +106 -0
- package/modules/xml/parseXml.js.map +1 -0
- package/modules/xml/parseXml.test.js.map +1 -0
- package/modules/xml/parseXmlStream.js +2 -0
- package/modules/xml/parseXmlStream.js.map +1 -1
- package/modules/xml/parseXmlStream.sax.js +69 -28
- package/modules/xml/parseXmlStream.sax.js.map +1 -1
- package/modules/xml/parseXmlStream.saxen.js +67 -40
- package/modules/xml/parseXmlStream.saxen.js.map +1 -1
- package/modules/zip/UnzipError.js +49 -0
- package/modules/zip/UnzipError.js.map +1 -0
- package/modules/zip/unzipFromArrayBuffer.js +21 -1
- package/modules/zip/unzipFromArrayBuffer.js.map +1 -1
- package/modules/zip/unzipFromArrayBuffer.test.js.map +1 -0
- package/modules/zip/unzipFromStream.fflate.js +41 -35
- package/modules/zip/unzipFromStream.fflate.js.map +1 -1
- package/modules/zip/unzipFromStream.js +124 -1
- package/modules/zip/unzipFromStream.js.map +1 -1
- package/modules/zip/unzipFromStream.unzipper.js +19 -35
- package/modules/zip/unzipFromStream.unzipper.js.map +1 -1
- package/node/index.cjs +3 -0
- package/node/index.d.ts +16 -0
- package/node/index.js +3 -0
- package/package.json +5 -3
- package/types/InvalidInputError.d.ts +16 -0
- package/types/InvalidSpreadsheetError.d.ts +4 -0
- package/types/SheetNotFoundError.d.ts +4 -0
- package/universal/index.cjs +3 -0
- package/universal/index.d.ts +16 -0
- package/universal/index.js +3 -0
- package/web-worker/index.cjs +3 -0
- package/web-worker/index.d.ts +16 -0
- package/web-worker/index.js +3 -0
- package/commonjs/export/convertValuesFromUint8ArraysToStrings.js +0 -23
- package/commonjs/export/convertValuesFromUint8ArraysToStrings.js.map +0 -1
- package/commonjs/xlsx/convertCellsToData2dArray.js +0 -84
- package/commonjs/xlsx/convertCellsToData2dArray.js.map +0 -1
- package/commonjs/xlsx/dropEmptyColumns.js +0 -40
- package/commonjs/xlsx/dropEmptyColumns.js.map +0 -1
- package/commonjs/xlsx/dropEmptyColumns.test.js.map +0 -1
- package/commonjs/xlsx/dropEmptyRows.js +0 -43
- package/commonjs/xlsx/dropEmptyRows.js.map +0 -1
- package/commonjs/xlsx/dropEmptyRows.test.js.map +0 -1
- package/commonjs/xlsx/parseCellValue.js +0 -186
- package/commonjs/xlsx/parseCellValue.js.map +0 -1
- package/commonjs/xlsx/parseNumber.js +0 -20
- package/commonjs/xlsx/parseNumber.js.map +0 -1
- package/commonjs/xlsx/parseSharedString.js +0 -64
- package/commonjs/xlsx/parseSharedString.js.map +0 -1
- package/commonjs/xlsx/parseSheetData.js +0 -68
- package/commonjs/xlsx/parseSheetData.js.map +0 -1
- package/commonjs/xlsx/reconstructSheetDimensionsFromSheetCells.js +0 -29
- package/commonjs/xlsx/reconstructSheetDimensionsFromSheetCells.js.map +0 -1
- package/commonjs/xml/parseXmlStream.saxen.code.js +0 -953
- package/commonjs/xml/parseXmlStream.saxen.code.js.map +0 -1
- package/commonjs/xml/parseXmlStream.test.js.map +0 -1
- package/modules/export/convertValuesFromUint8ArraysToStrings.js +0 -17
- package/modules/export/convertValuesFromUint8ArraysToStrings.js.map +0 -1
- package/modules/xlsx/convertCellsToData2dArray.js +0 -77
- package/modules/xlsx/convertCellsToData2dArray.js.map +0 -1
- package/modules/xlsx/dropEmptyColumns.js +0 -34
- package/modules/xlsx/dropEmptyColumns.js.map +0 -1
- package/modules/xlsx/dropEmptyColumns.test.js.map +0 -1
- package/modules/xlsx/dropEmptyRows.js +0 -37
- package/modules/xlsx/dropEmptyRows.js.map +0 -1
- package/modules/xlsx/dropEmptyRows.test.js.map +0 -1
- package/modules/xlsx/parseCellValue.js +0 -180
- package/modules/xlsx/parseCellValue.js.map +0 -1
- package/modules/xlsx/parseNumber.js +0 -14
- package/modules/xlsx/parseNumber.js.map +0 -1
- package/modules/xlsx/parseSharedString.js +0 -55
- package/modules/xlsx/parseSharedString.js.map +0 -1
- package/modules/xlsx/parseSheetData.js +0 -55
- package/modules/xlsx/parseSheetData.js.map +0 -1
- package/modules/xlsx/reconstructSheetDimensionsFromSheetCells.js +0 -23
- package/modules/xlsx/reconstructSheetDimensionsFromSheetCells.js.map +0 -1
- package/modules/xml/parseXmlStream.saxen.code.js +0 -947
- package/modules/xml/parseXmlStream.saxen.code.js.map +0 -1
- package/modules/xml/parseXmlStream.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseSpreadsheetContents.js","names":["_parseSpreadsheetInfo","_interopRequireDefault","require","_parseFilePaths","_parseStyles","_parseSharedStrings","_parseSheet","_parseNumber","_checkpoint","_interopRequireWildcard","_isPromise","_excluded","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","o","Symbol","iterator","constructor","_createForOfIteratorHelperLoose","allowArrayLike","it","next","bind","Array","isArray","_unsupportedIterableToArray","length","i","done","value","TypeError","minLen","_arrayLikeToArray","n","toString","slice","name","from","test","arr","len","arr2","_objectWithoutProperties","source","excluded","target","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","indexOf","propertyIsEnumerable","sourceKeys","keys","ownKeys","e","r","t","filter","enumerable","push","apply","_objectSpread","arguments","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","toPrimitive","undefined","res","Number","parseSpreadsheetContents","parseXmlStream","contents","options","checkpoint","readFiles","getXmlFilesAtFixedPaths","then","_ref","spreadsheetInfo","filePaths","getXmlFilesAtNonFixedPaths","_ref2","sharedStrings","styles","sheetRelationIdsToRead","sheets","map","sheet","getSheetRelationId","_","relationId","concat","getSheetDataXmlFiles","epoch1904","sheetsData","sheetRelationId","getSheetNameByRelationId","data","parseSpreadsheetContentsInWorker","createWorkerFunction","parseNumber","parseNumberDefault","_options","optionsJson","workerFn","addDependencies","latestCheckpointTimestamp","isPromise","callOnce","_iterator","_step","_sheet","Error","_ref3","join","_iterator2","_step2","parse","parseFilePaths","parseSpreadsheetInfo","_ref4","parseSharedStrings","fallback","parseStyles","sheetDataParserParameters","includes","reduce","filesInfo","content","parseSheet","results","_loop","filePath","_Object$keys","_i","fileInfo","promises","_loop2","_Object$keys2","_i2","result","Promise","all"],"sources":["../../source/xlsx/parseSpreadsheetContents.js"],"sourcesContent":["import parseSpreadsheetInfo from './parseSpreadsheetInfo.js'\r\nimport parseFilePaths from './parseFilePaths.js'\r\nimport parseStyles from './parseStyles.js'\r\nimport parseSharedStrings from './parseSharedStrings.js'\r\nimport parseSheet from './parseSheet.js'\r\nimport parseNumberDefault from './parseNumber.js'\r\n\r\nimport checkpoint, { latestCheckpointTimestamp } from '../utility/checkpoint.js'\r\nimport isPromise from '../utility/isPromise.js'\r\n\r\n// For an introduction in reading `.xlsx` files see \"The minimum viable XLSX reader\":\r\n// https://www.brendanlong.com/the-minimum-viable-xlsx-reader.html\r\n\r\n/**\r\n * Reads data from an `.xlsx` file.\r\n * @param {function} parseXmlStream — SAX XML parser.\r\n * @param {Record<string,string>} contents - A map of `.xml` files inside the `.xlsx` file (which itself is just a zipped directory).\r\n * @param {object} [options]\r\n * @return {Promise<Sheet[]>}\r\n */\r\nfunction parseSpreadsheetContents(parseXmlStream, contents, options = {}) {\r\n // Because of how `.xlsx` file contents are defined in the specification,\r\n // it will have to be read in 3 passes:\r\n // * First pass — read the actual file paths\r\n // * Second pass — read \"shared strings\" and \"styles\"\r\n // * Thirs pass — read the sheets data\r\n\r\n checkpoint('parse spreadsheet info and file paths')\r\n\r\n // Get spreadsheet info and the paths to files.\r\n return readFiles(\r\n getXmlFilesAtFixedPaths(),\r\n contents,\r\n parseXmlStream\r\n ).then(({ spreadsheetInfo, filePaths }) => {\r\n checkpoint('parse \"shared strings\" and \"styles\"')\r\n\r\n // Parse \"shared strings\" and \"styles\".\r\n return readFiles(\r\n getXmlFilesAtNonFixedPaths(filePaths),\r\n contents,\r\n parseXmlStream\r\n ).then(({ sharedStrings, styles }) => {\r\n const sheetRelationIdsToRead = options.sheets\r\n ? options.sheets.map(sheet => getSheetRelationId(sheet, spreadsheetInfo.sheets))\r\n : spreadsheetInfo.sheets.map(_ => _.relationId)\r\n\r\n checkpoint(`parse sheet${sheetRelationIdsToRead.length === 1 ? '' : 's'} data`)\r\n\r\n // Parse sheets data.\r\n return readFiles(\r\n getSheetDataXmlFiles(filePaths, sheetRelationIdsToRead, {\r\n sharedStrings,\r\n styles,\r\n epoch1904: spreadsheetInfo.epoch1904,\r\n options\r\n }),\r\n contents,\r\n parseXmlStream\r\n ).then((sheetsData) => {\r\n checkpoint('end')\r\n // Return sheets data.\r\n return sheetRelationIdsToRead.map((sheetRelationId) => ({\r\n sheet: getSheetNameByRelationId(sheetRelationId, spreadsheetInfo.sheets),\r\n data: sheetsData[sheetRelationId]\r\n }))\r\n })\r\n })\r\n })\r\n}\r\n\r\n/**\r\n * Reads data from an `.xlsx` file in a worker.\r\n * @param {function} [createWorkerFunction] — Creates a worker function.\r\n * @param {function} parseXmlStream — SAX XML parser.\r\n * @param {Record<string,string>} contents - A map of `.xml` files inside the `.xlsx` file (which itself is just a zipped directory).\r\n * @param {object} [options]\r\n * @return {Promise<Sheet[]>}\r\n */\r\nexport default function parseSpreadsheetContentsInWorker(createWorkerFunction, parseXmlStream, contents, options) {\r\n // Assign the default `parseNumber()` function in the `options`.\r\n // The reason is that the worker code requires it to be non-`undefined`.\r\n // Otherwise, it would throw \"parseNumber is not defined\".\r\n if (!(options && options.parseNumber)) {\r\n options = {\r\n ...options,\r\n parseNumber: parseNumberDefault\r\n }\r\n }\r\n\r\n // Using a worker requires specifying all the top-level variables or functions that it uses.\r\n // Currently, that list looks a little bit too long so for now workers aren't used for parsing sheet data.\r\n // See the comment in `createWorkerFunction()` call for more details.\r\n // createWorkerFunction = undefined\r\n\r\n // If the environment doesn't support \"workers\", parse spreadsheet contents \"synchronously\".\r\n // This will \"block\" the main thread while parsing.\r\n if (!createWorkerFunction) {\r\n return parseSpreadsheetContents(parseXmlStream, contents, options)\r\n }\r\n\r\n // Any functions have to be removed from the `options` in order for them to be \"serializable\"\r\n // before sending them to the worker thread.\r\n const { parseNumber, ...optionsJson } = options\r\n\r\n // Create a worker.\r\n const workerFn = createWorkerFunction(\r\n (data) => {\r\n // Reconstruct the `options`.\r\n const options = {\r\n ...data.optionsJson,\r\n parseNumber\r\n }\r\n // Parse sheet data from the `.xml` files.\r\n return parseSpreadsheetContents(parseXmlStream, data.contents, options)\r\n }\r\n )\r\n\r\n workerFn.addDependencies(\r\n // Any \"outside\" dependencies that're referenced in the function (below).\r\n () => [\r\n parseXmlStream,\r\n parseNumber,\r\n parseSpreadsheetContents,\r\n getSheetRelationId,\r\n getSheetNameByRelationId,\r\n getXmlFilesAtFixedPaths,\r\n getXmlFilesAtNonFixedPaths,\r\n getSheetDataXmlFiles,\r\n readFiles,\r\n checkpoint,\r\n latestCheckpointTimestamp,\r\n isPromise,\r\n // parseSheet,\r\n //\r\n // This is not the full list by any means. There's more. Quite a lot more of them.\r\n // It started looking a bit too much so I stopped adding the dependencies here.\r\n // Now I understand why `fflate`'s source code is all written in a single\r\n // multi-thousand-line `index.ts` file. The thing is, once one starts splitting\r\n // the code into modules, they'd have to manually export any top-level variables\r\n // or functions from those modules and import them here in order to specify them\r\n // in the list of dependencies. And even if doing so for every top-level variable\r\n // or function in every imported module doesn't seem like an impossible task,\r\n // imagine someone refactoring the code later and extracting new top-level\r\n // variables or functions. Without 100% code coverage requirement, it won't be caught\r\n // at build time and can only be caught in production, which isn't ideal to say the least.\r\n // So it seems like users of this package will have to just deal with the \"blocking\"\r\n // nature of the sheet data parser, because I won't follow into `fflate`'s steps\r\n // and rewrite this package as a single `index.js` file.\r\n // Users of this package will have to manually put their code in a worker\r\n // in case they'd prefer it to run in a separate thread to prevent \"blocking\"\r\n // the main thread when parsing sheet data.\r\n ]\r\n )\r\n\r\n // Post a message with some data to the worker\r\n // so that it starts processing the data\r\n // and later posts a message back to the main thread\r\n // with the result of the calculation.\r\n return workerFn.callOnce({ optionsJson, contents }) // (optional) add `transferList` argument.\r\n}\r\n\r\nfunction getSheetRelationId(sheet, sheets) {\r\n if (typeof sheet === 'string') {\r\n for (const _sheet of sheets) {\r\n if (_sheet.name === sheet) {\r\n return _sheet.relationId\r\n }\r\n }\r\n\t\tthrow new Error(`Sheet \"${sheet}\" not found. Available sheets: ${sheets.map(({ name }) => `\"${name}\"`).join(', ')}`)\r\n } else {\r\n\t\tif (sheet <= sheets.length) {\r\n return sheets[sheet - 1].relationId\r\n }\r\n throw new Error(`Sheet number out of bounds: ${sheet}. Available sheets count: ${sheets.length}`)\r\n }\r\n}\r\n\r\nfunction getSheetNameByRelationId(sheetRelationId, sheets) {\r\n for (const sheet of sheets) {\r\n if (sheet.relationId === sheetRelationId) {\r\n return sheet.name\r\n }\r\n }\r\n throw new Error(`Sheet relation ID not found: ${sheetRelationId}`)\r\n}\r\n\r\nfunction getXmlFilesAtFixedPaths() {\r\n return {\r\n // Read the paths to certain files inside the `.xlsx` file, which is itself just a `.zip` archive.\r\n // These paths aren't standardized between different spreadsheet editors.\r\n // https://github.com/tidyverse/readxl/issues/104\r\n 'xl/_rels/workbook.xml.rels': {\r\n name: 'filePaths',\r\n parse: parseFilePaths\r\n },\r\n\r\n // General info on the spreadsheet.\r\n 'xl/workbook.xml': {\r\n name: 'spreadsheetInfo',\r\n parse: parseSpreadsheetInfo\r\n }\r\n }\r\n}\r\n\r\nfunction getXmlFilesAtNonFixedPaths(filePaths) {\r\n return {\r\n // The usual file path for \"shared strings\" is \"xl/sharedStrings.xml\".\r\n [filePaths.sharedStrings || 'xl/sharedStrings.xml']: {\r\n name: 'sharedStrings',\r\n // `parseSharedStrings()` returns a `Promise`.\r\n parse: parseSharedStrings,\r\n // It seems that \"sharedStrings.xml\" is not required to exist.\r\n // For example, that could be the case when a spreadsheet doesn't contain any strings.\r\n // https://github.com/catamphetamine/read-excel-file/issues/85\r\n fallback: []\r\n },\r\n\r\n // The usual file path for \"styles\" is \"xl/styles.xml\".\r\n [filePaths.styles || 'xl/styles.xml']: {\r\n name: 'styles',\r\n parse: parseStyles,\r\n fallback: {}\r\n }\r\n }\r\n}\r\n\r\n// Returns the list of sheet data `.xml` files.\r\nfunction getSheetDataXmlFiles(filePaths, sheetRelationIdsToRead, sheetDataParserParameters) {\r\n return Object.keys(filePaths.sheets)\r\n .filter((sheetRelationId) => sheetRelationIdsToRead.includes(sheetRelationId))\r\n .reduce((filesInfo, sheetRelationId) => ({\r\n ...filesInfo,\r\n [filePaths.sheets[sheetRelationId]]: {\r\n name: sheetRelationId,\r\n // `parseSheet()` returns a `Promise`.\r\n parse: (content, parseXmlStream) => parseSheet(content, parseXmlStream, sheetDataParserParameters)\r\n }\r\n }), {})\r\n}\r\n\r\n// In case of converting `.zip` file reader from a \"read-and-return\" one to a \"streaming\" one,\r\n// this function could be modified to process the files as they come rather than all-at-once.\r\n\r\n// Reads files from inside an `.xlsx` archive by file paths.\r\n//\r\n// In case of converting `.zip` file reader from a \"read-and-return\" one to a \"streaming\" one,\r\n// this function could be modified to process the files as they come rather than all-at-once.\r\n//\r\n// But there's a catch: inside an `.xlsx` file, some file paths are not fixed\r\n// and are instead defined in \"xl/_rels/workbook.xml.rels\" file,\r\n// which presents a \"chicken and an egg\" dilemma: how could one possibly\r\n// read an `.xlsx` file in one go when the order of the files inside it isn't fixed\r\n// and could be random. Most likely, in the majority of cases, \"xl/_rels/workbook.xml.rels\"\r\n// file is gonna be one of the first in a given `.xlsx` archive, but still it's not guaranteed.\r\n// A solution would be reading an `.xlsx` file in two passes: one pass would be just to read\r\n// the \"xl/_rels/workbook.xml.rels\" and ignore decompressing anything else,\r\n// and then the second pass would be to read all other files whose paths are now known.\r\n//\r\n// Returns:\r\n// * If none of the `parse()` functions returned a `Promise`, it returns a map of files' contents.\r\n// * If any of the `parse()` functions returned a `Promise`, it returns a `Promise` that resolves to a map of files' contents.\r\n//\r\nfunction readFiles(filesInfo, contents, parseXmlStream) {\r\n // Get files' contents.\r\n const results = {}\r\n for (const filePath of Object.keys(filesInfo)) {\r\n const fileInfo = filesInfo[filePath]\r\n results[fileInfo.name] = contents[filePath] === undefined\r\n ? (\r\n fileInfo.fallback === undefined\r\n ? (() => { throw new Error(`\"${filePath}\" file not found inside the \\`.xlsx\\` file`) })()\r\n : fileInfo.fallback\r\n )\r\n : fileInfo.parse(contents[filePath], parseXmlStream)\r\n }\r\n // Resolve any `Promise`s.\r\n const promises = []\r\n for (const name of Object.keys(results)) {\r\n if (isPromise(results[name])) {\r\n promises.push(results[name].then((result) => {\r\n results[name] = result\r\n }))\r\n }\r\n }\r\n if (promises.length > 0) {\r\n return Promise.all(promises).then(() => results)\r\n }\r\n return results\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parseSpreadsheetContents.js","names":["_parseSpreadsheetInfo","_interopRequireDefault","require","_parseFilePaths","_parseStyles","_parseSharedStrings","_parseSheet","_convertValuesFromUint8ArraysToStrings","_checkpoint","_isPromise","_InvalidSpreadsheetError","_SheetNotFoundError","obj","__esModule","_typeof","o","Symbol","iterator","constructor","prototype","_createForOfIteratorHelperLoose","allowArrayLike","it","call","next","bind","Array","isArray","_unsupportedIterableToArray","length","i","done","value","TypeError","minLen","_arrayLikeToArray","n","Object","toString","slice","name","from","test","arr","len","arr2","ownKeys","e","r","t","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","key","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","toPrimitive","undefined","res","Number","CAN_USE_WORKER","parseSpreadsheetContents","parseXml","contents_","options","contents","convertValuesFromUint8ArraysToStrings","checkpoint","readFiles","getXmlFilesAtFixedPaths","then","_ref","spreadsheetInfo","filePaths","getXmlFilesAtNonFixedPaths","_ref2","sharedStrings","styles","sheetRelationIdsToRead","sheets","map","sheet","getSheetRelationId","_","relationId","concat","getSheetDataXmlFiles","epoch1904","sheetsData","sheetRelationId","getSheetNameByRelationId","data","parseSpreadsheetContentsInWorker","createWorkerFunction","parseNumber","_iterator","_step","_sheet","SheetNotFoundError","_ref3","join","_iterator2","_step2","Error","parse","parseFilePaths","parseSpreadsheetInfo","_ref4","parseSharedStrings","fallback","parseStyles","sheetDataParserParameters","includes","reduce","filesInfo","content","parseSheet","results","_loop","filePath","_Object$keys","_i","fileInfo","InvalidSpreadsheetError","promises","_loop2","_Object$keys2","_i2","isPromise","result","Promise","all"],"sources":["../../source/xlsx/parseSpreadsheetContents.js"],"sourcesContent":["import parseSpreadsheetInfo from './parseSpreadsheetInfo.js'\r\nimport parseFilePaths from './parseFilePaths.js'\r\nimport parseStyles from './parseStyles.js'\r\nimport parseSharedStrings from './parseSharedStrings.js'\r\nimport parseSheet from './parseSheet.js'\r\n\r\nimport convertValuesFromUint8ArraysToStrings from '../utility/convertValuesFromUint8ArraysToStrings.js'\r\nimport checkpoint from '../utility/checkpoint.js'\r\nimport isPromise from '../utility/isPromise.js'\r\n\r\nimport InvalidSpreadsheetError from './InvalidSpreadsheetError.js'\r\nimport SheetNotFoundError from './SheetNotFoundError.js'\r\n\r\n// These exports are only used in `worker-f` dependencies:\r\n// import parseXmlStream '../xml/parseXmlStream.js'\r\n// import { decodeUtf8String, strFromU8 } from '../utility/convertValuesFromUint8ArraysToStrings.js'\r\n// import parseExcelDate from './parseExcelDate.js'\r\n// import parseExcelTimestamp from './parseExcelTimestamp.js'\r\n// import isDateFormat, { DATE_FORMAT_SPECIFIC_LOCALE_PREFIX, DATE_FORMAT_ALLOW_ANY_OTHER_TEXT_SUFFIX, IS_DATE_FORMAT_CACHE, DATE_TEMPLATE_TOKENS } from './isDateFormat.js'\r\n// import isDateFormatStyle, { BUILT_IN_DATE_FORMAT_IDS } from './isDateFormatStyle.js'\r\n// import parseCell, { EMPTY_CELL } from './parseCell.js'\r\n// import parseCellAddress, { LETTERS } from './parseCellAddress.js'\r\n// import convertArrayOfCellsTo2dArrayOfValues from './convertArrayOfCellsTo2dArrayOfValues.js'\r\n// import dropEmptyTrailingRows from './dropEmptyTrailingRows.js'\r\n// import dropEmptyTrailingColumns from './dropEmptyTrailingColumns.js'\r\n// import { latestCheckpointTimestamp } from '../utility/checkpoint.js'\r\n\r\n// `worker-f` is not used because passing cells data from the worker thread\r\n// to the main thread was a lengthy-enough operation. For example, when running\r\n// the benchmark, the output latency was: `10` ms on \"1mb.xlsx\", `70` ms on \"10mb.xlsx\"\r\n// and `500` ms on \"50mb.xlsx\", meaning that it would still have issues with\r\n// blocking the main thread when passing the result back to it from the worker thread,\r\n// negating the effect of using `worker-f` in the first place.\r\n//\r\n// As a way to work around the slow \"structured clone\" algorithm for input/output data,\r\n// I played around with implementing a `serializeCells()` function that would serialize\r\n// sheet data into an `ArrayBuffer` in order for it to be \"transferred\" instantly\r\n// to the main thread, but this serialization itself was even slower, meaning that it would\r\n// still block the main thread when deserializing that `ArrayBuffer` back to sheet data,\r\n// so the entire idea of using `worker-f` was eventually dismissed.\r\n//\r\n// Instead of that, I submitted a PR in `saxen` repo that added \"streaming mode\" to the XML parser.\r\n// https://github.com/nikku/saxen/pull/27\r\n// That PR got merged, so a simple alternative now is to parse sheet data chunk-by-chunk,\r\n// spacing it out with `setTimeout(0)` interrupts.\r\n//\r\n// In case of re-enabling `worker-f`, uncomment the relevant code above and below,\r\n// and also replace `import { Parser } from 'saxen'` with an copy-paste of `saxen`'s code\r\n// in `parseXmlStream.saxen.js`, otherwise it'll throw: \"Parser is not defined\".\r\n// Also, in `convertValuesFromUint8ArraysToStrings.js`, replace `import { strFromU8 } from 'fflate'`\r\n// with a copy-paste of the `strFromU8()` function code from `fflate`'s repo,\r\n// because otherwise it'd throw: \"td is not defined\".\r\n//\r\nconst CAN_USE_WORKER = false\r\n\r\n/**\r\n * Reads data from an `.xlsx` file.\r\n * @param {function} parseXml — SAX XML parser.\r\n * @param {Record<string,Uint8Array>} contents - A map of `.xml` files inside the `.xlsx` file (which itself is just a zipped directory).\r\n * @param {object} [options]\r\n * @return {Promise<Sheet[]>}\r\n */\r\nfunction parseSpreadsheetContents(parseXml, contents_, options = {}) {\r\n // For an introduction in reading `.xlsx` files see \"The minimum viable XLSX reader\":\r\n // https://www.brendanlong.com/the-minimum-viable-xlsx-reader.html\r\n\r\n // Convert the values in `contents_` from `Uint8Array`s to `string`s.\r\n //\r\n // This function is a bit of a bottleneck on large `.xlsx` files.\r\n // For example, when running the benchmark, the time of calling this function is:\r\n //\r\n // * \"1mb.xlsx\" — 2\r\n // * \"10mb.xlsx\" — 7\r\n // * \"50mb.xlsx\" — 35\r\n //\r\n // When running this code in a worker, it's no longer a \"bottleneck\"\r\n // because in that case it doesn't block the main thread.\r\n //\r\n const contents = convertValuesFromUint8ArraysToStrings(contents_)\r\n\r\n // Because of how `.xlsx` file contents are defined in the specification,\r\n // it will have to be read in 3 passes:\r\n // * First pass — read the actual file paths\r\n // * Second pass — read \"shared strings\" and \"styles\"\r\n // * Thirs pass — read the sheets data\r\n\r\n checkpoint('parse spreadsheet info and file paths')\r\n\r\n // Get spreadsheet info and the paths to files.\r\n return readFiles(\r\n getXmlFilesAtFixedPaths(),\r\n contents,\r\n parseXml\r\n ).then(({ spreadsheetInfo, filePaths }) => {\r\n checkpoint('parse \"shared strings\" and \"styles\"')\r\n\r\n // Parse \"shared strings\" and \"styles\".\r\n return readFiles(\r\n getXmlFilesAtNonFixedPaths(filePaths),\r\n contents,\r\n parseXml\r\n ).then(({ sharedStrings, styles }) => {\r\n const sheetRelationIdsToRead = options.sheets\r\n ? options.sheets.map(sheet => getSheetRelationId(sheet, spreadsheetInfo.sheets))\r\n : spreadsheetInfo.sheets.map(_ => _.relationId)\r\n\r\n checkpoint(`parse sheet${sheetRelationIdsToRead.length === 1 ? '' : 's'} data`)\r\n\r\n // Parse sheets data.\r\n return readFiles(\r\n getSheetDataXmlFiles(filePaths, sheetRelationIdsToRead, {\r\n sharedStrings,\r\n styles,\r\n epoch1904: spreadsheetInfo.epoch1904,\r\n options\r\n }),\r\n contents,\r\n parseXml\r\n ).then((sheetsData) => {\r\n checkpoint('end')\r\n // Return sheets data.\r\n return sheetRelationIdsToRead.map((sheetRelationId) => ({\r\n sheet: getSheetNameByRelationId(sheetRelationId, spreadsheetInfo.sheets),\r\n data: sheetsData[sheetRelationId]\r\n }))\r\n })\r\n })\r\n })\r\n}\r\n\r\n/**\r\n * Reads data from an `.xlsx` file in a worker.\r\n * @param {function} [createWorkerFunction] — Creates a worker function.\r\n * @param {function} parseXml — SAX XML parser.\r\n * @param {Record<string,Uint8Array>} contents - A map of `.xml` files inside the `.xlsx` file (which itself is just a zipped directory).\r\n * @param {object} [options]\r\n * @return {Promise<Sheet[]>}\r\n */\r\nexport default function parseSpreadsheetContentsInWorker(createWorkerFunction, parseXml, contents, options) {\r\n // Assign a default value of `null` to `parseNumber()` function in the `options`.\r\n // The reason is that the worker code requires it to be non-`undefined`.\r\n // Otherwise, it would throw \"parseNumber is not defined\".\r\n if (!(options && options.parseNumber)) {\r\n options = {\r\n ...options,\r\n parseNumber: null\r\n }\r\n }\r\n\r\n // If the environment doesn't support \"workers\", parse spreadsheet contents \"synchronously\".\r\n // This will \"block\" the main thread while parsing.\r\n if (!createWorkerFunction || !CAN_USE_WORKER) {\r\n return parseSpreadsheetContents(parseXml, contents, options)\r\n }\r\n\r\n // // Any functions have to be removed from the `options` in order for them to be \"serializable\"\r\n // // before sending them to the worker thread.\r\n // const { parseNumber: parseNumber_, ...optionsJson } = options\r\n //\r\n // // Create a worker from a function.\r\n // const workerFn = createWorkerFunction(\r\n // (data) => {\r\n // // Reconstruct the `options`.\r\n // const options = {\r\n // ...data.optionsJson,\r\n // parseNumber: parseNumber_\r\n // }\r\n // // Parse sheet data from the `.xml` files.\r\n // return parseSpreadsheetContents(parseXml, data.contents, options)\r\n // }\r\n // )\r\n //\r\n // workerFn.addDependencies(\r\n // // Any \"outside\" dependencies that're referenced from the function body.\r\n // () => [\r\n // parseXml,\r\n // parseXmlStream,\r\n // parseNumber,\r\n // parseNumber_,\r\n // parseExcelDate,\r\n // parseExcelTimestamp,\r\n // parseCell,\r\n // EMPTY_CELL,\r\n // parseCellAddress,\r\n // LETTERS,\r\n // convertArrayOfCellsTo2dArrayOfValues,\r\n // convertValuesFromUint8ArraysToStrings,\r\n // strFromU8,\r\n // decodeUtf8String,\r\n // dropEmptyTrailingRows,\r\n // dropEmptyTrailingColumns,\r\n // isDateFormat,\r\n // DATE_FORMAT_SPECIFIC_LOCALE_PREFIX,\r\n // DATE_FORMAT_ALLOW_ANY_OTHER_TEXT_SUFFIX,\r\n // IS_DATE_FORMAT_CACHE, DATE_TEMPLATE_TOKENS,\r\n // isDateFormatStyle,\r\n // BUILT_IN_DATE_FORMAT_IDS,\r\n // parseSpreadsheetContents,\r\n // parseFilePaths,\r\n // parseSpreadsheetInfo,\r\n // parseSharedStrings,\r\n // parseStyles,\r\n // parseSheet,\r\n // getSheetRelationId,\r\n // getSheetNameByRelationId,\r\n // getXmlFilesAtFixedPaths,\r\n // getXmlFilesAtNonFixedPaths,\r\n // getSheetDataXmlFiles,\r\n // readFiles,\r\n // checkpoint,\r\n // latestCheckpointTimestamp,\r\n // isPromise\r\n // ]\r\n // )\r\n //\r\n // workerFn.inputTransferList(({ optionsJson, contents }) => Object.keys(contents).map(key => contents[key].buffer))\r\n //\r\n // return workerFn.callOnce({ optionsJson, contents }).then((result) => {\r\n // console.log('~ Input latency', workerFn.inputLatency)\r\n // console.log('~ Output latency', workerFn.outputLatency)\r\n // return result\r\n // })\r\n}\r\n\r\nfunction getSheetRelationId(sheet, sheets) {\r\n if (typeof sheet === 'string') {\r\n for (const _sheet of sheets) {\r\n if (_sheet.name === sheet) {\r\n return _sheet.relationId\r\n }\r\n }\r\n\t\tthrow new SheetNotFoundError(`Sheet \"${sheet}\" not found. Available sheets: ${sheets.map(({ name }) => `\"${name}\"`).join(', ')}`)\r\n } else {\r\n\t\tif (sheet <= sheets.length) {\r\n return sheets[sheet - 1].relationId\r\n }\r\n throw new SheetNotFoundError(`Sheet number out of bounds: ${sheet}. Available sheets count: ${sheets.length}`)\r\n }\r\n}\r\n\r\nfunction getSheetNameByRelationId(sheetRelationId, sheets) {\r\n for (const sheet of sheets) {\r\n if (sheet.relationId === sheetRelationId) {\r\n return sheet.name\r\n }\r\n }\r\n // The only way of getting `sheetRelationId` here is from the `sheets`,\r\n // so this error is not technically possible. And if it is thrown\r\n // then it means that there's a bug in the code because it's not\r\n // supposed to get `sheetRelationId` from anywhere other than the `sheets`.\r\n throw new Error(`Sheet relation ID not found: ${sheetRelationId}`)\r\n}\r\n\r\nfunction getXmlFilesAtFixedPaths() {\r\n return {\r\n // Read the paths to certain files inside the `.xlsx` file, which is itself just a `.zip` archive.\r\n // These paths aren't standardized between different spreadsheet editors.\r\n // https://github.com/tidyverse/readxl/issues/104\r\n 'xl/_rels/workbook.xml.rels': {\r\n name: 'filePaths',\r\n parse: parseFilePaths\r\n },\r\n\r\n // General info on the spreadsheet.\r\n 'xl/workbook.xml': {\r\n name: 'spreadsheetInfo',\r\n parse: parseSpreadsheetInfo\r\n }\r\n }\r\n}\r\n\r\nfunction getXmlFilesAtNonFixedPaths(filePaths) {\r\n return {\r\n // The usual file path for \"shared strings\" is \"xl/sharedStrings.xml\".\r\n [filePaths.sharedStrings || 'xl/sharedStrings.xml']: {\r\n name: 'sharedStrings',\r\n // `parseSharedStrings()` returns a `Promise`.\r\n parse: parseSharedStrings,\r\n // It seems that \"sharedStrings.xml\" is not required to exist.\r\n // For example, that could be the case when a spreadsheet doesn't contain any strings.\r\n // https://github.com/catamphetamine/read-excel-file/issues/85\r\n fallback: []\r\n },\r\n\r\n // The usual file path for \"styles\" is \"xl/styles.xml\".\r\n [filePaths.styles || 'xl/styles.xml']: {\r\n name: 'styles',\r\n parse: parseStyles,\r\n fallback: {}\r\n }\r\n }\r\n}\r\n\r\n// Returns the list of sheet data `.xml` files.\r\nfunction getSheetDataXmlFiles(filePaths, sheetRelationIdsToRead, sheetDataParserParameters) {\r\n return Object.keys(filePaths.sheets)\r\n .filter((sheetRelationId) => sheetRelationIdsToRead.includes(sheetRelationId))\r\n .reduce((filesInfo, sheetRelationId) => ({\r\n ...filesInfo,\r\n [filePaths.sheets[sheetRelationId]]: {\r\n name: sheetRelationId,\r\n // `parseSheet()` returns a `Promise`.\r\n parse: (content, parseXml) => parseSheet(content, parseXml, sheetDataParserParameters)\r\n }\r\n }), {})\r\n}\r\n\r\n// In case of converting `.zip` file reader from a \"read-and-return\" one to a \"streaming\" one,\r\n// this function could be modified to process the files as they come rather than all-at-once.\r\n\r\n// Reads files from inside an `.xlsx` archive by file paths.\r\n//\r\n// In case of converting `.zip` file reader from a \"read-and-return\" one to a \"streaming\" one,\r\n// this function could be modified to process the files as they come rather than all-at-once.\r\n//\r\n// But there's a catch: inside an `.xlsx` file, some file paths are not fixed\r\n// and are instead defined in \"xl/_rels/workbook.xml.rels\" file,\r\n// which presents a \"chicken and an egg\" dilemma: how could one possibly\r\n// read an `.xlsx` file in one go when the order of the files inside it isn't fixed\r\n// and could be random. Most likely, in the majority of cases, \"xl/_rels/workbook.xml.rels\"\r\n// file is gonna be one of the first in a given `.xlsx` archive, but still it's not guaranteed.\r\n// A solution would be reading an `.xlsx` file in two passes: one pass would be just to read\r\n// the \"xl/_rels/workbook.xml.rels\" and ignore decompressing anything else,\r\n// and then the second pass would be to read all other files whose paths are now known.\r\n//\r\n// Returns:\r\n// * If none of the `parse()` functions returned a `Promise`, it returns a map of files' contents.\r\n// * If any of the `parse()` functions returned a `Promise`, it returns a `Promise` that resolves to a map of files' contents.\r\n//\r\nfunction readFiles(filesInfo, contents, parseXml) {\r\n // Get files' contents.\r\n const results = {}\r\n for (const filePath of Object.keys(filesInfo)) {\r\n const fileInfo = filesInfo[filePath]\r\n results[fileInfo.name] = contents[filePath] === undefined\r\n ? (\r\n fileInfo.fallback === undefined\r\n ? (() => { throw new InvalidSpreadsheetError(`\"${filePath}\" file not found inside the \\`.xlsx\\` file`) })()\r\n : fileInfo.fallback\r\n )\r\n : fileInfo.parse(contents[filePath], parseXml)\r\n }\r\n // Resolve any `Promise`s.\r\n const promises = []\r\n for (const name of Object.keys(results)) {\r\n if (isPromise(results[name])) {\r\n promises.push(results[name].then((result) => {\r\n results[name] = result\r\n }))\r\n }\r\n }\r\n if (promises.length > 0) {\r\n return Promise.all(promises).then(() => results)\r\n }\r\n return results\r\n}"],"mappings":"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"}
|
|
@@ -7,71 +7,72 @@ exports["default"] = parseSpreadsheetInfo;
|
|
|
7
7
|
/**
|
|
8
8
|
* Parses spreadsheet info.
|
|
9
9
|
* @param {string} content
|
|
10
|
-
* @param {function}
|
|
10
|
+
* @param {function} parseXml — SAX XML parser.
|
|
11
11
|
* @returns {object} An object of shape `{ epoch1904: boolean, sheets: Sheet[] }`.
|
|
12
12
|
*/
|
|
13
|
-
function parseSpreadsheetInfo(content,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
})
|
|
13
|
+
function parseSpreadsheetInfo(content, parseXml) {
|
|
14
|
+
var state = createInitialState();
|
|
15
|
+
return parseXml(content, state, onOpenTag, null, null).then(function () {
|
|
16
|
+
return getResultFromState(state);
|
|
17
|
+
});
|
|
18
|
+
function createInitialState() {
|
|
19
|
+
return {
|
|
20
|
+
workbookPr: undefined,
|
|
21
|
+
sheets: []
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function getResultFromState(state) {
|
|
18
25
|
return {
|
|
19
26
|
epoch1904: state.workbookPr ? state.workbookPr.epoch1904 : false,
|
|
20
27
|
sheets: state.sheets
|
|
21
28
|
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
// Deleting and adding new sheets might cause the sheetId values to become non-sequential.
|
|
70
|
-
// For example, `sheetId`s could be `1`, `2`, `4`, if sheet `3` was deleted.
|
|
71
|
-
id: Number(attributes.sheetId),
|
|
72
|
-
name: attributes.name,
|
|
73
|
-
relationId: attributes['r:id']
|
|
74
|
-
});
|
|
29
|
+
}
|
|
30
|
+
function onOpenTag(tagName, attributes, state) {
|
|
31
|
+
if (tagName === 'workbookPr') {
|
|
32
|
+
// The official Open XML specification dictates that the top-level `<workbook/>` element
|
|
33
|
+
// should only contain exactly one `<workbookPr/>` element. In case of multiple ones,
|
|
34
|
+
// only the first one is being read and the rest are simply ignored.
|
|
35
|
+
//
|
|
36
|
+
// There's a `1904-based-dates.xlsx` test case that happens to include multiple `<workbookPr/>`
|
|
37
|
+
// elements by accident, most likely because I edited its `.xml` files by hand and didn't notice
|
|
38
|
+
// the already-existing `<workbookPr/>` tag.
|
|
39
|
+
//
|
|
40
|
+
// At first I thought about just fixing that one `.xlsx` test file but later
|
|
41
|
+
// I saw that another library called `SheetJS` specifically handles such cases
|
|
42
|
+
// by only reading the first `<workbookPr/>` element and ignoring the rest,
|
|
43
|
+
// so I though that perhaps it would make some sense to do same thing here.
|
|
44
|
+
// https://github.com/SheetJS/sheetjs/issues/1619
|
|
45
|
+
//
|
|
46
|
+
if (!state.workbookPr) {
|
|
47
|
+
// Read `<workbookPr/>` element attributes to detect whether dates are 1900-based or 1904-based.
|
|
48
|
+
// https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel
|
|
49
|
+
// http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html
|
|
50
|
+
state.workbookPr = {
|
|
51
|
+
epoch1904: attributes.date1904 === '1'
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
} else if (tagName === 'sheet') {
|
|
55
|
+
// Example of `<sheets/>` element:
|
|
56
|
+
// ```
|
|
57
|
+
// <sheets>
|
|
58
|
+
// <sheet
|
|
59
|
+
// xmlns:ns="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
|
60
|
+
// name="Sheet1"
|
|
61
|
+
// sheetId="1"
|
|
62
|
+
// ns:id="rId3"/>
|
|
63
|
+
// </sheets>
|
|
64
|
+
// ```
|
|
65
|
+
if (attributes.name) {
|
|
66
|
+
state.sheets.push({
|
|
67
|
+
// `sheetId` attribute value is an arbitrary, `1`-based unique positive integer
|
|
68
|
+
// assigned to a worksheet, typically starting at `1` for the first sheet.
|
|
69
|
+
// Deleting and adding new sheets might cause the sheetId values to become non-sequential.
|
|
70
|
+
// For example, `sheetId`s could be `1`, `2`, `4`, if sheet `3` was deleted.
|
|
71
|
+
id: Number(attributes.sheetId),
|
|
72
|
+
name: attributes.name,
|
|
73
|
+
relationId: attributes['r:id']
|
|
74
|
+
});
|
|
75
|
+
}
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseSpreadsheetInfo.js","names":["parseSpreadsheetInfo","content","
|
|
1
|
+
{"version":3,"file":"parseSpreadsheetInfo.js","names":["parseSpreadsheetInfo","content","parseXml","state","createInitialState","onOpenTag","then","getResultFromState","workbookPr","undefined","sheets","epoch1904","tagName","attributes","date1904","name","push","id","Number","sheetId","relationId"],"sources":["../../source/xlsx/parseSpreadsheetInfo.js"],"sourcesContent":["/**\r\n * Parses spreadsheet info.\r\n * @param {string} content\r\n * @param {function} parseXml — SAX XML parser.\r\n * @returns {object} An object of shape `{ epoch1904: boolean, sheets: Sheet[] }`.\r\n */\r\nexport default function parseSpreadsheetInfo(content, parseXml) {\r\n const state = createInitialState()\r\n return parseXml(\r\n content,\r\n state,\r\n onOpenTag,\r\n null,\r\n null\r\n ).then(() => getResultFromState(state))\r\n\r\n function createInitialState() {\r\n return {\r\n workbookPr: undefined,\r\n sheets: []\r\n }\r\n }\r\n\r\n function getResultFromState(state) {\r\n return {\r\n epoch1904: state.workbookPr ? state.workbookPr.epoch1904 : false,\r\n sheets: state.sheets\r\n }\r\n }\r\n\r\n function onOpenTag(tagName, attributes, state) {\r\n if (tagName === 'workbookPr') {\r\n // The official Open XML specification dictates that the top-level `<workbook/>` element\r\n // should only contain exactly one `<workbookPr/>` element. In case of multiple ones,\r\n // only the first one is being read and the rest are simply ignored.\r\n //\r\n // There's a `1904-based-dates.xlsx` test case that happens to include multiple `<workbookPr/>`\r\n // elements by accident, most likely because I edited its `.xml` files by hand and didn't notice\r\n // the already-existing `<workbookPr/>` tag.\r\n //\r\n // At first I thought about just fixing that one `.xlsx` test file but later\r\n // I saw that another library called `SheetJS` specifically handles such cases\r\n // by only reading the first `<workbookPr/>` element and ignoring the rest,\r\n // so I though that perhaps it would make some sense to do same thing here.\r\n // https://github.com/SheetJS/sheetjs/issues/1619\r\n //\r\n if (!state.workbookPr) {\r\n // Read `<workbookPr/>` element attributes to detect whether dates are 1900-based or 1904-based.\r\n // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html\r\n state.workbookPr = {\r\n epoch1904: attributes.date1904 === '1'\r\n }\r\n }\r\n } else if (tagName === 'sheet') {\r\n // Example of `<sheets/>` element:\r\n // ```\r\n // <sheets>\r\n // <sheet\r\n // xmlns:ns=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n // name=\"Sheet1\"\r\n // sheetId=\"1\"\r\n // ns:id=\"rId3\"/>\r\n // </sheets>\r\n // ```\r\n if (attributes.name) {\r\n state.sheets.push({\r\n // `sheetId` attribute value is an arbitrary, `1`-based unique positive integer\r\n // assigned to a worksheet, typically starting at `1` for the first sheet.\r\n // Deleting and adding new sheets might cause the sheetId values to become non-sequential.\r\n // For example, `sheetId`s could be `1`, `2`, `4`, if sheet `3` was deleted.\r\n id: Number(attributes.sheetId),\r\n name: attributes.name,\r\n relationId: attributes['r:id']\r\n })\r\n }\r\n }\r\n }\r\n}"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,oBAAoBA,CAACC,OAAO,EAAEC,QAAQ,EAAE;EAC9D,IAAMC,KAAK,GAAGC,kBAAkB,CAAC,CAAC;EAClC,OAAOF,QAAQ,CACbD,OAAO,EACPE,KAAK,EACLE,SAAS,EACT,IAAI,EACJ,IACF,CAAC,CAACC,IAAI,CAAC;IAAA,OAAMC,kBAAkB,CAACJ,KAAK,CAAC;EAAA,EAAC;EAEvC,SAASC,kBAAkBA,CAAA,EAAG;IAC5B,OAAO;MACLI,UAAU,EAAEC,SAAS;MACrBC,MAAM,EAAE;IACV,CAAC;EACH;EAEA,SAASH,kBAAkBA,CAACJ,KAAK,EAAE;IACjC,OAAO;MACLQ,SAAS,EAAER,KAAK,CAACK,UAAU,GAAGL,KAAK,CAACK,UAAU,CAACG,SAAS,GAAG,KAAK;MAChED,MAAM,EAAEP,KAAK,CAACO;IAChB,CAAC;EACH;EAEA,SAASL,SAASA,CAACO,OAAO,EAAEC,UAAU,EAAEV,KAAK,EAAE;IAC7C,IAAIS,OAAO,KAAK,YAAY,EAAE;MAC5B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,IAAI,CAACT,KAAK,CAACK,UAAU,EAAE;QACrB;QACA;QACA;QACAL,KAAK,CAACK,UAAU,GAAG;UACjBG,SAAS,EAAEE,UAAU,CAACC,QAAQ,KAAK;QACrC,CAAC;MACH;IACF,CAAC,MAAM,IAAIF,OAAO,KAAK,OAAO,EAAE;MAC9B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,IAAIC,UAAU,CAACE,IAAI,EAAE;QACnBZ,KAAK,CAACO,MAAM,CAACM,IAAI,CAAC;UAChB;UACA;UACA;UACA;UACAC,EAAE,EAAEC,MAAM,CAACL,UAAU,CAACM,OAAO,CAAC;UAC9BJ,IAAI,EAAEF,UAAU,CAACE,IAAI;UACrBK,UAAU,EAAEP,UAAU,CAAC,MAAM;QAC/B,CAAC,CAAC;MACJ;IACF;EACF;AACF"}
|
|
@@ -19,17 +19,29 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r
|
|
|
19
19
|
* Returns an array of cell styles.
|
|
20
20
|
* A cell style index is the cell style ID.
|
|
21
21
|
* @param {string} content
|
|
22
|
-
* @param {function}
|
|
22
|
+
* @param {function} parseXml — SAX XML parser.
|
|
23
23
|
* @returns {object} styles
|
|
24
24
|
*/
|
|
25
|
-
function parseStyles(content,
|
|
25
|
+
function parseStyles(content, parseXml) {
|
|
26
26
|
// 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
|
|
27
27
|
// https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
var state = createInitialState();
|
|
29
|
+
return parseXml(content, state, onOpenTag, onCloseTag, null).then(function () {
|
|
30
|
+
return getResultFromState(state);
|
|
31
|
+
});
|
|
32
|
+
function createInitialState() {
|
|
33
|
+
return {
|
|
34
|
+
numberFormats: {},
|
|
35
|
+
baseStyles: [],
|
|
36
|
+
// The first `164` elements of the `styles` array are going to be `undefined`
|
|
37
|
+
// because those represent the built-in "default" styles in `.xlsx` specification.
|
|
38
|
+
// These "default" styles have IDs from `0` to `163`, i.e. according to their index.
|
|
39
|
+
styles: [],
|
|
40
|
+
cellStyleXfs: false,
|
|
41
|
+
cellXfs: false
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function getResultFromState(state) {
|
|
33
45
|
return state.styles.map(function (style) {
|
|
34
46
|
if (style.xfId) {
|
|
35
47
|
var xfId = style.xfId,
|
|
@@ -39,79 +51,67 @@ function parseStyles(content, parseXmlStream) {
|
|
|
39
51
|
return style;
|
|
40
52
|
}
|
|
41
53
|
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
cellStyleXfs
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (state.cellStyleXfs) {
|
|
74
|
-
// The index of a `<xf/>` element is by definition its numeric ID.
|
|
75
|
-
// Therefore, even empty `style` elements still must be put into the array.
|
|
76
|
-
state.baseStyles.push(parseCellStyle(attributes));
|
|
77
|
-
} else if (state.cellXfs) {
|
|
78
|
-
var style = parseCellStyle(attributes, state.numberFormats);
|
|
79
|
-
// A style might extend a "base style" by its numeric ID.
|
|
80
|
-
if (attributes.xfId) {
|
|
81
|
-
style.xfId = Number(attributes.xfId);
|
|
54
|
+
}
|
|
55
|
+
function onOpenTag(tagName, attributes, state) {
|
|
56
|
+
if (tagName === 'numFmt') {
|
|
57
|
+
// `<numFmts/>` element contains `<numFmt/>` elements.
|
|
58
|
+
// `<numFmt/>` defines a "number format" template.
|
|
59
|
+
// The value of `numFmtId` attribute is a (numeric) ID of this "number format".
|
|
60
|
+
state.numberFormats[attributes.numFmtId] = {
|
|
61
|
+
id: Number(attributes.numFmtId),
|
|
62
|
+
template: attributes.formatCode
|
|
63
|
+
};
|
|
64
|
+
} else if (tagName === 'cellStyleXfs') {
|
|
65
|
+
// `<cellStyleXfs/>` contains "base styles" that could be extended by `<cellXfs/>`.
|
|
66
|
+
// These styles don't apply to individual cells directly. They can only be extended.
|
|
67
|
+
state.cellStyleXfs = true;
|
|
68
|
+
} else if (tagName === 'cellXfs') {
|
|
69
|
+
// `<cellXfs/>` contains individual cell styles. They can extend "base styles".
|
|
70
|
+
state.cellXfs = true;
|
|
71
|
+
} else if (tagName === 'xf') {
|
|
72
|
+
if (state.cellStyleXfs) {
|
|
73
|
+
// The index of a `<xf/>` element is by definition its numeric ID.
|
|
74
|
+
// Therefore, even empty `style` elements still must be put into the array.
|
|
75
|
+
state.baseStyles.push(parseCellStyle(attributes));
|
|
76
|
+
} else if (state.cellXfs) {
|
|
77
|
+
var style = parseCellStyle(attributes, state.numberFormats);
|
|
78
|
+
// A style might extend a "base style" by its numeric ID.
|
|
79
|
+
if (attributes.xfId) {
|
|
80
|
+
style.xfId = Number(attributes.xfId);
|
|
81
|
+
}
|
|
82
|
+
// The index of a `<xf/>` element is by definition its numeric ID.
|
|
83
|
+
// Therefore, even empty `style` elements still must be put into the array.
|
|
84
|
+
state.styles.push(style);
|
|
82
85
|
}
|
|
83
|
-
// The index of a `<xf/>` element is by definition its numeric ID.
|
|
84
|
-
// Therefore, even empty `style` elements still must be put into the array.
|
|
85
|
-
state.styles.push(style);
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
function onCloseTag(tagName, state) {
|
|
89
|
+
if (tagName === 'cellStyleXfs') {
|
|
90
|
+
state.cellStyleXfs = false;
|
|
91
|
+
} else if (tagName === 'cellXfs') {
|
|
92
|
+
state.cellXfs = false;
|
|
93
|
+
}
|
|
94
94
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
95
|
+
function parseCellStyle(attributes, numberFormats) {
|
|
96
|
+
var style = {};
|
|
97
|
+
// `numFmtId` in `<cellStyleXfs/>` and `<cellXfs/>` is a numerical ID
|
|
98
|
+
// referencing the cell's "number format". Values from `0` to `163` are built-in formats,
|
|
99
|
+
// while values `164` and above are custom formats defined in the `<numFmts/>` element.
|
|
100
|
+
var numFmtId = attributes.numFmtId;
|
|
101
|
+
if (numFmtId) {
|
|
102
|
+
// Built-in number formats don't have a `<numFmt/>` element in `styles.xml`.
|
|
103
|
+
// https://hexdocs.pm/xlsxir/number_styles.html
|
|
104
|
+
if (numberFormats && numberFormats[numFmtId]) {
|
|
105
|
+
// Non-built-in number format.
|
|
106
|
+
style.numberFormat = numberFormats[numFmtId];
|
|
107
|
+
} else {
|
|
108
|
+
// Built-in number format.
|
|
109
|
+
style.numberFormat = {
|
|
110
|
+
id: Number(numFmtId)
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
113
|
}
|
|
114
|
+
return style;
|
|
114
115
|
}
|
|
115
|
-
return style;
|
|
116
116
|
}
|
|
117
117
|
//# sourceMappingURL=parseStyles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseStyles.js","names":["parseStyles","content","
|
|
1
|
+
{"version":3,"file":"parseStyles.js","names":["parseStyles","content","parseXml","state","createInitialState","onOpenTag","onCloseTag","then","getResultFromState","numberFormats","baseStyles","styles","cellStyleXfs","cellXfs","map","style","xfId","styleProperties","_objectWithoutProperties","_excluded","_objectSpread","tagName","attributes","numFmtId","id","Number","template","formatCode","push","parseCellStyle","numberFormat"],"sources":["../../source/xlsx/parseStyles.js"],"sourcesContent":["/**\r\n * Parses `.xlsx` file styles.\r\n * http://officeopenxml.com/SSstyles.php\r\n * Returns an array of cell styles.\r\n * A cell style index is the cell style ID.\r\n * @param {string} content\r\n * @param {function} parseXml — SAX XML parser.\r\n * @returns {object} styles\r\n */\r\nexport default function parseStyles(content, parseXml) {\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 state = createInitialState()\r\n return parseXml(\r\n content,\r\n state,\r\n onOpenTag,\r\n onCloseTag,\r\n null\r\n ).then(() => getResultFromState(state))\r\n\r\n function createInitialState() {\r\n return {\r\n numberFormats: {},\r\n baseStyles: [],\r\n // The first `164` elements of the `styles` array are going to be `undefined`\r\n // because those represent the built-in \"default\" styles in `.xlsx` specification.\r\n // These \"default\" styles have IDs from `0` to `163`, i.e. according to their index.\r\n styles: [],\r\n cellStyleXfs: false,\r\n cellXfs: false\r\n }\r\n }\r\n\r\n function getResultFromState(state) {\r\n return state.styles.map((style) => {\r\n if (style.xfId) {\r\n const { xfId, ...styleProperties } = style\r\n return {\r\n ...state.baseStyles[xfId],\r\n ...styleProperties\r\n }\r\n } else {\r\n return style\r\n }\r\n })\r\n }\r\n\r\n function onOpenTag(tagName, attributes, state) {\r\n if (tagName === 'numFmt') {\r\n // `<numFmts/>` element contains `<numFmt/>` elements.\r\n // `<numFmt/>` defines a \"number format\" template.\r\n // The value of `numFmtId` attribute is a (numeric) ID of this \"number format\".\r\n state.numberFormats[attributes.numFmtId] = {\r\n id: Number(attributes.numFmtId),\r\n template: attributes.formatCode\r\n }\r\n } else if (tagName === 'cellStyleXfs') {\r\n // `<cellStyleXfs/>` contains \"base styles\" that could be extended by `<cellXfs/>`.\r\n // These styles don't apply to individual cells directly. They can only be extended.\r\n state.cellStyleXfs = true\r\n } else if (tagName === 'cellXfs') {\r\n // `<cellXfs/>` contains individual cell styles. They can extend \"base styles\".\r\n state.cellXfs = true\r\n } else if (tagName === 'xf') {\r\n if (state.cellStyleXfs) {\r\n // The index of a `<xf/>` element is by definition its numeric ID.\r\n // Therefore, even empty `style` elements still must be put into the array.\r\n state.baseStyles.push(parseCellStyle(attributes))\r\n } else if (state.cellXfs) {\r\n const style = parseCellStyle(attributes, state.numberFormats)\r\n // A style might extend a \"base style\" by its numeric ID.\r\n if (attributes.xfId) {\r\n style.xfId = Number(attributes.xfId)\r\n }\r\n // The index of a `<xf/>` element is by definition its numeric ID.\r\n // Therefore, even empty `style` elements still must be put into the array.\r\n state.styles.push(style)\r\n }\r\n }\r\n }\r\n\r\n function onCloseTag(tagName, state) {\r\n if (tagName === 'cellStyleXfs') {\r\n state.cellStyleXfs = false\r\n } else if (tagName === 'cellXfs') {\r\n state.cellXfs = false\r\n }\r\n }\r\n\r\n function parseCellStyle(attributes, numberFormats) {\r\n const style = {}\r\n // `numFmtId` in `<cellStyleXfs/>` and `<cellXfs/>` is a numerical ID\r\n // referencing the cell's \"number format\". Values from `0` to `163` are built-in formats,\r\n // while values `164` and above are custom formats defined in the `<numFmts/>` element.\r\n const { numFmtId } = attributes\r\n if (numFmtId) {\r\n // Built-in number formats don't have a `<numFmt/>` element in `styles.xml`.\r\n // https://hexdocs.pm/xlsxir/number_styles.html\r\n if (numberFormats && numberFormats[numFmtId]) {\r\n // Non-built-in number format.\r\n style.numberFormat = numberFormats[numFmtId]\r\n } else {\r\n // Built-in number format.\r\n style.numberFormat = { id: Number(numFmtId) }\r\n }\r\n }\r\n return style\r\n }\r\n}"],"mappings":"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"}
|