UNPKG

read-excel-file

Version:

Read `.xlsx` files in a web browser or in Node.js

142 lines 5.33 kB
import { findChild, findChildren, forEach, map, getFirstElementChild, getTagName } from './dom.js'; export function readSharedStrings(document, onOpenTag, onCloseTag, onText, state) { var sst = document.documentElement; onOpenTag('sst', null, state); // An `<si/>` element can contain a `<t/>` (simplest case) or a set of `<r/>` ("rich formatting") elements having `<t/>`. // https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet.sharedstringitem?redirectedfrom=MSDN&view=openxml-2.8.1 // http://www.datypic.com/sc/ooxml/e-ssml_si-1.html map(sst, 'si', function (si) { onOpenTag('si', null, state); var t = findChild(si, 't'); if (t) { onOpenTag('t', null, state); onText(t.textContent, state); onCloseTag('t', state); } else { forEach(si, 'r', function (r) { onOpenTag('r', null, state); onOpenTag('t', null, state); onText(findChild(r, 't').textContent, state); onCloseTag('t', state); onCloseTag('r', state); }); } onCloseTag('si', state); }); onCloseTag('sst', state); } export function readSheetDimensions(document, onOpenTag, onCloseTag, onText, state) { var worksheet = document.documentElement; onOpenTag('worksheet', null, state); var dimensions = findChild(worksheet, 'dimension'); if (dimensions) { onOpenTag('dimension', { ref: dimensions.getAttribute('ref') }, state); onCloseTag('dimension', state); } onCloseTag('worksheet', state); } export function readCells(document, onOpenTag, onCloseTag, onText, state) { var worksheet = document.documentElement; onOpenTag('worksheet', null, state); var sheetData = findChild(worksheet, 'sheetData'); forEach(sheetData, 'row', function (row) { onOpenTag('row', null, state); forEach(row, 'c', function (cell) { var attributes = { r: cell.getAttribute('r'), t: cell.getAttribute('t'), s: cell.getAttribute('s') }; onOpenTag('c', attributes, state); // A cell could have either a value or an insline string value. // * Cell value is stored as text content of a `<v>...</v>` element. // * Inline string value is stored as text content of an `<is><t>...</t></is>` element. readCellValueElement(document, cell, onOpenTag, onCloseTag, onText, state); readCellInlineStringValue(document, cell, onOpenTag, onCloseTag, onText, state); onCloseTag('c', state); }); onCloseTag('row', state); }); onCloseTag('worksheet', state); } export function getMergedCellCoordinates(document) { var worksheet = document.documentElement; var mergedCells = findChild(worksheet, 'mergeCells'); var mergedCellsInfo = []; if (mergedCells) { forEach(mergedCells, 'mergeCell', function (mergedCell) { mergedCellsInfo.push(mergedCell.getAttribute('ref')); }); } return mergedCellsInfo; } function readCellValueElement(document, element, onOpenTag, onCloseTag, onText, state) { var v = findChild(element, 'v'); if (v) { onOpenTag('v', null, state); if (typeof v.textContent === 'string') { onText(v.textContent, state); } onCloseTag('v', state); } } function readCellInlineStringValue(document, element, onOpenTag, onCloseTag, onText, state) { // It seems as if in some weirdly-output "*.xlsx" files // there're non-element nodes of some weird nature. // https://gitlab.com/catamphetamine/read-excel-file/-/issues/109 // This code filters out such weird non-element nodes. var firstElementChild = getFirstElementChild(element); if (firstElementChild && getTagName(firstElementChild) === 'is') { onOpenTag('is', null, state); var firstElementChildFirstElementChild = getFirstElementChild(firstElementChild); if (firstElementChildFirstElementChild && getTagName(firstElementChildFirstElementChild) === 't') { onOpenTag('t', null, state); if (typeof firstElementChildFirstElementChild.textContent === 'string') { onText(firstElementChildFirstElementChild.textContent, state); } onCloseTag('t', state); } onCloseTag('is', state); } } export function getBaseStyles(document) { var styleSheet = document.documentElement; var cellStyleXfs = findChild(styleSheet, 'cellStyleXfs'); if (cellStyleXfs) { return findChildren(cellStyleXfs, 'xf'); } return []; } export function getCellStyles(document) { var styleSheet = document.documentElement; var cellXfs = findChild(styleSheet, 'cellXfs'); if (!cellXfs) { return []; } return findChildren(cellXfs, 'xf'); } export function getNumberFormats(document) { var styleSheet = document.documentElement; var numberFormats = []; var numFmts = findChild(styleSheet, 'numFmts'); if (numFmts) { return findChildren(numFmts, 'numFmt'); } return []; } export function getWorkbookProperties(document) { var workbook = document.documentElement; return findChild(workbook, 'workbookPr'); } export function getRelationships(document) { var relationships = document.documentElement; return findChildren(relationships, 'Relationship'); } export function getSheets(document) { var workbook = document.documentElement; var sheets = findChild(workbook, 'sheets'); return findChildren(sheets, 'sheet'); } //# sourceMappingURL=xlsx.js.map