@adncorp/account-book-parser-adapter
Version:
parsing sheet adapter for account book
186 lines (148 loc) • 4.43 kB
JavaScript
;
/* 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