forked from sheetjs/sheetjs
works minutiae
This commit is contained in:
parent
b3bc49afe8
commit
d6161103b1
3
.gitignore
vendored
3
.gitignore
vendored
@ -15,7 +15,7 @@ tmp
|
||||
*.[pP][dD][fF]
|
||||
*.[sS][lL][kK]
|
||||
*.socialcalc
|
||||
*.[xX][lL][sSwWcCaAtTmM]
|
||||
*.[xX][lL][sSwWcCaAtTmMrR]
|
||||
*.[xX][lL][sSaAtT][xXmMbB]
|
||||
*.[oO][dD][sS]
|
||||
*.[fF][oO][dD][sS]
|
||||
@ -23,6 +23,7 @@ tmp
|
||||
*.[uU][oO][sS]
|
||||
*.[wW][kKqQbB][S1234567890]
|
||||
*.[qQ][pP][wW]
|
||||
*.[fF][mM][3tT]
|
||||
*.[bB][iI][fF][fF][23458]
|
||||
*.[rR][tT][fF]
|
||||
*.[eE][tT][hH]
|
||||
|
@ -59,6 +59,15 @@ webpack
|
||||
weex
|
||||
|
||||
# Other terms
|
||||
1.x
|
||||
2.x
|
||||
3.x
|
||||
4.x
|
||||
5.x
|
||||
6.x
|
||||
7.x
|
||||
8.x
|
||||
9.x
|
||||
ActiveX
|
||||
APIs
|
||||
ArrayBuffer
|
||||
|
49
Makefile
49
Makefile
@ -25,7 +25,7 @@ FLOWAUX=$(patsubst %.js,%.flow.js,$(AUXTARGETS))
|
||||
AUXSCPTS=xlsxworker.js
|
||||
FLOWTGTS=$(TARGET) $(AUXTARGETS) $(AUXSCPTS) $(MINITGT)
|
||||
UGLIFYOPTS=--support-ie8 -m
|
||||
# CLOSURE=/usr/local/lib/node_modules/google-closure-compiler/compiler.jar
|
||||
CLOSURE=/usr/local/lib/node_modules/google-closure-compiler/compiler.jar
|
||||
|
||||
## Main Targets
|
||||
|
||||
@ -73,7 +73,7 @@ DISTHDR=misc/suppress_export.js
|
||||
.PHONY: dist
|
||||
dist: dist-deps $(TARGET) bower.json ## Prepare JS files for distribution
|
||||
mkdir -p dist
|
||||
<$(TARGET) sed "s/require('stream')/{}/g;s/require('....*')/undefined/g" > dist/$(TARGET)
|
||||
<$(TARGET) sed "s/require('....*')/undefined/g" > dist/$(TARGET)
|
||||
cp LICENSE dist/
|
||||
uglifyjs shim.js $(UGLIFYOPTS) -o dist/shim.min.js --preamble "$$(head -n 1 bits/00_header.js)"
|
||||
uglifyjs $(DISTHDR) dist/$(TARGET) $(UGLIFYOPTS) -o dist/$(LIB).min.js --source-map dist/$(LIB).min.map --preamble "$$(head -n 1 bits/00_header.js)"
|
||||
@ -148,47 +148,6 @@ ctest: ## Build browser test fixtures
|
||||
ctestserv: ## Start a test server on port 8000
|
||||
@cd tests && python -mSimpleHTTPServer
|
||||
|
||||
## Demos
|
||||
|
||||
DEMOS=angular angular-new browserify requirejs rollup systemjs webpack
|
||||
DEMOTGTS=$(patsubst %,demo-%,$(DEMOS))
|
||||
.PHONY: demos
|
||||
demos: $(DEMOTGTS)
|
||||
|
||||
.PHONY: demo-angular
|
||||
demo-angular: ## Run angular demo build
|
||||
#make -C demos/angular
|
||||
@echo "start a local server and go to demos/angular/angular.html"
|
||||
|
||||
.PHONY: demo-angular-new
|
||||
demo-angular-new: ## Run angular 2 demo build
|
||||
make -C demos/angular2
|
||||
@echo "go to demos/angular/angular.html and run 'ng serve'"
|
||||
|
||||
.PHONY: demo-browserify
|
||||
demo-browserify: ## Run browserify demo build
|
||||
make -C demos/browserify
|
||||
@echo "start a local server and go to demos/browserify/browserify.html"
|
||||
|
||||
.PHONY: demo-webpack
|
||||
demo-webpack: ## Run webpack demo build
|
||||
make -C demos/webpack
|
||||
@echo "start a local server and go to demos/webpack/webpack.html"
|
||||
|
||||
.PHONY: demo-requirejs
|
||||
demo-requirejs: ## Run requirejs demo build
|
||||
make -C demos/requirejs
|
||||
@echo "start a local server and go to demos/requirejs/requirejs.html"
|
||||
|
||||
.PHONY: demo-rollup
|
||||
demo-rollup: ## Run rollup demo build
|
||||
make -C demos/rollup
|
||||
@echo "start a local server and go to demos/rollup/rollup.html"
|
||||
|
||||
.PHONY: demo-systemjs
|
||||
demo-systemjs: ## Run systemjs demo build
|
||||
make -C demos/systemjs
|
||||
|
||||
## Code Checking
|
||||
|
||||
.PHONY: fullint
|
||||
@ -197,7 +156,7 @@ fullint: lint mdlint ## Run all checks (removed: old-lint, tslint, flow)
|
||||
.PHONY: lint
|
||||
lint: $(TARGET) $(AUXTARGETS) ## Run eslint checks
|
||||
@./node_modules/.bin/eslint --ext .js,.njs,.json,.html,.htm $(TARGET) $(AUXTARGETS) $(CMDS) $(HTMLLINT) package.json bower.json
|
||||
if [ -n "$(CLOSURE-)" ] && [ -e "${CLOSURE}" ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
|
||||
@if [ -x "$(CLOSURE)" ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
|
||||
|
||||
.PHONY: old-lint
|
||||
old-lint: $(TARGET) $(AUXTARGETS) ## Run jshint and jscs checks
|
||||
@ -206,7 +165,7 @@ old-lint: $(TARGET) $(AUXTARGETS) ## Run jshint and jscs checks
|
||||
@./node_modules/.bin/jshint --show-non-errors package.json bower.json test.js
|
||||
@./node_modules/.bin/jshint --show-non-errors --extract=always $(HTMLLINT)
|
||||
@./node_modules/.bin/jscs $(TARGET) $(AUXTARGETS) test.js
|
||||
if [ -e $(CLOSURE) ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
|
||||
@if [ -x "$(CLOSURE)" ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
|
||||
|
||||
.PHONY: tslint
|
||||
tslint: $(TARGET) ## Run typescript checks
|
||||
|
@ -5,7 +5,7 @@
|
||||
var n = "xlsx";
|
||||
var X = require('../');
|
||||
try { X = require('../xlsx.flow'); } catch(e) {}
|
||||
require('exit-on-epipe');
|
||||
try { require('exit-on-epipe'); } catch(e) {}
|
||||
var fs = require('fs'), program;
|
||||
try { program = require('commander'); } catch(e) {
|
||||
[
|
||||
|
@ -30,7 +30,7 @@ function parse_rels(data/*:?string*/, currentFilePath/*:string*/) {
|
||||
var y = parsexmltag(x);
|
||||
/* 9.3.2.2 OPC_Relationships */
|
||||
if (y[0] === '<Relationship') {
|
||||
var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode;
|
||||
var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; if(y.TargetMode) rel.TargetMode = y.TargetMode;
|
||||
var canonictarget = y.TargetMode === 'External' ? y.Target : resolve_path(y.Target, currentFilePath);
|
||||
rels[canonictarget] = rel;
|
||||
hash[y.Id] = rel;
|
||||
|
@ -701,7 +701,9 @@ function parse_Lbl(blob, length, opts) {
|
||||
var name = parse_XLUnicodeStringNoCch(blob, cch, opts);
|
||||
if(flags & 0x20) name = XLSLblBuiltIn[name.charCodeAt(0)];
|
||||
var npflen = target - blob.l; if(opts && opts.biff == 2) --npflen;
|
||||
/*jshint -W018 */
|
||||
var rgce = (target == blob.l || cce === 0 || !(npflen > 0)) ? [] : parse_NameParsedFormula(blob, npflen, opts, cce);
|
||||
/*jshint +W018 */
|
||||
return {
|
||||
chKey: chKey,
|
||||
Name: name,
|
||||
|
@ -28,12 +28,18 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
if(!d) return d;
|
||||
var o = opts || {};
|
||||
if(DENSE != null && o.dense == null) o.dense = DENSE;
|
||||
var s/*:Worksheet*/ = ((o.dense ? [] : {})/*:any*/), n = "Sheet1", sidx = 0;
|
||||
var sheets = {}, snames = [n], realnames = [];
|
||||
var s/*:Worksheet*/ = ((o.dense ? [] : {})/*:any*/), n = "Sheet1", next_n = "", sidx = 0;
|
||||
var sheets = {}, snames = [], realnames = [];
|
||||
|
||||
var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
|
||||
var sheetRows = o.sheetRows || 0;
|
||||
|
||||
if(d[2] == 0x00) {
|
||||
if(d[3] == 0x08 || d[3] == 0x09) {
|
||||
if(d.length >= 16 && d[14] == 0x05 && d[15] === 0x6c) throw new Error("Unsupported Works 3 for Mac file");
|
||||
}
|
||||
}
|
||||
|
||||
if(d[2] == 0x02) {
|
||||
o.Enum = WK1Enum;
|
||||
lotushopper(d, function(val, R, RT) { switch(RT) {
|
||||
@ -42,6 +48,8 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
if(val >= 0x1000) o.qpro = true;
|
||||
break;
|
||||
case 0x06: refguess = val; break; /* RANGE */
|
||||
case 0xCC: if(val) next_n = val; break; /* SHEETNAMECS */
|
||||
case 0xDE: next_n = val; break; /* SHEETNAMELP */
|
||||
case 0x0F: /* LABEL */
|
||||
case 0x33: /* STRING */
|
||||
if(!o.qpro) val[1].v = val[1].v.slice(1);
|
||||
@ -54,6 +62,18 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
val[1].z = o.dateNF || SSF._table[14];
|
||||
if(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); }
|
||||
}
|
||||
|
||||
if(o.qpro) {
|
||||
if(val[3] > sidx) {
|
||||
s["!ref"] = encode_range(refguess);
|
||||
sheets[n] = s;
|
||||
snames.push(n);
|
||||
s = (o.dense ? [] : {});
|
||||
refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
|
||||
sidx = val[3]; n = next_n || "Sheet" + (sidx + 1); next_n = "";
|
||||
}
|
||||
}
|
||||
|
||||
var tmpcell = o.dense ? (s[val[0].r]||[])[val[0].c] : s[encode_cell(val[0])];
|
||||
if(tmpcell) {
|
||||
tmpcell.t = val[1].t; tmpcell.v = val[1].v;
|
||||
@ -72,6 +92,7 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
o.Enum = WK3Enum;
|
||||
if(d[2] == 0x0E) { o.qpro = true; d.l = 0; }
|
||||
lotushopper(d, function(val, R, RT) { switch(RT) {
|
||||
case 0xCC: n = val; break; /* SHEETNAMECS */
|
||||
case 0x16: /* LABEL16 */
|
||||
val[1].v = val[1].v.slice(1);
|
||||
/* falls through */
|
||||
@ -84,10 +105,10 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
if(val[3] > sidx) {
|
||||
s["!ref"] = encode_range(refguess);
|
||||
sheets[n] = s;
|
||||
snames.push(n);
|
||||
s = (o.dense ? [] : {});
|
||||
refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
|
||||
sidx = val[3]; n = "Sheet" + (sidx + 1);
|
||||
snames.push(n);
|
||||
}
|
||||
if(sheetRows > 0 && val[0].r >= sheetRows) break;
|
||||
if(o.dense) {
|
||||
@ -100,17 +121,23 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
case 0x1B: /* XFORMAT */
|
||||
if(val[0x36b0]) realnames[val[0x36b0][0]] = val[0x36b0][1];
|
||||
break;
|
||||
case 0x0601: /* SHEETINFOQP */
|
||||
realnames[val[0]] = val[1]; if(val[0] == sidx) n = val[1]; break;
|
||||
default: break;
|
||||
}}, o);
|
||||
} else throw new Error("Unrecognized LOTUS BOF " + d[2]);
|
||||
|
||||
s["!ref"] = encode_range(refguess);
|
||||
sheets[n] = s;
|
||||
sheets[next_n || n] = s;
|
||||
snames.push(next_n || n);
|
||||
if(!realnames.length) return { SheetNames: snames, Sheets: sheets };
|
||||
var osheets = {}, rnames = [];
|
||||
/* TODO: verify no collisions */
|
||||
for(var i = 0; i < realnames.length; ++i) if(sheets[snames[i]]) {
|
||||
rnames.push(realnames[i] || snames[i]);
|
||||
osheets[realnames[i]] = sheets[realnames[i]] || sheets[snames[i]];
|
||||
} else {
|
||||
rnames.push(realnames[i]);
|
||||
osheets[realnames[i]] = sheets[snames[i]];
|
||||
osheets[realnames[i]] = ({ "!ref": "A1" });
|
||||
}
|
||||
return { SheetNames: rnames, Sheets: osheets };
|
||||
}
|
||||
@ -126,7 +153,8 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
|
||||
write_biff_rec(ba, 0x00, write_BOF_WK1(0x0406));
|
||||
write_biff_rec(ba, 0x06, write_RANGE(range));
|
||||
for(var R = range.s.r; R <= range.e.r; ++R) {
|
||||
var max_R = Math.min(range.e.r, 8191);
|
||||
for(var R = range.s.r; R <= max_R; ++R) {
|
||||
var rr = encode_row(R);
|
||||
for(var C = range.s.c; C <= range.e.c; ++C) {
|
||||
if(R === range.s.r) cols[C] = encode_col(C);
|
||||
@ -165,7 +193,8 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
var range = safe_decode_range(ws["!ref"]);
|
||||
var dense = Array.isArray(ws);
|
||||
var cols = [];
|
||||
for(var R = range.s.r; R <= range.e.r; ++R) {
|
||||
var max_R = Math.min(range.e.r, 8191);
|
||||
for(var R = range.s.r; R <= max_R; ++R) {
|
||||
var rr = encode_row(R);
|
||||
for(var C = range.s.c; C <= range.e.c; ++C) {
|
||||
if(R === range.s.r) cols[C] = encode_col(C);
|
||||
@ -211,6 +240,7 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
if(rows < range.e.r) rows = range.e.r;
|
||||
if(cols < range.e.c) cols = range.e.c;
|
||||
}
|
||||
if(rows > 8191) rows = 8191;
|
||||
out.write_shift(2, rows);
|
||||
out.write_shift(1, wscnt);
|
||||
out.write_shift(1, cols);
|
||||
@ -223,12 +253,23 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
return out;
|
||||
}
|
||||
|
||||
function parse_RANGE(blob) {
|
||||
function parse_RANGE(blob, length, opts) {
|
||||
var o = {s:{c:0,r:0},e:{c:0,r:0}};
|
||||
if(length == 8 && opts.qpro) {
|
||||
o.s.c = blob.read_shift(1);
|
||||
blob.l++;
|
||||
o.s.r = blob.read_shift(2);
|
||||
o.e.c = blob.read_shift(1);
|
||||
blob.l++;
|
||||
o.e.r = blob.read_shift(2);
|
||||
return o;
|
||||
}
|
||||
o.s.c = blob.read_shift(2);
|
||||
o.s.r = blob.read_shift(2);
|
||||
if(length == 12 && opts.qpro) blob.l += 2;
|
||||
o.e.c = blob.read_shift(2);
|
||||
o.e.r = blob.read_shift(2);
|
||||
if(length == 12 && opts.qpro) blob.l += 2;
|
||||
if(o.s.c == 0xFFFF) o.s.c = o.e.c = o.s.r = o.e.r = 0;
|
||||
return o;
|
||||
}
|
||||
@ -242,10 +283,10 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
}
|
||||
|
||||
function parse_cell(blob, length, opts) {
|
||||
var o = [{c:0,r:0}, {t:'n',v:0}, 0];
|
||||
var o = [{c:0,r:0}, {t:'n',v:0}, 0, 0];
|
||||
if(opts.qpro && opts.vers != 0x5120) {
|
||||
o[0].c = blob.read_shift(1);
|
||||
blob.l++;
|
||||
o[3] = blob.read_shift(1);
|
||||
o[0].r = blob.read_shift(2);
|
||||
blob.l+=2;
|
||||
} else {
|
||||
@ -357,7 +398,7 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
|
||||
function wk1_fmla_to_csf(blob, o) {
|
||||
prep_blob(blob, 0);
|
||||
var out = [], argc = 0, R = "", C = "";
|
||||
var out = [], argc = 0, R = "", C = "", argL = "", argR = "";
|
||||
while(blob.l < blob.length) {
|
||||
var cc = blob[blob.l++];
|
||||
switch(cc) {
|
||||
@ -390,7 +431,7 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
case 0x16: out.push("NOT(" + out.pop() + ")"); break;
|
||||
|
||||
case 0x14: case 0x15: {
|
||||
var argR = out.pop(), argL = out.pop();
|
||||
argR = out.pop(); argL = out.pop();
|
||||
out.push(["AND", "OR"][cc - 0x14] + "(" + argL + "," + argR + ")");
|
||||
} break;
|
||||
|
||||
@ -536,6 +577,27 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
return o;
|
||||
}
|
||||
|
||||
function parse_SHEETNAMECS(blob, length) {
|
||||
return blob[blob.l + length - 1] == 0 ? blob.read_shift(length, 'cstr') : "";
|
||||
}
|
||||
|
||||
function parse_SHEETNAMELP(blob, length) {
|
||||
var len = blob[blob.l++];
|
||||
if(len > length - 1) len = length - 1;
|
||||
var o = ""; while(o.length < len) o += String.fromCharCode(blob[blob.l++]);
|
||||
return o;
|
||||
}
|
||||
|
||||
function parse_SHEETINFOQP(blob, length, opts) {
|
||||
if(!opts.qpro || length < 21) return;
|
||||
var id = blob.read_shift(1);
|
||||
blob.l += 17;
|
||||
var len = blob.read_shift(1);
|
||||
blob.l += 2;
|
||||
var nm = blob.read_shift(length - 21, 'cstr');
|
||||
return [id, nm];
|
||||
}
|
||||
|
||||
function parse_XFORMAT(blob, length) {
|
||||
var o = {}, tgt = blob.l + length;
|
||||
while(blob.l < tgt) {
|
||||
@ -623,6 +685,8 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
/*::[*/0x0067/*::]*/: { n:"RRANGES??" },
|
||||
/*::[*/0x0068/*::]*/: { n:"FNAME??" },
|
||||
/*::[*/0x0069/*::]*/: { n:"MRANGES??" },
|
||||
/*::[*/0x00CC/*::]*/: { n:"SHEETNAMECS", f:parse_SHEETNAMECS },
|
||||
/*::[*/0x00DE/*::]*/: { n:"SHEETNAMELP", f:parse_SHEETNAMELP },
|
||||
/*::[*/0xFFFF/*::]*/: { n:"" }
|
||||
};
|
||||
|
||||
@ -688,6 +752,7 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
/*::[*/0x00BC/*::]*/: { n:"??" },
|
||||
/*::[*/0x00C3/*::]*/: { n:"??" },
|
||||
/*::[*/0x00C9/*::]*/: { n:"??" },
|
||||
/*::[*/0x00CC/*::]*/: { n:"SHEETNAMECS", f:parse_SHEETNAMECS },
|
||||
/*::[*/0x00CD/*::]*/: { n:"??" },
|
||||
/*::[*/0x00CE/*::]*/: { n:"??" },
|
||||
/*::[*/0x00CF/*::]*/: { n:"??" },
|
||||
@ -732,6 +797,7 @@ var WK_ = /*#__PURE__*/ (function() {
|
||||
/*::[*/0x029A/*::]*/: { n:"??" },
|
||||
/*::[*/0x0300/*::]*/: { n:"??" },
|
||||
/*::[*/0x0304/*::]*/: { n:"??" },
|
||||
/*::[*/0x0601/*::]*/: { n:"SHEETINFOQP", f:parse_SHEETINFOQP },
|
||||
/*::[*/0x0640/*::]*/: { n:"??" },
|
||||
/*::[*/0x0642/*::]*/: { n:"??" },
|
||||
/*::[*/0x0701/*::]*/: { n:"??" },
|
||||
|
@ -855,7 +855,9 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
|
||||
if(!options.bookSheets) wb.Sheets=Sheets;
|
||||
if(!wb.SheetNames.length && Preamble["!ref"]) {
|
||||
wb.SheetNames.push("Sheet1");
|
||||
/*jshint -W069 */
|
||||
if(wb.Sheets) wb.Sheets["Sheet1"] = Preamble;
|
||||
/*jshint +W069 */
|
||||
} else wb.Preamble=Preamble;
|
||||
if(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });
|
||||
wb.Strings = sst;
|
||||
@ -950,6 +952,8 @@ else/*:: if(cfb instanceof CFBContainer) */ {
|
||||
else if((_data=CFB.find(cfb, 'PerfectOffice_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
|
||||
/* Quattro Pro 9 */
|
||||
else if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
|
||||
/* Works 4 for Mac */
|
||||
else if((_data=CFB.find(cfb, 'MN0')) && _data.content) throw new Error("Unsupported Works 4 for Mac file");
|
||||
else throw new Error("Cannot find Workbook stream");
|
||||
if(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
|
||||
}
|
||||
|
@ -842,7 +842,9 @@ var XLSBRecordEnum = {
|
||||
};
|
||||
|
||||
var XLSBRE = evert_key(XLSBRecordEnum, 'n');
|
||||
/*jshint -W069 */
|
||||
XLSBRE["BrtFRTArchID$"] = 0x0010;
|
||||
/*jshint +W069 */
|
||||
|
||||
/* [MS-XLS] 2.3 Record Enumeration (and other sources) */
|
||||
var XLSRecordEnum = {
|
||||
|
@ -1,13 +1,15 @@
|
||||
/* OpenDocument */
|
||||
var write_styles_ods/*:{(wb:any, opts:any):string}*/ = (function() {
|
||||
var master_styles = '<office:master-styles>'
|
||||
+ '<style:master-page style:name="mp1" style:page-layout-name="mp1">'
|
||||
+ '<style:header/>'
|
||||
+ '<style:header-left style:display="false"/>'
|
||||
+ '<style:footer/>'
|
||||
+ '<style:footer-left style:display="false"/>'
|
||||
+ '</style:master-page>'
|
||||
+ '</office:master-styles>';
|
||||
var master_styles = [
|
||||
'<office:master-styles>',
|
||||
'<style:master-page style:name="mp1" style:page-layout-name="mp1">',
|
||||
'<style:header/>',
|
||||
'<style:header-left style:display="false"/>',
|
||||
'<style:footer/>',
|
||||
'<style:footer-left style:display="false"/>',
|
||||
'</style:master-page>',
|
||||
'</office:master-styles>'
|
||||
].join("");
|
||||
|
||||
var payload = '<office:document-styles ' + wxt_helper({
|
||||
'xmlns:office': "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
|
||||
|
@ -91,12 +91,20 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
case 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break;
|
||||
case 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str);
|
||||
case 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);
|
||||
case 0xFF: if(n[1] === 0xFE) { return read_utf16(d, o); } break;
|
||||
case 0x00: if(n[1] === 0x00 && n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o); break;
|
||||
case 0xFF:
|
||||
if(n[1] === 0xFE) { return read_utf16(d, o); }
|
||||
else if(n[1] === 0x00 && n[2] === 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);
|
||||
break;
|
||||
case 0x00:
|
||||
if(n[1] === 0x00) {
|
||||
if(n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);
|
||||
if(n[2] === 0x00 && (n[3] === 0x08 || n[3] === 0x09)) return WK_.to_workbook(d, o);
|
||||
}
|
||||
break;
|
||||
case 0x03: case 0x83: case 0x8B: case 0x8C: return DBF.to_workbook(d, o);
|
||||
case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break;
|
||||
case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o);
|
||||
case 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet"); break;
|
||||
case 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet"); break;
|
||||
}
|
||||
if(DBF.versions.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);
|
||||
return read_prn(data, d, o, str);
|
||||
|
@ -1,5 +1,8 @@
|
||||
if(has_buf && typeof require != 'undefined') (function() {
|
||||
var Readable = require('stream').Readable;
|
||||
var strmod = require('stream');
|
||||
if(!strmod) return;
|
||||
var Readable = strmod.Readable;
|
||||
if(!Readable) return;
|
||||
|
||||
var write_csv_stream = function(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
|
||||
var stream = Readable();
|
||||
|
@ -6,6 +6,6 @@ else if(typeof module !== 'undefined' && module.exports) make_xlsx_lib(module.ex
|
||||
else if(typeof define === 'function' && define.amd) define('xlsx', function() { if(!XLSX.version) make_xlsx_lib(XLSX); return XLSX; });
|
||||
else make_xlsx_lib(XLSX);
|
||||
/* NOTE: the following extra line is needed for "Lightning Locker Service" */
|
||||
if(typeof window !== 'undefined' && !window.XLSX) window.XLSX = XLSX;
|
||||
if(typeof window !== 'undefined' && !window.XLSX) try { window.XLSX = XLSX; } catch(e) {}
|
||||
/*exported XLS, ODS */
|
||||
var XLS = XLSX, ODS = XLSX;
|
||||
|
@ -85,7 +85,7 @@ file but Excel will know how to handle it. This library applies similar logic:
|
||||
|
||||
| Byte 0 | Raw File Type | Spreadsheet Types |
|
||||
|:-------|:--------------|:----------------------------------------------------|
|
||||
| `0xD0` | CFB Container | BIFF 5/8 or password-protected XLSX/XLSB or WQ3/QPW |
|
||||
| `0xD0` | CFB Container | BIFF 5/8 or protected XLSX/XLSB or WQ3/QPW or XLR |
|
||||
| `0x09` | BIFF Stream | BIFF 2/3/4/5 |
|
||||
| `0x3C` | XML/HTML | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
|
||||
| `0x50` | ZIP Archive | XLSB or XLSX/M or ODS or UOS2 or plain text |
|
||||
@ -102,6 +102,8 @@ file but Excel will know how to handle it. This library applies similar logic:
|
||||
DBF files are detected based on the first byte as well as the third and fourth
|
||||
bytes (corresponding to month and day of the file date)
|
||||
|
||||
Works for Windows files are detected based on the BOF record with type `0xFF`
|
||||
|
||||
Plain text format guessing follows the priority order:
|
||||
|
||||
| Format | Test |
|
||||
|
@ -27,6 +27,8 @@ Despite the library name `xlsx`, it supports numerous spreadsheet file formats:
|
||||
| Lotus 1-2-3 (WK1/WK3) | ✔ | ✔ |
|
||||
| Lotus 1-2-3 (WKS/WK2/WK4/123) | ✔ | |
|
||||
| Quattro Pro Spreadsheet (WQ1/WQ2/WB1/WB2/WB3/QPW) | ✔ | |
|
||||
| Works 1.x-3.x DOS / 2.x-5.x Windows Spreadsheet (WKS) | ✔ | |
|
||||
| Works 6.x-9.x Spreadsheet (XLR) | ✔ | |
|
||||
| **Other Common Spreadsheet Output Formats** |:-----:|:-----:|
|
||||
| HTML Tables | ✔ | ✔ |
|
||||
| Rich Text Format tables (RTF) | | ✔ |
|
||||
@ -44,6 +46,8 @@ range limits will be silently truncated:
|
||||
| Excel 4.0 (XLS BIFF4) | IV16384 | 256 | 16384 |
|
||||
| Excel 3.0 (XLS BIFF3) | IV16384 | 256 | 16384 |
|
||||
| Excel 2.0/2.1 (XLS BIFF2) | IV16384 | 256 | 16384 |
|
||||
| Lotus 1-2-3 R2 - R5 (WK1/WK3/WK4) | IV8192 | 256 | 8192 |
|
||||
| Lotus 1-2-3 R1 (WKS) | IV2048 | 256 | 2048 |
|
||||
|
||||
Excel 2003 SpreadsheetML range limits are governed by the version of Excel and
|
||||
are not enforced by the writer.
|
||||
@ -180,6 +184,27 @@ BIFF8 XLS.
|
||||
|
||||
</details>
|
||||
|
||||
#### Works for DOS / Windows Spreadsheet (WKS/XLR)
|
||||
|
||||
<details>
|
||||
<summary>(click to show)</summary>
|
||||
|
||||
All versions of Works were limited to a single worksheet.
|
||||
|
||||
Works for DOS 1.x - 3.x and Works for Windows 2.x extends the Lotus WKS format
|
||||
with additional record types.
|
||||
|
||||
Works for Windows 3.x - 5.x uses the same format and WKS extension. The BOF
|
||||
record has type `FF`
|
||||
|
||||
Works for Windows 6.x - 9.x use the XLR format. XLR is nearly identical to
|
||||
BIFF8 XLS: it uses the CFB container with a Workbook stream. Works 9 saves the
|
||||
exact Workbook stream for the XLR and the 97-2003 XLS export. Works 6 XLS
|
||||
includes two empty worksheets but the main worksheet has an identical encoding.
|
||||
XLR also includes a `WksSSWorkBook` stream similar to Lotus FM3/FMT files.
|
||||
|
||||
</details>
|
||||
|
||||
#### OpenDocument Spreadsheet (ODS/FODS)
|
||||
|
||||
<details>
|
||||
|
BIN
formats.png
BIN
formats.png
Binary file not shown.
Before Width: | Height: | Size: 443 KiB After Width: | Height: | Size: 191 KiB |
@ -2,8 +2,12 @@
|
||||
const fs = require('fs');
|
||||
const coarse = require('coarse');
|
||||
|
||||
const svg = fs.readFileSync(process.argv[2]);
|
||||
const roughened = coarse(svg);
|
||||
const svg = fs.readFileSync(process.argv[2], "utf8");
|
||||
let roughened = coarse(svg);
|
||||
const viewbox = roughened.match(/viewBox="(.*?)"/)[1].split(/\s+/);
|
||||
const v = viewbox.map(x => parseFloat(x));
|
||||
v[0] -= 40; v[1] += 40; v[2] += 80; v[3] += 80;
|
||||
roughened = roughened.replace(/<title>G<\/title>/, `$&<polygon fill="white" stroke="" points="${v[0]},${v[1]} ${v[0]},${v[1]-v[3]} ${v[0]+v[2]},${v[1]-v[3]} ${v[0]+v[2]},${v[1]} ${v[0]},${v[1]}"/>`);
|
||||
|
||||
fs.writeFileSync(process.argv[3], roughened);
|
||||
|
||||
|
@ -27,9 +27,15 @@ digraph G {
|
||||
slk [label="SYLK"];
|
||||
prn [label="PRN"];
|
||||
rtf [label="RTF"];
|
||||
wk1 [label="WK1/2\n123"];
|
||||
wk3 [label="WK3/4"];
|
||||
wqb [label="WQ*\nWB*"];
|
||||
wk1 [label="WK1"];
|
||||
wksl [label="WKS\nLotus"];
|
||||
wk3 [label="WK3"];
|
||||
wk4 [label="WK4"]
|
||||
123 [label="123"];
|
||||
wksm [label="WKS\nWorks"];
|
||||
xlr [label="XLR"];
|
||||
wq1 [label="WQ1"];
|
||||
wq2 [label="WQ2\nWB*"];
|
||||
qpw [label="QPW"];
|
||||
eth [label="ETH"];
|
||||
}
|
||||
@ -46,6 +52,7 @@ digraph G {
|
||||
xls5 -> csf
|
||||
csf -> xls8
|
||||
xls8 -> csf
|
||||
wq2 -> csf
|
||||
ods -> csf
|
||||
csf -> ods
|
||||
fods -> csf
|
||||
@ -53,6 +60,8 @@ digraph G {
|
||||
uos -> csf
|
||||
wk3 -> csf
|
||||
csf -> wk3
|
||||
wk4 -> csf
|
||||
123 -> csf
|
||||
qpw -> csf
|
||||
}
|
||||
subgraph WORKSHEET {
|
||||
@ -68,7 +77,10 @@ digraph G {
|
||||
csf -> dif
|
||||
wk1 -> csf
|
||||
csf -> wk1
|
||||
wqb -> csf
|
||||
xlr -> csf
|
||||
wq1 -> csf
|
||||
wksl -> csf
|
||||
wksm -> csf
|
||||
dif -> csf
|
||||
csf -> rtf
|
||||
prn -> csf
|
||||
|
2
test.js
2
test.js
@ -524,9 +524,11 @@ describe('parse options', function() {
|
||||
} } };
|
||||
var str = X.write(wb, {bookType: "xlsx", type: "binary"});
|
||||
var wb2 = X.read(str, {type: "binary"});
|
||||
/*jshint -W069 */
|
||||
assert.equal(wb2.Sheets.Sheet1["A1"].f, "IFS(2>3,1,3>2,2)");
|
||||
var wb3 = X.read(str, {type: "binary", xlfn: true});
|
||||
assert.equal(wb3.Sheets.Sheet1["A1"].f, "_xlfn.IFS(2>3,1,3>2,2)");
|
||||
/*jshint +W069 */
|
||||
});
|
||||
});
|
||||
describe('sheet', function() {
|
||||
|
2
tests/core.js
generated
2
tests/core.js
generated
@ -524,9 +524,11 @@ describe('parse options', function() {
|
||||
} } };
|
||||
var str = X.write(wb, {bookType: "xlsx", type: "binary"});
|
||||
var wb2 = X.read(str, {type: "binary"});
|
||||
/*jshint -W069 */
|
||||
assert.equal(wb2.Sheets.Sheet1["A1"].f, "IFS(2>3,1,3>2,2)");
|
||||
var wb3 = X.read(str, {type: "binary", xlfn: true});
|
||||
assert.equal(wb3.Sheets.Sheet1["A1"].f, "_xlfn.IFS(2>3,1,3>2,2)");
|
||||
/*jshint +W069 */
|
||||
});
|
||||
});
|
||||
describe('sheet', function() {
|
||||
|
Loading…
Reference in New Issue
Block a user