UNPKG

@adncorp/account-book-parser-adapter

Version:

parsing sheet adapter for account book

186 lines (148 loc) 4.43 kB
"use strict"; /* eslint-disable spellcheck/spell-checker */ /* eslint-disable no-mixed-operators */ /* eslint-disable camelcase */ function safe_decode_range(range) { var o = { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } }; var idx = 0; var i = 0; var cc = 0; var len = range.length; for (idx = 0; i < len; ++i) { if ((cc = range.charCodeAt(i) - 64) < 1 || cc > 26) break; idx = 26 * idx + cc; } o.s.c = --idx; for (idx = 0; i < len; ++i) { if ((cc = range.charCodeAt(i) - 48) < 0 || cc > 9) break; idx = 10 * idx + cc; } o.s.r = --idx; if (i === len || range.charCodeAt(++i) === 58) { o.e.c = o.s.c; o.e.r = o.s.r; return o; } for (idx = 0; i !== len; ++i) { if ((cc = range.charCodeAt(i) - 64) < 1 || cc > 26) break; idx = 26 * idx + cc; } o.e.c = --idx; for (idx = 0; i !== len; ++i) { if ((cc = range.charCodeAt(i) - 48) < 0 || cc > 9) break; idx = 10 * idx + cc; } o.e.r = --idx; return o; } var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000 var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; function datenum(v, date1904) { var epoch = v.getTime(); if (date1904) epoch -= 1462 * 24 * 60 * 60 * 1000; return (epoch - dnthresh) / (24 * 60 * 60 * 1000); } var SSF = {}; function safe_format_cell(cell, v) { var q = cell.t === 'd' && v instanceof Date; if (cell.z != null) { try { return cell.w = SSF.format(cell.z, q ? datenum(v) : v); } catch (e) {} } try { return cell.w = SSF.format((cell.XF || {}).numFmtId || (q ? 14 : 0), q ? datenum(v) : v); } catch (e) { return '' + v; } } function format_cell(cell, v, o) { if (cell === null || cell.t === null || cell.t === 'z') return ''; if (cell.w !== undefined) return cell.w; if (cell.t === 'd' && !cell.z && o && o.dateNF) cell.z = o.dateNF; if (v === undefined) return safe_format_cell(cell, cell.v); return safe_format_cell(cell, v); } function encode_row(row) { return '' + (row + 1); } function encode_col(col) { var s = ''; for (++col; col; col = Math.floor((col - 1) / 26)) { s = String.fromCharCode((col - 1) % 26 + 65) + s; } return s; } var qreg = /"/g; function make_csv_row(sheet, r, R, cols, fs, rs, FS, o) { var isempty = true; var row = []; var txt = ''; var rr = encode_row(R); for (var C = r.s.c; C <= r.e.c; ++C) { if (!cols[C]) continue; var val = o.dense ? (sheet[R] || [])[C] : sheet[cols[C] + rr]; if (val == null) txt = '';else if (val.v != null) { isempty = false; val.w = val.w === '.' ? val.v.toString() : val.w; txt = '' + format_cell(val, null, o); for (var i = 0, cc = 0; i !== txt.length; ++i) { if ((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34) { txt = '"' + txt.replace(qreg, '""') + '"'; break; } } if (txt === 'ID') txt = '"ID"'; } else if (val.f != null && !val.F) { isempty = false; txt = '=' + val.f; if (txt.indexOf(',') >= 0) txt = '"' + txt.replace(qreg, '""') + '"'; } else txt = ''; // NOTE: Excel CSV does not support array formulae row.push(txt); } if (o.blankrows === false && isempty) return null; return row.join(FS); } function sheet_to_csv(sheet, opts) { var out = []; var o = opts == null ? {} : opts; if (sheet == null || sheet['!ref'] == null) return ''; var r = safe_decode_range(sheet['!ref']); var FS = o.FS !== undefined ? o.FS : ','; var fs = FS.charCodeAt(0); var RS = o.RS !== undefined ? o.RS : '\n'; var rs = RS.charCodeAt(0); var endregex = new RegExp((FS === '|' ? '\\|' : FS) + '+$'); var row = ''; var cols = []; o.dense = Array.isArray(sheet); var colinfo = o.skipHidden && sheet['!cols'] || []; var rowinfo = o.skipHidden && sheet['!rows'] || []; for (var C = r.s.c; C <= r.e.c; ++C) { if (!(colinfo[C] || {}).hidden) cols[C] = encode_col(C); } for (var R = r.s.r; R <= r.e.r; ++R) { if ((rowinfo[R] || {}).hidden) continue; row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); if (row == null) { continue; } if (o.strip) row = row.replace(endregex, ''); out.push(row + RS); } delete o.dense; return out.join(''); } module.exports = { sheet_to_csv: sheet_to_csv }; //# sourceMappingURL=xlsxTocsv.js.map