forked from sheetjs/sheetjs
sheet_to_json
default value
uses `defval` key in options object fixes #583 h/t @jimjin fixes #582 h/t @jimjin fixes #147 h/t @jtadmor
This commit is contained in:
parent
69782ca211
commit
9ae3a64af8
@ -7,6 +7,11 @@ changes may not be included if they are not expected to break existing code.
|
||||
|
||||
## Unreleased
|
||||
|
||||
* `sheet_to_json` now passes `null` values when `raw` is set to `true`
|
||||
* `sheet_to_json` treats `null` stub cells as values in conjunction with `raw`
|
||||
|
||||
## 0.9.5 (2017-03-22)
|
||||
|
||||
* `cellDates` affects parsing in non-XLSX formats
|
||||
|
||||
## 0.9.3 (2017-03-15)
|
||||
|
@ -856,6 +856,7 @@ generate different types of JS objects. The function takes an options argument:
|
||||
| range | from WS | Override Range (see table below) |
|
||||
| header | | Control output format (see table below) |
|
||||
| dateNF | fmt 14 | Use specified date format in string output |
|
||||
| defval | | Use specified value in place of null or undefined |
|
||||
|
||||
- `raw` only affects cells which have a format code (`.z`) field or a formatted
|
||||
text (`.w`) field.
|
||||
@ -864,6 +865,9 @@ generate different types of JS objects. The function takes an options argument:
|
||||
- When `header` is not specified, the conversion will automatically disambiguate
|
||||
header entries by affixing `_` and a count starting at `1`. For example, if
|
||||
three columns have header `foo` the output fields are `foo`, `foo_1`, `foo_2`
|
||||
- `null` values are returned when `raw` is true but are skipped when false.
|
||||
- If `defval` is not specified, null and undefined values are skipped normally.
|
||||
If specified, all null and undefined points will be filled with `defval`
|
||||
|
||||
`range` is expected to be one of:
|
||||
|
||||
|
@ -77,6 +77,7 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/){
|
||||
var val, row, range, header = 0, offset = 1, r, hdr/*:Array<any>*/ = [], isempty, R, C, v, vv;
|
||||
var o = opts != null ? opts : {};
|
||||
var raw = o.raw;
|
||||
var defval = o.defval;
|
||||
if(sheet == null || sheet["!ref"] == null) return [];
|
||||
range = o.range != null ? o.range : sheet["!ref"];
|
||||
if(o.header === 1) header = 1;
|
||||
@ -119,16 +120,26 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/){
|
||||
}
|
||||
for (C = r.s.c; C <= r.e.c; ++C) {
|
||||
val = sheet[cols[C] + rr];
|
||||
if(val === undefined || val.t === undefined) continue;
|
||||
if(val === undefined || val.t === undefined) {
|
||||
if(defval === undefined) continue;
|
||||
if(hdr[C] != null) { row[hdr[C]] = defval; isempty = false; }
|
||||
continue;
|
||||
}
|
||||
v = val.v;
|
||||
switch(val.t){
|
||||
case 'z': continue;
|
||||
case 'z': if(v == null) break; continue;
|
||||
case 'e': continue;
|
||||
case 's': case 'd': case 'b': case 'n': break;
|
||||
default: throw new Error('unrecognized type ' + val.t);
|
||||
}
|
||||
if(v !== undefined) {
|
||||
row[hdr[C]] = raw ? v : format_cell(val,v);
|
||||
if(hdr[C] != null) {
|
||||
if(v == null) {
|
||||
if(defval !== undefined) row[hdr[C]] = defval;
|
||||
else if(raw && v === null) row[hdr[C]] = null;
|
||||
else continue;
|
||||
} else {
|
||||
row[hdr[C]] = raw ? v : format_cell(val,v);
|
||||
}
|
||||
isempty = false;
|
||||
}
|
||||
}
|
||||
|
@ -65,6 +65,7 @@ generate different types of JS objects. The function takes an options argument:
|
||||
| range | from WS | Override Range (see table below) |
|
||||
| header | | Control output format (see table below) |
|
||||
| dateNF | fmt 14 | Use specified date format in string output |
|
||||
| defval | | Use specified value in place of null or undefined |
|
||||
|
||||
- `raw` only affects cells which have a format code (`.z`) field or a formatted
|
||||
text (`.w`) field.
|
||||
@ -73,6 +74,9 @@ generate different types of JS objects. The function takes an options argument:
|
||||
- When `header` is not specified, the conversion will automatically disambiguate
|
||||
header entries by affixing `_` and a count starting at `1`. For example, if
|
||||
three columns have header `foo` the output fields are `foo`, `foo_1`, `foo_2`
|
||||
- `null` values are returned when `raw` is true but are skipped when false.
|
||||
- If `defval` is not specified, null and undefined values are skipped normally.
|
||||
If specified, all null and undefined points will be filled with `defval`
|
||||
|
||||
`range` is expected to be one of:
|
||||
|
||||
|
27
test.js
27
test.js
@ -1051,9 +1051,10 @@ function sheet_from_array_of_arrays(data, opts) {
|
||||
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;
|
||||
if(cell.v === undefined) continue;
|
||||
var cell_ref = X.utils.encode_cell({c:C,r:R});
|
||||
if(typeof cell.v === 'number') cell.t = 'n';
|
||||
if(cell.v === null) cell.t = 'z';
|
||||
else if(typeof cell.v === 'number') cell.t = 'n';
|
||||
else if(typeof cell.v === 'boolean') cell.t = 'b';
|
||||
else if(cell.v instanceof Date) {
|
||||
cell.z = X.SSF._table[14];
|
||||
@ -1081,8 +1082,8 @@ describe('json output', function() {
|
||||
data = [
|
||||
[1,2,3],
|
||||
[true, false, null, "sheetjs"],
|
||||
["foo","bar",new Date("2014-02-19T14:30Z"), "0.3"],
|
||||
["baz", null, "qux"]
|
||||
["foo", "bar", new Date("2014-02-19T14:30Z"), "0.3"],
|
||||
["baz", undefined, "qux"]
|
||||
];
|
||||
ws = sheet_from_array_of_arrays(data);
|
||||
});
|
||||
@ -1139,6 +1140,23 @@ describe('json output', function() {
|
||||
assert.throws(function() { seeker(json, [0,1,2], "baz"); });
|
||||
});
|
||||
});
|
||||
it('should use defval if requested', function() {
|
||||
var json = X.utils.sheet_to_json(ws, {defval: 'jimjin'});
|
||||
console.log(json);
|
||||
console.log(ws);
|
||||
assert.equal(json.length, data.length - 1);
|
||||
assert.equal(json[0][1], "TRUE");
|
||||
assert.equal(json[1][2], "bar");
|
||||
assert.equal(json[2][3], "qux");
|
||||
assert.equal(json[2][2], "jimjin");
|
||||
assert.equal(json[0][3], "jimjin");
|
||||
assert.doesNotThrow(function() { seeker(json, [1,2,3], "sheetjs"); });
|
||||
assert.throws(function() { seeker(json, [1,2,3], "baz"); });
|
||||
var json = X.utils.sheet_to_json(ws, {raw:true});
|
||||
console.log(json);
|
||||
var json = X.utils.sheet_to_json(ws, {raw:true, defval: 'jimjin'});
|
||||
console.log(json);
|
||||
});
|
||||
it('should disambiguate headers', function() {
|
||||
var _data = [["S","h","e","e","t","J","S"],[1,2,3,4,5,6,7],[2,3,4,5,6,7,8]];
|
||||
var _ws = sheet_from_array_of_arrays(_data);
|
||||
@ -1158,6 +1176,7 @@ describe('json output', function() {
|
||||
var json = X.utils.sheet_to_json(_ws, {header:1, raw:true});
|
||||
assert.equal(json.length, data.length);
|
||||
assert.equal(json[1][0], true);
|
||||
assert.equal(json[1][2], null);
|
||||
assert.equal(json[2][1], "bar");
|
||||
assert.equal(json[2][2].getTime(), new Date("2014-02-19T14:30Z").getTime());
|
||||
assert.equal(json[3][2], "qux");
|
||||
|
19
xlsx.flow.js
19
xlsx.flow.js
@ -14074,6 +14074,7 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/){
|
||||
var val, row, range, header = 0, offset = 1, r, hdr/*:Array<any>*/ = [], isempty, R, C, v, vv;
|
||||
var o = opts != null ? opts : {};
|
||||
var raw = o.raw;
|
||||
var defval = o.defval;
|
||||
if(sheet == null || sheet["!ref"] == null) return [];
|
||||
range = o.range != null ? o.range : sheet["!ref"];
|
||||
if(o.header === 1) header = 1;
|
||||
@ -14116,16 +14117,26 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/){
|
||||
}
|
||||
for (C = r.s.c; C <= r.e.c; ++C) {
|
||||
val = sheet[cols[C] + rr];
|
||||
if(val === undefined || val.t === undefined) continue;
|
||||
if(val === undefined || val.t === undefined) {
|
||||
if(defval === undefined) continue;
|
||||
if(hdr[C] != null) { row[hdr[C]] = defval; isempty = false; }
|
||||
continue;
|
||||
}
|
||||
v = val.v;
|
||||
switch(val.t){
|
||||
case 'z': continue;
|
||||
case 'z': if(v == null) break; continue;
|
||||
case 'e': continue;
|
||||
case 's': case 'd': case 'b': case 'n': break;
|
||||
default: throw new Error('unrecognized type ' + val.t);
|
||||
}
|
||||
if(v !== undefined) {
|
||||
row[hdr[C]] = raw ? v : format_cell(val,v);
|
||||
if(hdr[C] != null) {
|
||||
if(v == null) {
|
||||
if(defval !== undefined) row[hdr[C]] = defval;
|
||||
else if(raw && v === null) row[hdr[C]] = null;
|
||||
else continue;
|
||||
} else {
|
||||
row[hdr[C]] = raw ? v : format_cell(val,v);
|
||||
}
|
||||
isempty = false;
|
||||
}
|
||||
}
|
||||
|
19
xlsx.js
19
xlsx.js
@ -14007,6 +14007,7 @@ function sheet_to_json(sheet, opts){
|
||||
var val, row, range, header = 0, offset = 1, r, hdr = [], isempty, R, C, v, vv;
|
||||
var o = opts != null ? opts : {};
|
||||
var raw = o.raw;
|
||||
var defval = o.defval;
|
||||
if(sheet == null || sheet["!ref"] == null) return [];
|
||||
range = o.range != null ? o.range : sheet["!ref"];
|
||||
if(o.header === 1) header = 1;
|
||||
@ -14049,16 +14050,26 @@ function sheet_to_json(sheet, opts){
|
||||
}
|
||||
for (C = r.s.c; C <= r.e.c; ++C) {
|
||||
val = sheet[cols[C] + rr];
|
||||
if(val === undefined || val.t === undefined) continue;
|
||||
if(val === undefined || val.t === undefined) {
|
||||
if(defval === undefined) continue;
|
||||
if(hdr[C] != null) { row[hdr[C]] = defval; isempty = false; }
|
||||
continue;
|
||||
}
|
||||
v = val.v;
|
||||
switch(val.t){
|
||||
case 'z': continue;
|
||||
case 'z': if(v == null) break; continue;
|
||||
case 'e': continue;
|
||||
case 's': case 'd': case 'b': case 'n': break;
|
||||
default: throw new Error('unrecognized type ' + val.t);
|
||||
}
|
||||
if(v !== undefined) {
|
||||
row[hdr[C]] = raw ? v : format_cell(val,v);
|
||||
if(hdr[C] != null) {
|
||||
if(v == null) {
|
||||
if(defval !== undefined) row[hdr[C]] = defval;
|
||||
else if(raw && v === null) row[hdr[C]] = null;
|
||||
else continue;
|
||||
} else {
|
||||
row[hdr[C]] = raw ? v : format_cell(val,v);
|
||||
}
|
||||
isempty = false;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user