import XLSX from 'xlsx' import FileSaver from 'file-saver' import Blob from 'blob' function datenum (v, date1904) { if (date1904) v += 1462 var epoch = Date.parse(v) return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000) } function SheetFromArray (data, opts) { var ws = {} var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0 }} for (var R = 0; R !== data.length; ++R) { for (var C = 0; C !== data[R].length; ++C) { if (range.s.r > R) range.s.r = R if (range.s.c > C) range.s.c = C if (range.e.r < R) range.e.r = R if (range.e.c < C) range.e.c = C var cell = {v: data[R][C] } if (cell.v == null) continue var cell_ref = XLSX.utils.encode_cell({c: C, r: R}) if (typeof cell.v === 'number') cell.t = 'n' else if (typeof cell.v === 'boolean') cell.t = 'b' else if (cell.v instanceof Date) { cell.t = 'n'; cell.z = XLSX.SSF._table[14] cell.v = datenum(cell.v) } else cell.t = 's' ws[cell_ref] = cell } } if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range) return ws } function Workbook () { if (!(this instanceof Workbook)) return new Workbook() this.SheetNames = [] this.Sheets = {} } function s2ab (s) { var buf = new ArrayBuffer(s.length) var view = new Uint8Array(buf) for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF return buf } function saveAs (workbook, filename) { const wopts = {bookType: 'xlsx', bookSST: false, type: 'binary'} const wbout = XLSX.write(workbook, wopts) FileSaver.saveAs(new Blob([s2ab(wbout)], {type: ''}), filename) } function readWorkbook (file, callback) { const reader = new FileReader() reader.onload = (e) => { const data = e.target.result const workbook = XLSX.read(data, {type: 'binary', cellDates: true}) console.log('Workbook after read:', workbook) if (workbook.SheetNames.length !== 1) { throw Error(`Expected only one worksheet in the file, but found ${workbook.SheetNames.length}.`) } const worksheet = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], { header: 1, raw: true }) callback(worksheet) } reader.readAsBinaryString(file) } export default { Workbook, SheetFromArray, saveAs, readWorkbook }