forked from sheetjs/sheetjs
version bump 0.4.3: shared strings and formatting
- XLSB basic support for number formats - removed extraneous Strings table element - formatting xml tags (rich_stress_test) - updating test_files to 20130130
This commit is contained in:
parent
bf5155dd5d
commit
5c4bf62b83
@ -1 +1 @@
|
||||
XLSX.version = '0.4.2';
|
||||
XLSX.version = '0.4.3';
|
||||
|
@ -6,10 +6,9 @@ var recordhopper = function(data, cb) {
|
||||
var RT = data.read_shift(1);
|
||||
if(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);
|
||||
var R = RecordEnum[RT] || RecordEnum[0xFFFF];
|
||||
|
||||
length = tmpbyte = data.read_shift(1);
|
||||
for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);
|
||||
var d = R.f(data, length);
|
||||
if(cb(d, R)) return;
|
||||
if(cb(d, R, RT)) return;
|
||||
}
|
||||
};
|
||||
|
@ -26,7 +26,7 @@ function parse_Cell(data) {
|
||||
var iStyleRef = data.read_shift(2);
|
||||
iStyleRef += data.read_shift(1) <<16;
|
||||
var fPhShow = data.read_shift(1);
|
||||
return { c:col };
|
||||
return { c:col, iStyleRef: iStyleRef };
|
||||
}
|
||||
|
||||
/* [MS-XLSB] 2.5.21 */
|
||||
|
@ -15,13 +15,17 @@ var parse_rs = (function() {
|
||||
case '<extend': break;
|
||||
/* 18.8.36 shadow CT_BooleanProperty */
|
||||
/* ** not required . */
|
||||
case '<shadow': break;
|
||||
case '<shadow':
|
||||
/* falls through */
|
||||
case '<shadow/>': break;
|
||||
|
||||
/* 18.4.1 charset CT_IntProperty TODO */
|
||||
case '<charset': break;
|
||||
|
||||
/* 18.4.2 outline CT_BooleanProperty TODO */
|
||||
case '<outline': break;
|
||||
case '<outline':
|
||||
/* falls through */
|
||||
case '<outline/>': break;
|
||||
|
||||
/* 18.4.5 rFont CT_FontName */
|
||||
case '<rFont': font.name = y.val; break;
|
||||
@ -103,7 +107,7 @@ var parse_rs = (function() {
|
||||
/* 18.4.8 si CT_Rst */
|
||||
var parse_si = function(x) {
|
||||
var z = {};
|
||||
if(!x) return z;
|
||||
if(!x) return null;
|
||||
var y;
|
||||
/* 18.4.12 t ST_Xstring (Plaintext String) */
|
||||
if(x[1] === 't') {
|
||||
@ -129,7 +133,7 @@ var parse_sst_xml = function(data) {
|
||||
/* 18.4.9 sst CT_Sst */
|
||||
var sst = data.match(new RegExp("<sst([^>]*)>([\\s\\S]*)<\/sst>","m"));
|
||||
if(isval(sst)) {
|
||||
s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(parse_si);
|
||||
s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(parse_si).filter(function(x) { return x; });
|
||||
sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;
|
||||
}
|
||||
return s;
|
||||
|
@ -24,7 +24,8 @@ function parseCXfs(t) {
|
||||
case '<cellXfs': case '<cellXfs/>': case '</cellXfs>': break;
|
||||
|
||||
/* 18.8.45 xf CT_Xf */
|
||||
case '<xf': if(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10);
|
||||
case '<xf': delete y[0];
|
||||
if(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10);
|
||||
styles.CellXf.push(y); break;
|
||||
case '</xf>': break;
|
||||
|
||||
|
@ -1,3 +1,66 @@
|
||||
function parse_sty_bin(data) {
|
||||
|
||||
function parse_BrtFmt(data, length) {
|
||||
var ifmt = data.read_shift(2);
|
||||
var stFmtCode = parse_XLWideString(data,length-2);
|
||||
return [ifmt, stFmtCode];
|
||||
}
|
||||
|
||||
function parse_BrtXF(data, length) {
|
||||
var ixfeParent = data.read_shift(2);
|
||||
var ifmt = data.read_shift(2);
|
||||
parsenoop(data, length-4);
|
||||
return {ixfe:ixfeParent, ifmt:ifmt };
|
||||
}
|
||||
|
||||
function parse_sty_bin(data) {
|
||||
styles.NumberFmt = [];
|
||||
for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
|
||||
|
||||
styles.CellXf = [];
|
||||
var state = "";
|
||||
var pass = false;
|
||||
recordhopper(data, function(val, R, RT) {
|
||||
switch(R.n) {
|
||||
case 'BrtFmt':
|
||||
styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);
|
||||
break;
|
||||
case 'BrtFont': break; /* TODO */
|
||||
case 'BrtKnownFonts': break; /* TODO */
|
||||
case 'BrtFill': break; /* TODO */
|
||||
case 'BrtBorder': break; /* TODO */
|
||||
case 'BrtXF':
|
||||
if(state === "CELLXFS") {
|
||||
styles.CellXf.push(val);
|
||||
}
|
||||
break; /* TODO */
|
||||
case 'BrtStyle': break; /* TODO */
|
||||
case 'BrtRowHdr': break; /* TODO */
|
||||
case 'BrtCellMeta': break; /* ?? */
|
||||
case 'BrtBeginStyleSheet': break;
|
||||
case 'BrtEndStyleSheet': break;
|
||||
case 'BrtBeginFmts': state = "FMTS"; break;
|
||||
case 'BrtEndFmts': state = ""; break;
|
||||
case 'BrtBeginFonts': state = "FONTS"; break;
|
||||
case 'BrtEndFonts': state = ""; break;
|
||||
case 'BrtACBegin': state = "ACFONTS"; break;
|
||||
case 'BrtACEnd': state = ""; break;
|
||||
case 'BrtBeginFills': state = "FILLS"; break;
|
||||
case 'BrtEndFills': state = ""; break;
|
||||
case 'BrtBeginBorders': state = "BORDERS"; break;
|
||||
case 'BrtEndBorders': state = ""; break;
|
||||
case 'BrtBeginCellStyleXFs': state = "CELLSTYLEXFS"; break;
|
||||
case 'BrtEndCellStyleXFs': state = ""; break;
|
||||
case 'BrtBeginCellXFs': state = "CELLXFS"; break;
|
||||
case 'BrtEndCellXFs': state = ""; break;
|
||||
case 'BrtBeginStyles': state = "STYLES"; break;
|
||||
case 'BrtEndStyles': state = ""; break;
|
||||
case 'BrtBeginDXFs': state = "DXFS"; break;
|
||||
case 'BrtEndDXFs': state = ""; break;
|
||||
case 'BrtBeginTableStyles': state = "TABLESTYLES"; break;
|
||||
case 'BrtEndTableStyles': state = ""; break;
|
||||
case 'BrtFRTBegin': pass = true; break;
|
||||
case 'BrtFRTEnd': pass = false; break;
|
||||
//default: if(!pass) throw new Error("Unexpected record " + RT + " " + R.n);
|
||||
}
|
||||
});
|
||||
return styles;
|
||||
}
|
||||
|
@ -115,6 +115,9 @@ var parse_ws_bin = function(data) {
|
||||
case 'str': if(p.v) p.v = utf8read(p.v); break;
|
||||
}
|
||||
if(val[3]) p.f = val[3];
|
||||
if(styles.CellXf[val[0].iStyleRef]) try {
|
||||
p.w = SSF.format(styles.CellXf[val[0].iStyleRef].ifmt,p.v,_ssfopts);
|
||||
} catch(e) { }
|
||||
s[encode_cell({c:val[0].c,r:row.r})] = p;
|
||||
break; // TODO
|
||||
|
||||
@ -144,8 +147,8 @@ var parse_ws_bin = function(data) {
|
||||
case 'BrtPrintOptions': break; // TODO
|
||||
case 'BrtMargins': break; // TODO
|
||||
case 'BrtPageSetup': break; // TODO
|
||||
case 'BrtFRTBegin': pass = true; break; // TODO
|
||||
case 'BrtFRTEnd': pass = false; break; // TODO
|
||||
case 'BrtFRTBegin': pass = true; break;
|
||||
case 'BrtFRTEnd': pass = false; break;
|
||||
case 'BrtEndSheet': break; // TODO
|
||||
//default: if(!pass) throw new Error("Unexpected record " + R.n);
|
||||
}
|
||||
|
@ -36,10 +36,10 @@ var RecordEnum = {
|
||||
0x0028: { n:"BrtIndexRowBlock", f:parsenoop },
|
||||
0x002A: { n:"BrtIndexBlock", f:parsenoop },
|
||||
0x002B: { n:"BrtFont", f:parsenoop },
|
||||
0x002C: { n:"BrtFmt", f:parsenoop },
|
||||
0x002C: { n:"BrtFmt", f:parse_BrtFmt },
|
||||
0x002D: { n:"BrtFill", f:parsenoop },
|
||||
0x002E: { n:"BrtBorder", f:parsenoop },
|
||||
0x002F: { n:"BrtXF", f:parsenoop },
|
||||
0x002F: { n:"BrtXF", f:parse_BrtXF },
|
||||
0x0030: { n:"BrtStyle", f:parsenoop },
|
||||
0x0031: { n:"BrtCellMeta", f:parsenoop },
|
||||
0x0032: { n:"BrtValueMeta", f:parsenoop },
|
||||
|
@ -33,8 +33,8 @@ function sheet_to_row_object_array(sheet, opts){
|
||||
for (C = r.s.c; C <= r.e.c; ++C) {
|
||||
val = sheet[encode_cell({c: C,r: R})];
|
||||
if(!val || !val.t) continue;
|
||||
v = (val || {}).v;
|
||||
switch(val.t){
|
||||
if(typeof val.w !== 'undefined') { row[hdr[C]] = val.w; isempty = false; }
|
||||
else switch(val.t){
|
||||
case 's': case 'str': case 'b': case 'n':
|
||||
if(val.v !== undefined) {
|
||||
row[hdr[C]] = val.v;
|
||||
@ -53,6 +53,7 @@ function sheet_to_row_object_array(sheet, opts){
|
||||
function sheet_to_csv(sheet, opts) {
|
||||
var stringify = function stringify(val) {
|
||||
if(!val.t) return "";
|
||||
if(typeof val.w !== 'undefined') return '"' + val.w.replace(/"/,'""') + '"';
|
||||
switch(val.t){
|
||||
case 'n': return String(val.v);
|
||||
case 's': case 'str':
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "xlsx",
|
||||
"version": "0.4.2",
|
||||
"version": "0.4.3",
|
||||
"author": "sheetjs",
|
||||
"description": "XLSB / XLSX / XLSM parser",
|
||||
"keywords": [ "xlsx", "xlsb", "xlsm", "office", "excel", "spreadsheet" ],
|
||||
|
10
tests.lst
10
tests.lst
@ -1,4 +1,6 @@
|
||||
formula_stress_test.xlsb
|
||||
number_format.xlsb
|
||||
rich_text_stress.xlsb
|
||||
time_stress_test_1.xlsb
|
||||
LONumbers-2010.xlsx
|
||||
LONumbers-2011.xlsx
|
||||
@ -41,6 +43,7 @@ apachepoi_50846-border_colours.xlsx
|
||||
apachepoi_50867_with_table.xlsx
|
||||
apachepoi_51222.xlsx
|
||||
apachepoi_51470.xlsx
|
||||
apachepoi_51585.xlsx
|
||||
apachepoi_51710.xlsx
|
||||
apachepoi_51850.xlsx
|
||||
apachepoi_51963.xlsx
|
||||
@ -122,6 +125,7 @@ apachepoi_workbookProtection_workbook_structure_protected.xlsx
|
||||
apachepoi_workbookProtection_workbook_windows_protected.xlsx
|
||||
apachepoi_workbookProtection_worksheet_protected.xlsx
|
||||
apachepoi_xlsx-jdbc.xlsx
|
||||
comments_stress_test.xlsx
|
||||
excel-reader-xlsx_data01.xlsx
|
||||
excel-reader-xlsx_data02.xlsx
|
||||
excel-reader-xlsx_error02.xlsx.pending
|
||||
@ -163,6 +167,7 @@ openpyxl_r_date_1904.xlsx
|
||||
openpyxl_r_formulae.xlsx
|
||||
openpyxl_r_null_archive.xlsx.pending
|
||||
openpyxl_r_null_file.xlsx.pending
|
||||
rich_text_stress.xlsx
|
||||
roo_1900_base.xlsx
|
||||
roo_1904_base.xlsx
|
||||
roo_Bibelbund.xlsx
|
||||
@ -195,6 +200,7 @@ spreadsheet-parsexlsx_bug-11.xlsx
|
||||
spreadsheet-parsexlsx_bug-12.xlsx
|
||||
spreadsheet-parsexlsx_bug-13.xlsx
|
||||
spreadsheet-parsexlsx_bug-14.xlsx
|
||||
spreadsheet-parsexlsx_bug-15.xlsx
|
||||
spreadsheet-parsexlsx_bug-2.xlsx
|
||||
spreadsheet-parsexlsx_bug-3.xlsx
|
||||
spreadsheet-parsexlsx_bug-4.xlsx
|
||||
@ -203,11 +209,15 @@ spreadsheet-parsexlsx_bug-6-2.xlsx
|
||||
spreadsheet-parsexlsx_bug-6.xlsx
|
||||
spreadsheet-parsexlsx_bug-7.xlsx
|
||||
spreadsheet-parsexlsx_bug-8.xlsx
|
||||
xlrd_merged_cells.xlsx
|
||||
xlrd_reveng1.xlsx
|
||||
xlrd_test_comments_excel.xlsx
|
||||
xlrd_test_comments_gdocs.xlsx
|
||||
xlrd_text_bar.xlsx
|
||||
חישוב_נקודות_זיכוי.xlsx
|
||||
apachepoi_45431.xlsm
|
||||
apachepoi_47026.xlsm
|
||||
apachepoi_47089.xlsm
|
||||
apachepoi_ExcelWithAttachments.xlsm
|
||||
number_format.xlsm
|
||||
openpyxl_r_vba-test.xlsm
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 51eb4765cd8828155a72d5b2aa273e999daaa93e
|
||||
Subproject commit a9fc7e00949b0f7621f0b51e0ed5b139bac8e109
|
103
xlsx.js
103
xlsx.js
@ -420,7 +420,7 @@ SSF.load_table = function(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i]) SSF.loa
|
||||
make_ssf(SSF);
|
||||
var XLSX = {};
|
||||
(function(XLSX){
|
||||
XLSX.version = '0.4.2';
|
||||
XLSX.version = '0.4.3';
|
||||
var current_codepage, current_cptable, cptable;
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
if(typeof cptable === 'undefined') cptable = require('codepage');
|
||||
@ -705,11 +705,10 @@ var recordhopper = function(data, cb) {
|
||||
var RT = data.read_shift(1);
|
||||
if(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);
|
||||
var R = RecordEnum[RT] || RecordEnum[0xFFFF];
|
||||
|
||||
length = tmpbyte = data.read_shift(1);
|
||||
for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);
|
||||
var d = R.f(data, length);
|
||||
if(cb(d, R)) return;
|
||||
if(cb(d, R, RT)) return;
|
||||
}
|
||||
};
|
||||
/* [MS-XLSB] 2.1.7.121 */
|
||||
@ -740,7 +739,7 @@ function parse_Cell(data) {
|
||||
var iStyleRef = data.read_shift(2);
|
||||
iStyleRef += data.read_shift(1) <<16;
|
||||
var fPhShow = data.read_shift(1);
|
||||
return { c:col };
|
||||
return { c:col, iStyleRef: iStyleRef };
|
||||
}
|
||||
|
||||
/* [MS-XLSB] 2.5.21 */
|
||||
@ -815,13 +814,17 @@ var parse_rs = (function() {
|
||||
case '<extend': break;
|
||||
/* 18.8.36 shadow CT_BooleanProperty */
|
||||
/* ** not required . */
|
||||
case '<shadow': break;
|
||||
case '<shadow':
|
||||
/* falls through */
|
||||
case '<shadow/>': break;
|
||||
|
||||
/* 18.4.1 charset CT_IntProperty TODO */
|
||||
case '<charset': break;
|
||||
|
||||
/* 18.4.2 outline CT_BooleanProperty TODO */
|
||||
case '<outline': break;
|
||||
case '<outline':
|
||||
/* falls through */
|
||||
case '<outline/>': break;
|
||||
|
||||
/* 18.4.5 rFont CT_FontName */
|
||||
case '<rFont': font.name = y.val; break;
|
||||
@ -903,7 +906,7 @@ var parse_rs = (function() {
|
||||
/* 18.4.8 si CT_Rst */
|
||||
var parse_si = function(x) {
|
||||
var z = {};
|
||||
if(!x) return z;
|
||||
if(!x) return null;
|
||||
var y;
|
||||
/* 18.4.12 t ST_Xstring (Plaintext String) */
|
||||
if(x[1] === 't') {
|
||||
@ -929,7 +932,7 @@ var parse_sst_xml = function(data) {
|
||||
/* 18.4.9 sst CT_Sst */
|
||||
var sst = data.match(new RegExp("<sst([^>]*)>([\\s\\S]*)<\/sst>","m"));
|
||||
if(isval(sst)) {
|
||||
s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(parse_si);
|
||||
s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(parse_si).filter(function(x) { return x; });
|
||||
sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;
|
||||
}
|
||||
return s;
|
||||
@ -985,7 +988,8 @@ function parseCXfs(t) {
|
||||
case '<cellXfs': case '<cellXfs/>': case '</cellXfs>': break;
|
||||
|
||||
/* 18.8.45 xf CT_Xf */
|
||||
case '<xf': if(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10);
|
||||
case '<xf': delete y[0];
|
||||
if(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10);
|
||||
styles.CellXf.push(y); break;
|
||||
case '</xf>': break;
|
||||
|
||||
@ -1025,8 +1029,71 @@ function parse_styles(data) {
|
||||
|
||||
return styles;
|
||||
}
|
||||
function parse_sty_bin(data) {
|
||||
function parse_BrtFmt(data, length) {
|
||||
var ifmt = data.read_shift(2);
|
||||
var stFmtCode = parse_XLWideString(data,length-2);
|
||||
return [ifmt, stFmtCode];
|
||||
}
|
||||
|
||||
function parse_BrtXF(data, length) {
|
||||
var ixfeParent = data.read_shift(2);
|
||||
var ifmt = data.read_shift(2);
|
||||
parsenoop(data, length-4);
|
||||
return {ixfe:ixfeParent, ifmt:ifmt };
|
||||
}
|
||||
|
||||
function parse_sty_bin(data) {
|
||||
styles.NumberFmt = [];
|
||||
for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
|
||||
|
||||
styles.CellXf = [];
|
||||
var state = "";
|
||||
var pass = false;
|
||||
recordhopper(data, function(val, R, RT) {
|
||||
switch(R.n) {
|
||||
case 'BrtFmt':
|
||||
styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);
|
||||
break;
|
||||
case 'BrtFont': break; /* TODO */
|
||||
case 'BrtKnownFonts': break; /* TODO */
|
||||
case 'BrtFill': break; /* TODO */
|
||||
case 'BrtBorder': break; /* TODO */
|
||||
case 'BrtXF':
|
||||
if(state === "CELLXFS") {
|
||||
styles.CellXf.push(val);
|
||||
}
|
||||
break; /* TODO */
|
||||
case 'BrtStyle': break; /* TODO */
|
||||
case 'BrtRowHdr': break; /* TODO */
|
||||
case 'BrtCellMeta': break; /* ?? */
|
||||
case 'BrtBeginStyleSheet': break;
|
||||
case 'BrtEndStyleSheet': break;
|
||||
case 'BrtBeginFmts': state = "FMTS"; break;
|
||||
case 'BrtEndFmts': state = ""; break;
|
||||
case 'BrtBeginFonts': state = "FONTS"; break;
|
||||
case 'BrtEndFonts': state = ""; break;
|
||||
case 'BrtACBegin': state = "ACFONTS"; break;
|
||||
case 'BrtACEnd': state = ""; break;
|
||||
case 'BrtBeginFills': state = "FILLS"; break;
|
||||
case 'BrtEndFills': state = ""; break;
|
||||
case 'BrtBeginBorders': state = "BORDERS"; break;
|
||||
case 'BrtEndBorders': state = ""; break;
|
||||
case 'BrtBeginCellStyleXFs': state = "CELLSTYLEXFS"; break;
|
||||
case 'BrtEndCellStyleXFs': state = ""; break;
|
||||
case 'BrtBeginCellXFs': state = "CELLXFS"; break;
|
||||
case 'BrtEndCellXFs': state = ""; break;
|
||||
case 'BrtBeginStyles': state = "STYLES"; break;
|
||||
case 'BrtEndStyles': state = ""; break;
|
||||
case 'BrtBeginDXFs': state = "DXFS"; break;
|
||||
case 'BrtEndDXFs': state = ""; break;
|
||||
case 'BrtBeginTableStyles': state = "TABLESTYLES"; break;
|
||||
case 'BrtEndTableStyles': state = ""; break;
|
||||
case 'BrtFRTBegin': pass = true; break;
|
||||
case 'BrtFRTEnd': pass = false; break;
|
||||
//default: if(!pass) throw new Error("Unexpected record " + RT + " " + R.n);
|
||||
}
|
||||
});
|
||||
return styles;
|
||||
}
|
||||
|
||||
var ct2type = {
|
||||
@ -1449,6 +1516,9 @@ var parse_ws_bin = function(data) {
|
||||
case 'str': if(p.v) p.v = utf8read(p.v); break;
|
||||
}
|
||||
if(val[3]) p.f = val[3];
|
||||
if(styles.CellXf[val[0].iStyleRef]) try {
|
||||
p.w = SSF.format(styles.CellXf[val[0].iStyleRef].ifmt,p.v,_ssfopts);
|
||||
} catch(e) { }
|
||||
s[encode_cell({c:val[0].c,r:row.r})] = p;
|
||||
break; // TODO
|
||||
|
||||
@ -1478,8 +1548,8 @@ var parse_ws_bin = function(data) {
|
||||
case 'BrtPrintOptions': break; // TODO
|
||||
case 'BrtMargins': break; // TODO
|
||||
case 'BrtPageSetup': break; // TODO
|
||||
case 'BrtFRTBegin': pass = true; break; // TODO
|
||||
case 'BrtFRTEnd': pass = false; break; // TODO
|
||||
case 'BrtFRTBegin': pass = true; break;
|
||||
case 'BrtFRTEnd': pass = false; break;
|
||||
case 'BrtEndSheet': break; // TODO
|
||||
//default: if(!pass) throw new Error("Unexpected record " + R.n);
|
||||
}
|
||||
@ -1786,10 +1856,10 @@ var RecordEnum = {
|
||||
0x0028: { n:"BrtIndexRowBlock", f:parsenoop },
|
||||
0x002A: { n:"BrtIndexBlock", f:parsenoop },
|
||||
0x002B: { n:"BrtFont", f:parsenoop },
|
||||
0x002C: { n:"BrtFmt", f:parsenoop },
|
||||
0x002C: { n:"BrtFmt", f:parse_BrtFmt },
|
||||
0x002D: { n:"BrtFill", f:parsenoop },
|
||||
0x002E: { n:"BrtBorder", f:parsenoop },
|
||||
0x002F: { n:"BrtXF", f:parsenoop },
|
||||
0x002F: { n:"BrtXF", f:parse_BrtXF },
|
||||
0x0030: { n:"BrtStyle", f:parsenoop },
|
||||
0x0031: { n:"BrtCellMeta", f:parsenoop },
|
||||
0x0032: { n:"BrtValueMeta", f:parsenoop },
|
||||
@ -2698,8 +2768,8 @@ function sheet_to_row_object_array(sheet, opts){
|
||||
for (C = r.s.c; C <= r.e.c; ++C) {
|
||||
val = sheet[encode_cell({c: C,r: R})];
|
||||
if(!val || !val.t) continue;
|
||||
v = (val || {}).v;
|
||||
switch(val.t){
|
||||
if(typeof val.w !== 'undefined') { row[hdr[C]] = val.w; isempty = false; }
|
||||
else switch(val.t){
|
||||
case 's': case 'str': case 'b': case 'n':
|
||||
if(val.v !== undefined) {
|
||||
row[hdr[C]] = val.v;
|
||||
@ -2718,6 +2788,7 @@ function sheet_to_row_object_array(sheet, opts){
|
||||
function sheet_to_csv(sheet, opts) {
|
||||
var stringify = function stringify(val) {
|
||||
if(!val.t) return "";
|
||||
if(typeof val.w !== 'undefined') return '"' + val.w.replace(/"/,'""') + '"';
|
||||
switch(val.t){
|
||||
case 'n': return String(val.v);
|
||||
case 's': case 'str':
|
||||
|
Loading…
Reference in New Issue
Block a user