diff --git a/bits/67_wsxml.js b/bits/67_wsxml.js index ba7d193..b5385fa 100644 --- a/bits/67_wsxml.js +++ b/bits/67_wsxml.js @@ -264,7 +264,10 @@ function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts/*::, idx, wb*/)/*:string var oldt = cell.t, oldv = cell.v; if(cell.t !== "z") switch(cell.t) { case 'b': vv = cell.v ? "1" : "0"; break; - case 'n': vv = ''+cell.v; break; + case 'n': + if(isNaN(cell.v)) { cell.t = "e"; vv = BErr[cell.v = 0x24]; } // #NUM! + else if(!isFinite(cell.v)) { cell.t = "e"; vv = BErr[cell.v = 0x07]; } // #DIV/0! + else vv = ''+cell.v; break; case 'e': vv = BErr[cell.v]; break; case 'd': if(opts && opts.cellDates) vv = parseDate(cell.v, -1).toISOString(); diff --git a/bits/68_wsbin.js b/bits/68_wsbin.js index 591f6a5..5dae457 100644 --- a/bits/68_wsbin.js +++ b/bits/68_wsbin.js @@ -842,6 +842,12 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) { if(last_seen) write_record(ba, 0x000D /* BrtShortRk */, write_BrtShortRk(cell, o)); else write_record(ba, 0x0002 /* BrtCellRk */, write_BrtCellRk(cell, o)); + } else if(isNaN(cell.v)) { + if(last_seen) write_record(ba, 0x000E /* BrtShortError */, write_BrtShortError({t:"e", v: 0x24}, o)); // #NUM! + else write_record(ba, 0x0003 /* BrtCellError */, write_BrtCellError({t:"e", v: 0x24}, o)); // #NUM! + } else if(!isFinite(cell.v)) { + if(last_seen) write_record(ba, 0x000E /* BrtShortError */, write_BrtShortError({t:"e", v: 0x07}, o)); // #DIV/0! + else write_record(ba, 0x0003 /* BrtCellError */, write_BrtCellError({t:"e", v: 0x07}, o)); // #DIV/0! } else { if(last_seen) write_record(ba, 0x0010 /* BrtShortReal */, write_BrtShortReal(cell, o)); else write_record(ba, 0x0005 /* BrtCellReal */, write_BrtCellReal(cell, o)); diff --git a/bits/78_writebiff.js b/bits/78_writebiff.js index 078c137..0743f39 100644 --- a/bits/78_writebiff.js +++ b/bits/78_writebiff.js @@ -62,6 +62,10 @@ function write_ws_biff2_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:n var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v; if((v == (v|0)) && (v >= 0) && (v < 65536)) write_biff_rec(ba, 0x0002, write_BIFF2INT(R, C, v)); + else if(isNaN(v)) + write_biff_rec(ba, 0x0005, write_BIFF2BERR(R, C, 0x24, "e")); // #NUM! + else if(!isFinite(v)) + write_biff_rec(ba, 0x0005, write_BIFF2BERR(R, C, 0x07, "e")); // #DIV/0! else write_biff_rec(ba, 0x0003, write_BIFF2NUM(R,C, v)); return; @@ -182,8 +186,10 @@ function write_ws_biff8_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:n else switch(cell.t) { case 'd': case 'n': var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v; + if(isNaN(v)) write_biff_rec(ba, 0x0205 /* BoolErr */, write_BoolErr(R, C, 0x24, os, opts, "e")); // #NUM! + else if(!isFinite(v)) write_biff_rec(ba, 0x0205 /* BoolErr */, write_BoolErr(R, C, 0x07, os, opts, "e")); // #DIV/0! /* TODO: emit RK as appropriate */ - write_biff_rec(ba, 0x0203 /* Number */, write_Number(R, C, v, os, opts)); + else write_biff_rec(ba, 0x0203 /* Number */, write_Number(R, C, v, os, opts)); break; case 'b': case 'e': write_biff_rec(ba, 0x0205 /* BoolErr */, write_BoolErr(R, C, cell.v, os, opts, cell.t));