forked from sheetjs/sheetjs
wsl build sequence fixes
This commit is contained in:
parent
5d49b7326d
commit
0b72cc592b
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -13,3 +13,5 @@ xlsx.js linguist-generated=true binary
|
||||
xlsxworker.js linguist-generated=true binary
|
||||
tests/core.js linguist-generated=true binary
|
||||
tests/fixtures.js linguist-generated=true binary
|
||||
|
||||
test.mjs lingust-generated=false binary=false text eol=lf
|
||||
|
2
Makefile
2
Makefile
@ -136,7 +136,7 @@ test mocha: test.js ## Run test suite
|
||||
|
||||
.PHONY: test-esm
|
||||
test-esm: test.mjs ## Run Node ESM test suite
|
||||
npx mocha -r esm -R spec -t 30000 $<
|
||||
npx -y mocha@9 -R spec -t 30000 $<
|
||||
|
||||
.PHONY: test-deno
|
||||
test-deno: test.ts ## Run Deno test suite
|
||||
|
@ -16,7 +16,7 @@ $(BAREJS): %.js: %.ts $(LIBFILES)
|
||||
|
||||
%.node.js: %.node.ts $(LIBFILES) src/numbers.ts
|
||||
npx esbuild $< --bundle --external:xlsx --outfile=$@ --platform=node
|
||||
sed -i '' 's/ts-node/node/g' $@
|
||||
sed -i '' 's/ts-node/node/g' $@ || sed -i'' 's/ts-node/node/g' $@ || { echo "sed failed"; exit 1; }
|
||||
|
||||
%.js: %.ts $(LIBFILES)
|
||||
npx esbuild $< --bundle --outfile=$@ --platform=browser --format=iife --global-name=$* --target=es5
|
||||
|
@ -4,13 +4,13 @@ INF=${1:-test.numbers}
|
||||
OUTF=${2:-reframed.numbers}
|
||||
make reframe.node.js
|
||||
node reframe.node.js "$INF" "$OUTF"
|
||||
# cat-numbers "$OUTF"
|
||||
# cat-numbers "$OUTF"
|
||||
chmod a+w "$OUTF"
|
||||
sleep 0.1
|
||||
# open "$OUTF"
|
||||
unzip -l "$OUTF"
|
||||
base64 "$OUTF" > xlsx.zahl.js
|
||||
sed -i.bak 's/^/var XLSX_ZAHL_PAYLOAD = "/g;s/$/";/g' xlsx.zahl.js
|
||||
base64 "$OUTF" | tr -d '\n' > xlsx.zahl.js
|
||||
sed -i.bak 's/^/var XLSX_ZAHL_PAYLOAD = "/g;s/$/";\n/g' xlsx.zahl.js
|
||||
cp xlsx.zahl.js xlsx.zahl.mjs
|
||||
cat >> xlsx.zahl.js <<EOF
|
||||
if(typeof module !== "undefined") module.exports = XLSX_ZAHL_PAYLOAD;
|
||||
|
4
test.js
4
test.js
@ -1869,7 +1869,7 @@ describe('json output', function() {
|
||||
var ws2 = X.utils.aoa_to_sheet(data), json = X.utils.sheet_to_json(ws2);
|
||||
assert.equal(json[0]["1"], true);
|
||||
assert.equal(json[2]["3"], "qux");
|
||||
ws2["!rows"] = [null,{hidden:true},null,null]; json = X.utils.sheet_to_json(ws2, {skipHidden: 1});
|
||||
ws2["!rows"] = [null,{hidden:true},null,null]; json = X.utils.sheet_to_json(ws2, {skipHidden: true});
|
||||
assert.equal(json[0]["1"], "foo");
|
||||
assert.equal(json[1]["3"], "qux");
|
||||
});
|
||||
@ -2526,7 +2526,7 @@ describe('corner cases', function() {
|
||||
//assert.equal(d.y, 2018);
|
||||
}
|
||||
[true, false].forEach(function(cD) {
|
||||
[null, 'yyyy-mm-dd'].forEach(function(dNF) {
|
||||
[void 0, 'yyyy-mm-dd'].forEach(function(dNF) {
|
||||
var ws1 = X.read(
|
||||
'7,2018-03-24',
|
||||
{cellDates: cD, dateNF: dNF, type:'string'}
|
||||
|
152
test.mjs
generated
152
test.mjs
generated
@ -18,8 +18,9 @@ import * as assert from 'assert';
|
||||
|
||||
import * as X from './xlsx.mjs';
|
||||
X.set_fs(fs);
|
||||
import * as cpexcel from './dist/cpexcel.full.mjs';
|
||||
X.set_cptable(cpexcel);
|
||||
import * as cptable from './dist/cpexcel.full.mjs';
|
||||
X.set_cptable(cptable);
|
||||
import XLSX_ZAHL from './dist/xlsx.zahl.mjs';
|
||||
var DIF_XL = true;
|
||||
|
||||
var browser = typeof document !== 'undefined';
|
||||
@ -133,6 +134,7 @@ var paths = {
|
||||
dnsxml: dir + 'defined_names_simple.xml',
|
||||
dnsxlsx: dir + 'defined_names_simple.xlsx',
|
||||
dnsxlsb: dir + 'defined_names_simple.xlsb',
|
||||
dnsslk: dir + 'defined_names_simple.slk',
|
||||
|
||||
dnuxls: dir + 'defined_names_unicode.xls',
|
||||
dnuxml: dir + 'defined_names_unicode.xml',
|
||||
@ -1173,15 +1175,19 @@ describe('parse features', function() {
|
||||
['xlsx', paths.dnsxlsx, true],
|
||||
['xlsb', paths.dnsxlsb, true],
|
||||
['xls', paths.dnsxls, true],
|
||||
['xlml', paths.dnsxml, false]
|
||||
['xlml', paths.dnsxml, false],
|
||||
['slk', paths.dnsslk, false]
|
||||
].forEach(function(m) { it(m[0], function() {
|
||||
var wb = X.read(fs.readFileSync(m[1]), {type:TYPE});
|
||||
var names = wb.Workbook.Names;
|
||||
|
||||
if(m[0] != 'slk') {
|
||||
for(var i = 0; i < names.length; ++i) if(names[i].Name == "SheetJS") break;
|
||||
assert.ok(i < names.length, "Missing name");
|
||||
assert.equal(names[i].Sheet, null);
|
||||
assert.equal(names[i].Ref, "Sheet1!$A$1");
|
||||
if(m[2]) assert.equal(names[i].Comment, "defined names just suck excel formulae are bad MS should feel bad");
|
||||
}
|
||||
|
||||
for(i = 0; i < names.length; ++i) if(names[i].Name == "SHEETjs") break;
|
||||
assert.ok(i < names.length, "Missing name");
|
||||
@ -1375,7 +1381,7 @@ describe('parse features', function() {
|
||||
});
|
||||
|
||||
describe('data types formats', function() {[
|
||||
['xlsx', paths.dtfxlsx]
|
||||
['xlsx', paths.dtfxlsx],
|
||||
].forEach(function(m) { it(m[0], function() {
|
||||
var wb = X.read(fs.readFileSync(m[1]), {type: TYPE, cellDates: true});
|
||||
var ws = wb.Sheets[wb.SheetNames[0]];
|
||||
@ -1530,9 +1536,9 @@ describe('roundtrip features', function() {
|
||||
}); });
|
||||
|
||||
describe('should preserve merge cells', function() {
|
||||
["xlsx", "xlsb", "xlml", "ods", "biff8"].forEach(function(f) { it(f, function() {
|
||||
["xlsx", "xlsb", "xlml", "ods", "biff8", "numbers"].forEach(function(f) { it(f, function() {
|
||||
var wb1 = X.read(fs.readFileSync(paths.mcxlsx), {type:TYPE});
|
||||
var wb2 = X.read(X.write(wb1,{bookType:f,type:'binary'}),{type:'binary'});
|
||||
var wb2 = X.read(X.write(wb1,{bookType:f,type:'binary',numbers:XLSX_ZAHL}),{type:'binary'});
|
||||
var m1 = wb1.Sheets.Merge['!merges'].map(X.utils.encode_range);
|
||||
var m2 = wb2.Sheets.Merge['!merges'].map(X.utils.encode_range);
|
||||
assert.equal(m1.length, m2.length);
|
||||
@ -1727,6 +1733,8 @@ var password_files = [
|
||||
];
|
||||
describe('invalid files', function() {
|
||||
describe('parse', function() { [
|
||||
['KEY files', 'numbers/Untitled.key'],
|
||||
['PAGES files', 'numbers/Untitled.pages'],
|
||||
['password', 'apachepoi_password.xls'],
|
||||
['passwords', 'apachepoi_xor-encryption-abc.xls'],
|
||||
['DOC files', 'word_doc.doc']
|
||||
@ -1781,7 +1789,7 @@ describe('json output', function() {
|
||||
if(typeof before != 'undefined') before(bef);
|
||||
else it('before', bef);
|
||||
it('should use first-row headers and full sheet by default', function() {
|
||||
var json = X.utils.sheet_to_json(ws, {raw: null});
|
||||
var json = X.utils.sheet_to_json(ws, {raw: false});
|
||||
assert.equal(json.length, data.length - 1);
|
||||
assert.equal(json[0][1], "TRUE");
|
||||
assert.equal(json[1][2], "bar");
|
||||
@ -1790,7 +1798,7 @@ describe('json output', function() {
|
||||
assert.throws(function() { seeker(json, [1,2,3], "baz"); });
|
||||
});
|
||||
it('should create array of arrays if header == 1', function() {
|
||||
var json = X.utils.sheet_to_json(ws, {header:1, raw:""});
|
||||
var json = X.utils.sheet_to_json(ws, {header:1, raw:false});
|
||||
assert.equal(json.length, data.length);
|
||||
assert.equal(json[1][0], "TRUE");
|
||||
assert.equal(json[2][1], "bar");
|
||||
@ -1848,7 +1856,7 @@ describe('json output', function() {
|
||||
var ws2 = X.utils.aoa_to_sheet(data), json = X.utils.sheet_to_json(ws2);
|
||||
assert.equal(json[0]["1"], true);
|
||||
assert.equal(json[2]["3"], "qux");
|
||||
ws2["!rows"] = []; ws2["!rows"][1] = {hidden:true}; json = X.utils.sheet_to_json(ws2, {skipHidden: true});
|
||||
ws2["!rows"] = [null,{hidden:true},null,null]; json = X.utils.sheet_to_json(ws2, {skipHidden: true});
|
||||
assert.equal(json[0]["1"], "foo");
|
||||
assert.equal(json[1]["3"], "qux");
|
||||
});
|
||||
@ -2167,6 +2175,19 @@ describe('sylk', function() {
|
||||
}
|
||||
} : null);
|
||||
});
|
||||
describe('date system', function() {
|
||||
function make_slk(d1904) { return "ID;PSheetJS\nP;Pd\\/m\\/yy\nP;Pd\\/m\\/yyyy\n" + (d1904 != null ? "O;D;V" + d1904 : "") + "\nF;P0;FG0G;X1;Y1\nC;K1\nE"; }
|
||||
it('should default to 1900', function() {
|
||||
assert.equal(get_cell(X.read(make_slk(), {type: "binary"}).Sheets.Sheet1, "A1").v, 1);
|
||||
assert.ok(get_cell(X.read(make_slk(), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() < 1902);
|
||||
assert.equal(get_cell(X.read(make_slk(5), {type: "binary"}).Sheets.Sheet1, "A1").v, 1);
|
||||
assert.ok(get_cell(X.read(make_slk(5), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() < 1902);
|
||||
});
|
||||
it('should use 1904 when specified', function() {
|
||||
assert.ok(get_cell(X.read(make_slk(1), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() > 1902);
|
||||
assert.ok(get_cell(X.read(make_slk(4), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() > 1902);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
(typeof Uint8Array !== "undefined" ? describe : describe.skip)('numbers', function() {
|
||||
@ -2435,7 +2456,6 @@ describe('corner cases', function() {
|
||||
});
|
||||
if(typeof JSON !== 'undefined') it('SSF oddities', function() {
|
||||
// $FlowIgnore
|
||||
//var ssfdata = require('./misc/ssf.json');
|
||||
var ssfdata = JSON.parse(fs.readFileSync('./misc/ssf.json', 'utf8'));
|
||||
var cb = function(d, j) { return function() { return X.SSF.format(d[0], d[j][0]); }; };
|
||||
ssfdata.forEach(function(d) {
|
||||
@ -2506,6 +2526,118 @@ describe('corner cases', function() {
|
||||
});
|
||||
});
|
||||
});
|
||||
it('should handle \\r and \\n', function() {
|
||||
var base = "./test_files/crlf/";
|
||||
[
|
||||
"CRLFR9.123",
|
||||
"CRLFR9.WK1",
|
||||
"CRLFR9.WK3",
|
||||
"CRLFR9.WK4",
|
||||
"CRLFR9.XLS",
|
||||
"CRLFR9_4.XLS",
|
||||
"CRLFR9_5.XLS",
|
||||
"CRLFX5_2.XLS",
|
||||
"CRLFX5_3.XLS",
|
||||
"CRLFX5_4.XLS",
|
||||
"CRLFX5_5.XLS",
|
||||
"crlf.csv",
|
||||
"crlf.fods",
|
||||
"crlf.htm",
|
||||
"crlf.numbers",
|
||||
"crlf.ods",
|
||||
"crlf.rtf",
|
||||
"crlf.slk",
|
||||
"crlf.xls",
|
||||
"crlf.xlsb",
|
||||
"crlf.xlsx",
|
||||
"crlf.xml",
|
||||
"crlf5.xls",
|
||||
"crlfq9.qpw",
|
||||
"crlfq9.wb1",
|
||||
"crlfq9.wb2",
|
||||
"crlfq9.wb3",
|
||||
"crlfq9.wk1",
|
||||
"crlfq9.wk3",
|
||||
"crlfq9.wk4",
|
||||
"crlfq9.wks",
|
||||
"crlfq9.wq1",
|
||||
"crlfw4_2.wks",
|
||||
"crlfw4_3.wks",
|
||||
"crlfw4_4.wks"
|
||||
].map(function(path) { return base + path; }).forEach(function(w) {
|
||||
var wb = X.read(fs.readFileSync(w), {type:TYPE});
|
||||
var ws = wb.Sheets[wb.SheetNames[0]];
|
||||
var B1 = get_cell(ws, "B1"), B2 = get_cell(ws, "B2");
|
||||
var lio = w.match(/\.[^\.]*$/).index, stem = w.slice(0, lio).toLowerCase(), ext = w.slice(lio + 1).toLowerCase();
|
||||
switch(ext) {
|
||||
case 'fm3': break;
|
||||
|
||||
case '123':
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
// TODO: parse formula // assert.equal(B1.v, "abc\r\ndef");
|
||||
break;
|
||||
case 'qpw':
|
||||
case 'wb1':
|
||||
case 'wb2':
|
||||
case 'wb3':
|
||||
case 'wk1':
|
||||
case 'wk3':
|
||||
case 'wk4':
|
||||
case 'wq1':
|
||||
assert.ok(B1.v == "abcdef" || B1.v == "abc\ndef");
|
||||
// TODO: formula -> string values
|
||||
if(B2 && B2.t != "e" && B2.v != "") assert.ok(B2.v == "abcdef" || B2.v == "abc\r\ndef");
|
||||
break;
|
||||
|
||||
case 'wks':
|
||||
if(stem.match(/w4/)) {
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
assert.ok(!B2 || B2.t == "z"); // Works4 did not support CODE / CHAR
|
||||
} else if(stem.match(/q9/)) {
|
||||
assert.equal(B1.v, "abcdef");
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
} else {
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
}
|
||||
break;
|
||||
|
||||
case 'xls':
|
||||
if(stem.match(/CRLFR9/i)) {
|
||||
assert.equal(B1.v, "abc\r\ndef");
|
||||
} else {
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
}
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
break;
|
||||
|
||||
case 'rtf':
|
||||
case 'htm':
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
assert.equal(B2.v, "abc\n\ndef");
|
||||
break;
|
||||
|
||||
case 'xlsx':
|
||||
case 'xlsb':
|
||||
case 'xml':
|
||||
case 'slk':
|
||||
case 'csv':
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
break;
|
||||
case 'fods':
|
||||
case 'ods':
|
||||
assert.equal(B1.v, "abc\nDef");
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
break;
|
||||
case 'numbers':
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
// TODO: B2 should be a formula error
|
||||
break;
|
||||
default: throw ext;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('encryption', function() {
|
||||
|
115
test.ts
115
test.ts
@ -1346,7 +1346,7 @@ Deno.test('parse features', async function(t) {
|
||||
});
|
||||
|
||||
await t.step('data types formats', async function(t) {var dtf = [
|
||||
['xlsx', paths.dtfxlsx]
|
||||
['xlsx', paths.dtfxlsx],
|
||||
]; for(var j = 0; j < dtf.length; ++j) { var m = dtf[j]; await t.step(m[0], async function(t) {
|
||||
var wb = X.read(fs.readFileSync(m[1]), {type: TYPE, cellDates: true});
|
||||
var ws = wb.Sheets[wb.SheetNames[0]];
|
||||
@ -2303,7 +2303,6 @@ Deno.test('corner cases', async function(t) {
|
||||
});
|
||||
if(typeof JSON !== 'undefined') await t.step('SSF oddities', async function(t) {
|
||||
// $FlowIgnore
|
||||
//var ssfdata = require('./misc/ssf.json');
|
||||
var ssfdata: Array<any> = JSON.parse(fs.readFileSync2('./misc/ssf.json', 'utf-8'));
|
||||
var cb = function(d: any, j: any) { return function() { return X.SSF.format(d[0], d[j][0]); }; };
|
||||
ssfdata.forEach(function(d) {
|
||||
@ -2374,6 +2373,118 @@ Deno.test('corner cases', async function(t) {
|
||||
});
|
||||
});
|
||||
});
|
||||
await t.step('should handle \\r and \\n', async function(t) {
|
||||
var base = "./test_files/crlf/";
|
||||
[
|
||||
"CRLFR9.123",
|
||||
"CRLFR9.WK1",
|
||||
"CRLFR9.WK3",
|
||||
"CRLFR9.WK4",
|
||||
"CRLFR9.XLS",
|
||||
"CRLFR9_4.XLS",
|
||||
"CRLFR9_5.XLS",
|
||||
"CRLFX5_2.XLS",
|
||||
"CRLFX5_3.XLS",
|
||||
"CRLFX5_4.XLS",
|
||||
"CRLFX5_5.XLS",
|
||||
"crlf.csv",
|
||||
"crlf.fods",
|
||||
"crlf.htm",
|
||||
"crlf.numbers",
|
||||
"crlf.ods",
|
||||
"crlf.rtf",
|
||||
"crlf.slk",
|
||||
"crlf.xls",
|
||||
"crlf.xlsb",
|
||||
"crlf.xlsx",
|
||||
"crlf.xml",
|
||||
"crlf5.xls",
|
||||
"crlfq9.qpw",
|
||||
"crlfq9.wb1",
|
||||
"crlfq9.wb2",
|
||||
"crlfq9.wb3",
|
||||
"crlfq9.wk1",
|
||||
"crlfq9.wk3",
|
||||
"crlfq9.wk4",
|
||||
"crlfq9.wks",
|
||||
"crlfq9.wq1",
|
||||
"crlfw4_2.wks",
|
||||
"crlfw4_3.wks",
|
||||
"crlfw4_4.wks"
|
||||
].map(function(path) { return base + path; }).forEach(function(w) {
|
||||
var wb = X.read(fs.readFileSync(w), {type:TYPE});
|
||||
var ws = wb.Sheets[wb.SheetNames[0]];
|
||||
var B1 = get_cell(ws, "B1"), B2 = get_cell(ws, "B2");
|
||||
var lio = w.match(/\.[^\.]*$/)?.index || 0, stem = w.slice(0, lio).toLowerCase(), ext = w.slice(lio + 1).toLowerCase();
|
||||
switch(ext) {
|
||||
case 'fm3': break;
|
||||
|
||||
case '123':
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
// TODO: parse formula // assert.equal(B1.v, "abc\r\ndef");
|
||||
break;
|
||||
case 'qpw':
|
||||
case 'wb1':
|
||||
case 'wb2':
|
||||
case 'wb3':
|
||||
case 'wk1':
|
||||
case 'wk3':
|
||||
case 'wk4':
|
||||
case 'wq1':
|
||||
assert.assert(B1.v == "abcdef" || B1.v == "abc\ndef");
|
||||
// TODO: formula -> string values
|
||||
if(B2 && B2.t != "e" && B2.v != "") assert.assert(B2.v == "abcdef" || B2.v == "abc\r\ndef");
|
||||
break;
|
||||
|
||||
case 'wks':
|
||||
if(stem.match(/w4/)) {
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
assert.assert(!B2 || B2.t == "z"); // Works4 did not support CODE / CHAR
|
||||
} else if(stem.match(/q9/)) {
|
||||
assert.equal(B1.v, "abcdef");
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
} else {
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
}
|
||||
break;
|
||||
|
||||
case 'xls':
|
||||
if(stem.match(/CRLFR9/i)) {
|
||||
assert.equal(B1.v, "abc\r\ndef");
|
||||
} else {
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
}
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
break;
|
||||
|
||||
case 'rtf':
|
||||
case 'htm':
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
assert.equal(B2.v, "abc\n\ndef");
|
||||
break;
|
||||
|
||||
case 'xlsx':
|
||||
case 'xlsb':
|
||||
case 'xml':
|
||||
case 'slk':
|
||||
case 'csv':
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
break;
|
||||
case 'fods':
|
||||
case 'ods':
|
||||
assert.equal(B1.v, "abc\nDef");
|
||||
assert.equal(B2.v, "abc\r\ndef");
|
||||
break;
|
||||
case 'numbers':
|
||||
assert.equal(B1.v, "abc\ndef");
|
||||
// TODO: B2 should be a formula error
|
||||
break;
|
||||
default: throw ext;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Deno.test('encryption', async function(t) {
|
||||
|
13
tests/core.js
generated
13
tests/core.js
generated
@ -132,6 +132,7 @@ var paths = {
|
||||
dnsxml: dir + 'defined_names_simple.xml',
|
||||
dnsxlsx: dir + 'defined_names_simple.xlsx',
|
||||
dnsxlsb: dir + 'defined_names_simple.xlsb',
|
||||
dnsslk: dir + 'defined_names_simple.slk',
|
||||
|
||||
dnuxls: dir + 'defined_names_unicode.xls',
|
||||
dnuxml: dir + 'defined_names_unicode.xml',
|
||||
@ -1183,15 +1184,19 @@ describe('parse features', function() {
|
||||
['xlsx', paths.dnsxlsx, true],
|
||||
['xlsb', paths.dnsxlsb, true],
|
||||
['xls', paths.dnsxls, true],
|
||||
['xlml', paths.dnsxml, false]
|
||||
['xlml', paths.dnsxml, false],
|
||||
['slk', paths.dnsslk, false]
|
||||
].forEach(function(m) { it(m[0], function() {
|
||||
var wb = X.read(fs.readFileSync(m[1]), {type:TYPE});
|
||||
var names = wb.Workbook.Names;
|
||||
|
||||
if(m[0] != 'slk') {
|
||||
for(var i = 0; i < names.length; ++i) if(names[i].Name == "SheetJS") break;
|
||||
assert(i < names.length, "Missing name");
|
||||
assert.equal(names[i].Sheet, null);
|
||||
assert.equal(names[i].Ref, "Sheet1!$A$1");
|
||||
if(m[2]) assert.equal(names[i].Comment, "defined names just suck excel formulae are bad MS should feel bad");
|
||||
}
|
||||
|
||||
for(i = 0; i < names.length; ++i) if(names[i].Name == "SHEETjs") break;
|
||||
assert(i < names.length, "Missing name");
|
||||
@ -1512,7 +1517,7 @@ function parseDate(str/*:string|Date*/)/*:Date*/ {
|
||||
var fixdate = browser ? parseDate("2014-02-19T14:30:00.000Z") : new Date("2014-02-19T14:30Z");
|
||||
|
||||
describe('roundtrip features', function() {
|
||||
var bef = (function() { X = require(modp); });
|
||||
var bef = (function() { X = require(modp); XLSX_ZAHL=require("./dist/xlsx.zahl"); });
|
||||
if(typeof before != 'undefined') before(bef);
|
||||
else it('before', bef);
|
||||
describe('should preserve core properties', function() { [
|
||||
@ -1864,7 +1869,7 @@ describe('json output', function() {
|
||||
var ws2 = X.utils.aoa_to_sheet(data), json = X.utils.sheet_to_json(ws2);
|
||||
assert.equal(json[0]["1"], true);
|
||||
assert.equal(json[2]["3"], "qux");
|
||||
ws2["!rows"] = [null,{hidden:true},null,null]; json = X.utils.sheet_to_json(ws2, {skipHidden: 1});
|
||||
ws2["!rows"] = [null,{hidden:true},null,null]; json = X.utils.sheet_to_json(ws2, {skipHidden: true});
|
||||
assert.equal(json[0]["1"], "foo");
|
||||
assert.equal(json[1]["3"], "qux");
|
||||
});
|
||||
@ -2521,7 +2526,7 @@ describe('corner cases', function() {
|
||||
//assert.equal(d.y, 2018);
|
||||
}
|
||||
[true, false].forEach(function(cD) {
|
||||
[null, 'yyyy-mm-dd'].forEach(function(dNF) {
|
||||
[void 0, 'yyyy-mm-dd'].forEach(function(dNF) {
|
||||
var ws1 = X.read(
|
||||
'7,2018-03-24',
|
||||
{cellDates: cD, dateNF: dNF, type:'string'}
|
||||
|
80
xlsx.flow.js
80
xlsx.flow.js
@ -5339,10 +5339,10 @@ var RELS = ({
|
||||
XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata",
|
||||
TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment",
|
||||
PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person",
|
||||
CONN: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections",
|
||||
VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
|
||||
}/*:any*/);
|
||||
|
||||
|
||||
/* 9.3.3 Representing Relationships */
|
||||
function get_rels_path(file/*:string*/)/*:string*/ {
|
||||
var n = file.lastIndexOf("/");
|
||||
@ -8997,16 +8997,88 @@ var WK_ = /*#__PURE__*/(function() {
|
||||
]; */
|
||||
/* TODO: flesh out */
|
||||
var FuncTab = {
|
||||
0x1F: ["NA", 0],
|
||||
// 0x20: ["ERR", 0],
|
||||
0x21: ["ABS", 1],
|
||||
0x22: ["TRUNC", 1],
|
||||
0x23: ["SQRT", 1],
|
||||
0x24: ["LOG", 1],
|
||||
0x25: ["LN", 1],
|
||||
0x26: ["PI", 0],
|
||||
0x27: ["SIN", 1],
|
||||
0x28: ["COS", 1],
|
||||
0x29: ["TAN", 1],
|
||||
0x2A: ["ATAN2", 2],
|
||||
0x2B: ["ATAN", 1],
|
||||
0x2C: ["ASIN", 1],
|
||||
0x2D: ["ACOS", 1],
|
||||
0x2E: ["EXP", 1],
|
||||
0x2F: ["MOD", 2],
|
||||
// 0x30
|
||||
0x31: ["ISNA", 1],
|
||||
0x32: ["ISERR", 1],
|
||||
0x33: ["FALSE", 0],
|
||||
0x34: ["TRUE", 0],
|
||||
0x35: ["RAND", 0],
|
||||
// 0x36 DATE
|
||||
// 0x37 NOW
|
||||
// 0x38 PMT
|
||||
// 0x39 PV
|
||||
// 0x3A FV
|
||||
// 0x3B IF
|
||||
// 0x3C DAY
|
||||
// 0x3D MONTH
|
||||
// 0x3E YEAR
|
||||
0x3F: ["ROUND", 2],
|
||||
// 0x40 TIME
|
||||
// 0x41 HOUR
|
||||
// 0x42 MINUTE
|
||||
// 0x43 SECOND
|
||||
0x44: ["ISNUMBER", 1],
|
||||
0x45: ["ISTEXT", 1],
|
||||
0x46: ["LEN", 1],
|
||||
0x47: ["VALUE", 1],
|
||||
// 0x48: ["FIXED", ?? 1],
|
||||
0x49: ["MID", 3],
|
||||
0x4A: ["CHAR", 1],
|
||||
// 0x4B
|
||||
// 0x4C FIND
|
||||
// 0x4D DATEVALUE
|
||||
// 0x4E TIMEVALUE
|
||||
// 0x4F CELL
|
||||
0x50: ["SUM", 69],
|
||||
0x51: ["AVERAGEA", 69],
|
||||
0x52: ["COUNTA", 69],
|
||||
0x53: ["MINA", 69],
|
||||
0x54: ["MAXA", 69],
|
||||
// 0x55 VLOOKUP
|
||||
// 0x56 NPV
|
||||
// 0x57 VAR
|
||||
// 0x58 STD
|
||||
// 0x59 IRR
|
||||
// 0x5A HLOOKUP
|
||||
// 0x5B DSUM
|
||||
// 0x5C DAVERAGE
|
||||
// 0x5D DCOUNTA
|
||||
// 0x5E DMIN
|
||||
// 0x5F DMAX
|
||||
// 0x60 DVARP
|
||||
// 0x61 DSTDEVP
|
||||
// 0x62 INDEX
|
||||
// 0x63 COLS
|
||||
// 0x64 ROWS
|
||||
// 0x65 REPEAT
|
||||
0x66: ["UPPER", 1],
|
||||
0x67: ["LOWER", 1],
|
||||
// 0x68 LEFT
|
||||
// 0x69 RIGHT
|
||||
// 0x6A REPLACE
|
||||
0x6B: ["PROPER", 1],
|
||||
// 0x6C CELL
|
||||
0x6D: ["TRIM", 1],
|
||||
// 0x6E CLEAN
|
||||
0x6F: ["T", 1]
|
||||
// 0x70 V
|
||||
};
|
||||
var BinOpTab = [
|
||||
"", "", "", "", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs
|
||||
@ -24680,6 +24752,12 @@ function sheet_set_array_formula(ws/*:Worksheet*/, range, formula/*:string*/, dy
|
||||
if(dynamic) cell.D = true;
|
||||
}
|
||||
}
|
||||
var wsr = decode_range(ws["!ref"]);
|
||||
if(wsr.s.r > rng.s.r) wsr.s.r = rng.s.r;
|
||||
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
|
||||
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
|
||||
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
|
||||
ws["!ref"] = encode_range(ws["!ref"]);
|
||||
return ws;
|
||||
}
|
||||
|
||||
|
80
xlsx.js
generated
80
xlsx.js
generated
@ -5254,10 +5254,10 @@ var RELS = ({
|
||||
XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata",
|
||||
TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment",
|
||||
PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person",
|
||||
CONN: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections",
|
||||
VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
|
||||
});
|
||||
|
||||
|
||||
/* 9.3.3 Representing Relationships */
|
||||
function get_rels_path(file) {
|
||||
var n = file.lastIndexOf("/");
|
||||
@ -8907,16 +8907,88 @@ var WK_ = (function() {
|
||||
]; */
|
||||
/* TODO: flesh out */
|
||||
var FuncTab = {
|
||||
0x1F: ["NA", 0],
|
||||
// 0x20: ["ERR", 0],
|
||||
0x21: ["ABS", 1],
|
||||
0x22: ["TRUNC", 1],
|
||||
0x23: ["SQRT", 1],
|
||||
0x24: ["LOG", 1],
|
||||
0x25: ["LN", 1],
|
||||
0x26: ["PI", 0],
|
||||
0x27: ["SIN", 1],
|
||||
0x28: ["COS", 1],
|
||||
0x29: ["TAN", 1],
|
||||
0x2A: ["ATAN2", 2],
|
||||
0x2B: ["ATAN", 1],
|
||||
0x2C: ["ASIN", 1],
|
||||
0x2D: ["ACOS", 1],
|
||||
0x2E: ["EXP", 1],
|
||||
0x2F: ["MOD", 2],
|
||||
// 0x30
|
||||
0x31: ["ISNA", 1],
|
||||
0x32: ["ISERR", 1],
|
||||
0x33: ["FALSE", 0],
|
||||
0x34: ["TRUE", 0],
|
||||
0x35: ["RAND", 0],
|
||||
// 0x36 DATE
|
||||
// 0x37 NOW
|
||||
// 0x38 PMT
|
||||
// 0x39 PV
|
||||
// 0x3A FV
|
||||
// 0x3B IF
|
||||
// 0x3C DAY
|
||||
// 0x3D MONTH
|
||||
// 0x3E YEAR
|
||||
0x3F: ["ROUND", 2],
|
||||
// 0x40 TIME
|
||||
// 0x41 HOUR
|
||||
// 0x42 MINUTE
|
||||
// 0x43 SECOND
|
||||
0x44: ["ISNUMBER", 1],
|
||||
0x45: ["ISTEXT", 1],
|
||||
0x46: ["LEN", 1],
|
||||
0x47: ["VALUE", 1],
|
||||
// 0x48: ["FIXED", ?? 1],
|
||||
0x49: ["MID", 3],
|
||||
0x4A: ["CHAR", 1],
|
||||
// 0x4B
|
||||
// 0x4C FIND
|
||||
// 0x4D DATEVALUE
|
||||
// 0x4E TIMEVALUE
|
||||
// 0x4F CELL
|
||||
0x50: ["SUM", 69],
|
||||
0x51: ["AVERAGEA", 69],
|
||||
0x52: ["COUNTA", 69],
|
||||
0x53: ["MINA", 69],
|
||||
0x54: ["MAXA", 69],
|
||||
// 0x55 VLOOKUP
|
||||
// 0x56 NPV
|
||||
// 0x57 VAR
|
||||
// 0x58 STD
|
||||
// 0x59 IRR
|
||||
// 0x5A HLOOKUP
|
||||
// 0x5B DSUM
|
||||
// 0x5C DAVERAGE
|
||||
// 0x5D DCOUNTA
|
||||
// 0x5E DMIN
|
||||
// 0x5F DMAX
|
||||
// 0x60 DVARP
|
||||
// 0x61 DSTDEVP
|
||||
// 0x62 INDEX
|
||||
// 0x63 COLS
|
||||
// 0x64 ROWS
|
||||
// 0x65 REPEAT
|
||||
0x66: ["UPPER", 1],
|
||||
0x67: ["LOWER", 1],
|
||||
// 0x68 LEFT
|
||||
// 0x69 RIGHT
|
||||
// 0x6A REPLACE
|
||||
0x6B: ["PROPER", 1],
|
||||
// 0x6C CELL
|
||||
0x6D: ["TRIM", 1],
|
||||
// 0x6E CLEAN
|
||||
0x6F: ["T", 1]
|
||||
// 0x70 V
|
||||
};
|
||||
var BinOpTab = [
|
||||
"", "", "", "", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs
|
||||
@ -24559,6 +24631,12 @@ function sheet_set_array_formula(ws, range, formula, dynamic) {
|
||||
if(dynamic) cell.D = true;
|
||||
}
|
||||
}
|
||||
var wsr = decode_range(ws["!ref"]);
|
||||
if(wsr.s.r > rng.s.r) wsr.s.r = rng.s.r;
|
||||
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
|
||||
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
|
||||
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
|
||||
ws["!ref"] = encode_range(ws["!ref"]);
|
||||
return ws;
|
||||
}
|
||||
|
||||
|
80
xlsx.mjs
generated
80
xlsx.mjs
generated
@ -5327,10 +5327,10 @@ var RELS = ({
|
||||
XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata",
|
||||
TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment",
|
||||
PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person",
|
||||
CONN: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections",
|
||||
VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
|
||||
}/*:any*/);
|
||||
|
||||
|
||||
/* 9.3.3 Representing Relationships */
|
||||
function get_rels_path(file/*:string*/)/*:string*/ {
|
||||
var n = file.lastIndexOf("/");
|
||||
@ -8985,16 +8985,88 @@ var WK_ = /*#__PURE__*/(function() {
|
||||
]; */
|
||||
/* TODO: flesh out */
|
||||
var FuncTab = {
|
||||
0x1F: ["NA", 0],
|
||||
// 0x20: ["ERR", 0],
|
||||
0x21: ["ABS", 1],
|
||||
0x22: ["TRUNC", 1],
|
||||
0x23: ["SQRT", 1],
|
||||
0x24: ["LOG", 1],
|
||||
0x25: ["LN", 1],
|
||||
0x26: ["PI", 0],
|
||||
0x27: ["SIN", 1],
|
||||
0x28: ["COS", 1],
|
||||
0x29: ["TAN", 1],
|
||||
0x2A: ["ATAN2", 2],
|
||||
0x2B: ["ATAN", 1],
|
||||
0x2C: ["ASIN", 1],
|
||||
0x2D: ["ACOS", 1],
|
||||
0x2E: ["EXP", 1],
|
||||
0x2F: ["MOD", 2],
|
||||
// 0x30
|
||||
0x31: ["ISNA", 1],
|
||||
0x32: ["ISERR", 1],
|
||||
0x33: ["FALSE", 0],
|
||||
0x34: ["TRUE", 0],
|
||||
0x35: ["RAND", 0],
|
||||
// 0x36 DATE
|
||||
// 0x37 NOW
|
||||
// 0x38 PMT
|
||||
// 0x39 PV
|
||||
// 0x3A FV
|
||||
// 0x3B IF
|
||||
// 0x3C DAY
|
||||
// 0x3D MONTH
|
||||
// 0x3E YEAR
|
||||
0x3F: ["ROUND", 2],
|
||||
// 0x40 TIME
|
||||
// 0x41 HOUR
|
||||
// 0x42 MINUTE
|
||||
// 0x43 SECOND
|
||||
0x44: ["ISNUMBER", 1],
|
||||
0x45: ["ISTEXT", 1],
|
||||
0x46: ["LEN", 1],
|
||||
0x47: ["VALUE", 1],
|
||||
// 0x48: ["FIXED", ?? 1],
|
||||
0x49: ["MID", 3],
|
||||
0x4A: ["CHAR", 1],
|
||||
// 0x4B
|
||||
// 0x4C FIND
|
||||
// 0x4D DATEVALUE
|
||||
// 0x4E TIMEVALUE
|
||||
// 0x4F CELL
|
||||
0x50: ["SUM", 69],
|
||||
0x51: ["AVERAGEA", 69],
|
||||
0x52: ["COUNTA", 69],
|
||||
0x53: ["MINA", 69],
|
||||
0x54: ["MAXA", 69],
|
||||
// 0x55 VLOOKUP
|
||||
// 0x56 NPV
|
||||
// 0x57 VAR
|
||||
// 0x58 STD
|
||||
// 0x59 IRR
|
||||
// 0x5A HLOOKUP
|
||||
// 0x5B DSUM
|
||||
// 0x5C DAVERAGE
|
||||
// 0x5D DCOUNTA
|
||||
// 0x5E DMIN
|
||||
// 0x5F DMAX
|
||||
// 0x60 DVARP
|
||||
// 0x61 DSTDEVP
|
||||
// 0x62 INDEX
|
||||
// 0x63 COLS
|
||||
// 0x64 ROWS
|
||||
// 0x65 REPEAT
|
||||
0x66: ["UPPER", 1],
|
||||
0x67: ["LOWER", 1],
|
||||
// 0x68 LEFT
|
||||
// 0x69 RIGHT
|
||||
// 0x6A REPLACE
|
||||
0x6B: ["PROPER", 1],
|
||||
// 0x6C CELL
|
||||
0x6D: ["TRIM", 1],
|
||||
// 0x6E CLEAN
|
||||
0x6F: ["T", 1]
|
||||
// 0x70 V
|
||||
};
|
||||
var BinOpTab = [
|
||||
"", "", "", "", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs
|
||||
@ -24668,6 +24740,12 @@ function sheet_set_array_formula(ws/*:Worksheet*/, range, formula/*:string*/, dy
|
||||
if(dynamic) cell.D = true;
|
||||
}
|
||||
}
|
||||
var wsr = decode_range(ws["!ref"]);
|
||||
if(wsr.s.r > rng.s.r) wsr.s.r = rng.s.r;
|
||||
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
|
||||
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
|
||||
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
|
||||
ws["!ref"] = encode_range(ws["!ref"]);
|
||||
return ws;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user