From 0b6ebc67da5fcff85da59b8c179337657929f2a5 Mon Sep 17 00:00:00 2001
From: SheetJS <dev@sheetjs.com>
Date: Thu, 10 Mar 2022 00:31:13 -0500
Subject: [PATCH] DBF preserve field properties

- DBF write type N and roundtrip C length (fixes #1888 h/t@bandizsolt)
- clean up xhr demo (fixes #2604 h/t @UP2022742)
- clean up vue / nuxt demo
---
 Makefile                          |   3 +-
 bits/00_header.js                 |   2 +-
 bits/40_harb.js                   |  53 ++++++++++++----
 bits/83_numbers.js                |   5 +-
 bits/90_utils.js                  |  11 +++-
 bits/97_node.js                   |  13 ++--
 demos/vue/Makefile                |   4 +-
 demos/vue/README.md               |  39 ++++++++----
 demos/vue/content/sheetjs.numbers | Bin 0 -> 98993 bytes
 demos/vue/native.vue              |   2 +-
 demos/vue/nuxt.config.js          |  30 ++++++---
 demos/vue/package.json            |   8 ++-
 demos/vue/pages/index.vue         | 100 +++++-------------------------
 demos/xhr/axios.html              |  22 +++++--
 demos/xhr/fetch.html              |  25 +++++---
 demos/xhr/server.js               |  15 +++--
 demos/xhr/superagent.html         |  30 ++++++---
 demos/xhr/xhr.html                |  29 ++++++---
 modules/83_numbers.js             |   5 +-
 modules/src/numbers.ts            |   5 +-
 test.mjs                          |  14 +++++
 test.ts                           |   9 +++
 types/index.d.ts                  |  18 ++++++
 xlsx.flow.js                      |  86 ++++++++++++++++++-------
 xlsx.js                           |  86 ++++++++++++++++++-------
 xlsx.mjs                          |  84 ++++++++++++++++++-------
 26 files changed, 456 insertions(+), 242 deletions(-)
 create mode 100755 demos/vue/content/sheetjs.numbers

diff --git a/Makefile b/Makefile
index b34317b..2b4e0d2 100644
--- a/Makefile
+++ b/Makefile
@@ -70,7 +70,8 @@ init: ## Initial setup for development
 	git submodule init
 	git submodule update
 	#git submodule foreach git pull origin master
-	git submodule foreach make
+	#git submodule foreach make
+	git submodule foreach make all
 	mkdir -p tmp
 
 DISTHDR=misc/suppress_export.js
diff --git a/bits/00_header.js b/bits/00_header.js
index ead5056..acd0919 100644
--- a/bits/00_header.js
+++ b/bits/00_header.js
@@ -1,6 +1,6 @@
 /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 /* vim: set ts=2: */
 /*exported XLSX */
-/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
+/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, Deno:false */
 var XLSX = {};
 function make_xlsx_lib(XLSX){
diff --git a/bits/40_harb.js b/bits/40_harb.js
index 980ba1d..2d8e0d8 100644
--- a/bits/40_harb.js
+++ b/bits/40_harb.js
@@ -204,7 +204,7 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
 					out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);
 					break;
 				case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;
-				case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;
+				case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4 + (dd.read_shift(4, 'i')/1e4)*Math.pow(2,32); break;
 				case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;
 				case 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; }
 					/* falls through */
@@ -218,13 +218,20 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
 	}
 	if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
 	if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
+	opts.DBF = fields;
 	return out;
 }
 
 function dbf_to_sheet(buf, opts)/*:Worksheet*/ {
 	var o = opts || {};
 	if(!o.dateNF) o.dateNF = "yyyymmdd";
-	return aoa_to_sheet(dbf_to_aoa(buf, o), o);
+	var ws = aoa_to_sheet(dbf_to_aoa(buf, o), o);
+	ws["!cols"] = o.DBF.map(function(field) { return {
+		wch: field.len,
+		DBF: field
+	}});
+	delete o.DBF;
+	return ws;
 }
 
 function dbf_to_workbook(buf, opts)/*:Workbook*/ {
@@ -240,10 +247,11 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 	if(o.type == "string") throw new Error("Cannot write DBF to JS string");
 	var ba = buf_array();
 	var aoa/*:AOA*/ = sheet_to_json(ws, {header:1, raw:true, cellDates:true});
-	var headers = aoa[0], data = aoa.slice(1);
+	var headers = aoa[0], data = aoa.slice(1), cols = ws["!cols"] || [];
 	var i = 0, j = 0, hcnt = 0, rlen = 1;
 	for(i = 0; i < headers.length; ++i) {
-		if(i == null) continue;
+		if(((cols[i]||{}).DBF||{}).name) { headers[i] = cols[i].DBF.name; ++hcnt; continue; }
+		if(headers[i] == null) continue;
 		++hcnt;
 		if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
 		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
@@ -252,13 +260,15 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 	}
 	var range = safe_decode_range(ws['!ref']);
 	var coltypes/*:Array<string>*/ = [];
+	var colwidths/*:Array<number>*/ = [];
+	var coldecimals/*:Array<number>*/ = [];
 	for(i = 0; i <= range.e.c - range.s.c; ++i) {
+		var guess = '', _guess = '', maxlen = 0;
 		var col/*:Array<any>*/ = [];
 		for(j=0; j < data.length; ++j) {
 			if(data[j][i] != null) col.push(data[j][i]);
 		}
 		if(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; }
-		var guess = '', _guess = '';
 		for(j = 0; j < col.length; ++j) {
 			switch(typeof col[j]) {
 				/* TODO: check if L2 compat is desired */
@@ -268,10 +278,23 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 				case 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break;
 				default: _guess = 'C';
 			}
+			maxlen = Math.max(maxlen, String(col[j]).length);
 			guess = guess && guess != _guess ? 'C' : _guess;
-			if(guess == 'C') break;
+			//if(guess == 'C') break;
 		}
-		rlen += _RLEN[guess] || 0;
+		if(maxlen > 250) maxlen = 250;
+		_guess = ((cols[i]||{}).DBF||{}).type;
+		/* TODO: more fine grained control over DBF type resolution */
+		if(_guess == 'C') {
+			if(cols[i].DBF.len > maxlen) maxlen = cols[i].DBF.len;
+		}
+		if(guess == 'B' && _guess == 'N') {
+			guess = 'N';
+			coldecimals[i] = cols[i].DBF.dec;
+			maxlen = cols[i].DBF.len;
+		}
+		colwidths[i] = guess == 'C' || _guess == 'N' ? maxlen : (_RLEN[guess] || 0);
+		rlen += colwidths[i];
 		coltypes[i] = guess;
 	}
 
@@ -290,14 +313,14 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 		hf.write_shift(1, _f, "sbcs");
 		hf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], "sbcs");
 		hf.write_shift(4, j);
-		hf.write_shift(1, _RLEN[coltypes[i]] || 0);
-		hf.write_shift(1, 0);
+		hf.write_shift(1, colwidths[i] || _RLEN[coltypes[i]] || 0);
+		hf.write_shift(1, coldecimals[i] || 0);
 		hf.write_shift(1, 0x02);
 		hf.write_shift(4, 0);
 		hf.write_shift(1, 0);
 		hf.write_shift(4, 0);
 		hf.write_shift(4, 0);
-		j += _RLEN[coltypes[i]] || 0;
+		j += (colwidths[i] || _RLEN[coltypes[i]] || 0);
 	}
 
 	var hb = ba.next(264);
@@ -311,6 +334,12 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 			switch(coltypes[j]) {
 				case 'L': rout.write_shift(1, data[i][j] == null ? 0x3F : data[i][j] ? 0x54 : 0x46); break;
 				case 'B': rout.write_shift(8, data[i][j]||0, 'f'); break;
+				case 'N':
+					var _n = "0";
+					if(typeof data[i][j] == "number") _n = data[i][j].toFixed(coldecimals[j]||0);
+					for(hcnt=0; hcnt < colwidths[j]-_n.length; ++hcnt) rout.write_shift(1, 0x20);
+					rout.write_shift(1, _n, "sbcs");
+					break;
 				case 'D':
 					if(!data[i][j]) rout.write_shift(8, "00000000", "sbcs");
 					else {
@@ -319,9 +348,9 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 						rout.write_shift(2, ("00"+data[i][j].getDate()).slice(-2), "sbcs");
 					} break;
 				case 'C':
-					var _s = String(data[i][j]||"");
+					var _s = String(data[i][j] != null ? data[i][j] : "").slice(0, colwidths[j]);
 					rout.write_shift(1, _s, "sbcs");
-					for(hcnt=0; hcnt < 250-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
+					for(hcnt=0; hcnt < colwidths[j]-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
 			}
 		}
 		// data
diff --git a/bits/83_numbers.js b/bits/83_numbers.js
index bce2b68..48a6637 100644
--- a/bits/83_numbers.js
+++ b/bits/83_numbers.js
@@ -442,13 +442,14 @@ var NUMBERS = !Object.defineProperty ? (void 0) :(function() {
     return { Sheets: {}, SheetNames: [] };
   };
   var book_append_sheet = function(wb, ws, name) {
+    var i = 1;
     if (!name)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf(name = "Sheet ".concat(i)) == -1)
           break;
       }
     else if (wb.SheetNames.indexOf(name) > -1)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf("".concat(name, "_").concat(i)) == -1) {
           name = "".concat(name, "_").concat(i);
           break;
diff --git a/bits/90_utils.js b/bits/90_utils.js
index 3e633b8..06fac10 100644
--- a/bits/90_utils.js
+++ b/bits/90_utils.js
@@ -64,7 +64,8 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
 	var out/*:Array<any>*/ = [];
 	var outi = 0, counter = 0;
 	var dense = Array.isArray(sheet);
-	var R = r.s.r, C = 0, CC = 0;
+	var R = r.s.r, C = 0;
+	var header_cnt = {};
 	if(dense && !sheet[R]) sheet[R] = [];
 	for(C = r.s.c; C <= r.e.c; ++C) {
 		cols[C] = encode_col(C);
@@ -76,8 +77,12 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
 			default:
 				if(val == null) val = {w: "__EMPTY", t: "s"};
 				vv = v = format_cell(val, null, o);
-				counter = 0;
-				for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) { vv = v + "_" + (++counter); CC = -1; }
+				counter = header_cnt[v] || 0;
+				if(!counter) header_cnt[v] = 1;
+				else {
+					do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;
+					header_cnt[vv] = 1;
+				}
 				hdr[C] = vv;
 		}
 	}
diff --git a/bits/97_node.js b/bits/97_node.js
index f57e001..8fc2819 100644
--- a/bits/97_node.js
+++ b/bits/97_node.js
@@ -79,7 +79,8 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 	var cols/*:Array<string>*/ = [];
 	var counter = 0;
 	var dense = Array.isArray(sheet);
-	var R = r.s.r, C = 0, CC = 0;
+	var R = r.s.r, C = 0;
+	var header_cnt = {};
 	if(dense && !sheet[R]) sheet[R] = [];
 	for(C = r.s.c; C <= r.e.c; ++C) {
 		cols[C] = encode_col(C);
@@ -91,8 +92,12 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 			default:
 				if(val == null) val = {w: "__EMPTY", t: "s"};
 				vv = v = format_cell(val, null, o);
-				counter = 0;
-				for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
+				counter = header_cnt[v] || 0;
+				if(!counter) header_cnt[v] = 1;
+				else {
+					do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;
+					header_cnt[vv] = 1;
+				}
 				hdr[C] = vv;
 		}
 	}
@@ -110,7 +115,7 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 		return stream.push(null);
 	};
 	return stream;
-};
+}
 
 var __stream = {
 	to_json: write_json_stream,
diff --git a/demos/vue/Makefile b/demos/vue/Makefile
index 70db57f..a47d6d3 100644
--- a/demos/vue/Makefile
+++ b/demos/vue/Makefile
@@ -4,9 +4,7 @@ vue: ## Simple server for vue
 
 .PHONY: nuxt
 nuxt: ## nuxt.js demo
-	mkdir -p node_modules
-	cd node_modules; if [ ! -e xlsx ]; then ln -s ../../../ xlsx; fi; cd ..
-	npm i nuxt vue
+	npm i xlsx @nuxt/content
 	npx nuxt
 
 .PHONY: weex
diff --git a/demos/vue/README.md b/demos/vue/README.md
index 78c90fe..2c01b18 100644
--- a/demos/vue/README.md
+++ b/demos/vue/README.md
@@ -1,4 +1,4 @@
-# VueJS 2
+# VueJS
 
 The `xlsx.core.min.js` and `xlsx.full.min.js` scripts are designed to be dropped
 into web pages with script tags:
@@ -10,7 +10,11 @@ into web pages with script tags:
 The library can also be imported directly from single-file components with:
 
 ```js
-import XLSX from 'xlsx';
+// full import
+import * as XLSX from 'xlsx';
+
+// named imports
+import { read, utils, writeFileXLSX } from 'xlsx';
 ```
 
 This demo directly generates HTML using `sheet_to_html` and adds an element to
@@ -93,19 +97,30 @@ fs.writeFileSync("sheetjs.xls", new Buffer(str, "base64"));
 
 ## Other Demos
 
-#### Server-Rendered VueJS Components with Nuxt.js
+### Nuxt Content
 
-The scripts should be treated as external resources in `nuxt.config.js`:
+`@nuxt/content` parser can be extended to support spreadsheet hot reload:
 
 ```js
-module.exports = {
-	head: {
-		script: [
-			{ src: "https://unpkg.com/xlsx/dist/shim.min.js" },
-			{ src: "https://unpkg.com/xlsx/dist/xlsx.full.min.js" }
-		]
-	}
-};
+// nuxt.config.js
+import { readFile, utils } from 'xlsx';
+
+const parseXLSX = (file, { path }) => {
+  const wb = readFile(path);
+  const o = wb.SheetNames.map(name => ({ name, data: utils.sheet_to_json(wb.Sheets[name])}));
+  return { data: o };
+}
+
+export default {
+  content: {
+    extendParser: {
+      ".numbers": parseXLSX,
+      ".xlsx": parseXLSX,
+      ".xls": parseXLSX
+      // ... other extensions
+    }
+  }
+}
 ```
 
 [![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/js-xlsx?pixel)](https://github.com/SheetJS/js-xlsx)
diff --git a/demos/vue/content/sheetjs.numbers b/demos/vue/content/sheetjs.numbers
new file mode 100755
index 0000000000000000000000000000000000000000..700e97dfada2dbad059305fd104e6e9a9ff66c0d
GIT binary patch
literal 98993
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%0D}NS0Pg{Y0Y(5u
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

literal 0
HcmV?d00001

diff --git a/demos/vue/native.vue b/demos/vue/native.vue
index 1dcea82..5588eed 100644
--- a/demos/vue/native.vue
+++ b/demos/vue/native.vue
@@ -27,7 +27,7 @@
 </style>
 
 <script>
-import XLSX from 'xlsx';
+import * as XLSX from 'xlsx';
 const modal = weex.requireModule('modal');
 const stream = weex.requireModule('stream');
 export default {
diff --git a/demos/vue/nuxt.config.js b/demos/vue/nuxt.config.js
index 9fddd9c..be3d6f3 100644
--- a/demos/vue/nuxt.config.js
+++ b/demos/vue/nuxt.config.js
@@ -1,10 +1,20 @@
-module.exports = {
-	head: {
-		script: [
-			// { src: "https://unpkg.com/xlsx/dist/shim.min.js" }, // CDN
-			// { src: "https://unpkg.com/xlsx/dist/xlsx.full.min.js" } // CDN
-			{ src: "shim.js" }, // development
-			{ src: "xlsx.full.min.js" } // development
-		]
-	}
-};
+// nuxt.config.js
+import { readFile, utils } from 'xlsx';
+
+const parseXLSX = (file, { path }) => {
+  const wb = readFile(path);
+  const o = wb.SheetNames.map(name => ({ name, data: utils.sheet_to_json(wb.Sheets[name])}));
+  return { data: o };
+}
+
+export default {
+  modules: [ '@nuxt/content' ],
+  content: {
+    extendParser: {
+      ".numbers": parseXLSX,
+      ".xlsx": parseXLSX,
+      ".xls": parseXLSX
+      // ...
+    }
+  },
+}
diff --git a/demos/vue/package.json b/demos/vue/package.json
index 0967ef4..cd6ff9c 100644
--- a/demos/vue/package.json
+++ b/demos/vue/package.json
@@ -1 +1,7 @@
-{}
+{
+  "dependencies": {
+    "@nuxt/content": "1.15.1",
+    "nuxt": "2.15.8",
+    "xlsx": "^0.18.3"
+  }
+}
diff --git a/demos/vue/pages/index.vue b/demos/vue/pages/index.vue
index 864c14a..39d3507 100644
--- a/demos/vue/pages/index.vue
+++ b/demos/vue/pages/index.vue
@@ -1,92 +1,24 @@
 <!-- xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com -->
 <template>
-<div @drop="_drop" @dragenter="_suppress" @dragover="_suppress">
-	<div class="row"><div class="col-xs-12">
-		<form class="form-inline">
-			<div class="form-group">
-				<label for="file">Spreadsheet</label>
-				<input type="file" class="form-control" id="file" :accept="SheetJSFT" @change="_change" />
-			</div>
-		</form>
-	</div></div>
-	<div class="row"><div class="col-xs-12">
-		<button :disabled="data.length ? false : true" class="btn btn-success" @click="_export">Export</button>
-	</div></div>
-	<div class="row"><div class="col-xs-12">
-		<div class="table-responsive">
-			<table class="table table-striped">
-				<thead><tr>
-					<th v-for="c in cols" :key="c.key">{{c.name}}</th>
-				</tr></thead>
-				<tbody>
-					<tr v-for="(r, key) in data" :key="key">
-						<td v-for="c in cols" :key="c.key"> {{ r[c.key] }}</td>
-					</tr>
-				</tbody>
-			</table>
-		</div>
-	</div></div>
+<div>
+  <div v-for="item in data.data" v-bind:key="item.name">
+    <h2>{{ item.name }}</h2>
+    <table>
+      <tr v-for="row in item.data" v-bind:key="row.Index">
+        <td>{{ row.Name }}</td>
+        <td>{{ row.Index }}</td>
+      </tr>
+    </table>
+  </div>
 </div>
 </template>
 
 <script>
-const make_cols = refstr => Array(XLSX.utils.decode_range(refstr).e.c + 1).fill(0).map((x,i) => ({name:XLSX.utils.encode_col(i), key:i}));
-
-const _SheetJSFT = [
-	"xlsx", "xlsb", "xlsm", "xls", "xml", "csv", "txt", "ods", "fods", "uos", "sylk", "dif", "dbf", "prn", "qpw", "123", "wb*", "wq*", "html", "htm"
-].map(function(x) { return "." + x; }).join(",");
 export default {
-	data() {
-		return {
-			data: ["SheetJS".split(""), "1234567".split("")],
-			cols: [
-				{name:"A", key:0},
-				{name:"B", key:1},
-				{name:"C", key:2},
-				{name:"D", key:3},
-				{name:"E", key:4},
-				{name:"F", key:5},
-				{name:"G", key:6},
-			],
-			SheetJSFT: _SheetJSFT
-	}; },
-	methods: {
-		_suppress(evt) { evt.stopPropagation(); evt.preventDefault(); },
-		_drop(evt) {
-			evt.stopPropagation(); evt.preventDefault();
-			const files = evt.dataTransfer.files;
-			if(files && files[0]) this._file(files[0]);
-		},
-		_change(evt) {
-			const files = evt.target.files;
-			if(files && files[0]) this._file(files[0]);
-		},
-		_export(evt) {
-			/* convert state to workbook */
-			const ws = XLSX.utils.aoa_to_sheet(this.data);
-			const wb = XLSX.utils.book_new();
-			XLSX.utils.book_append_sheet(wb, ws, "SheetJS");
-			/* generate file and send to client */
-			XLSX.writeFile(wb, "sheetjs.xlsx");
-		},
-		_file(file) {
-			/* Boilerplate to set up FileReader */
-			const reader = new FileReader();
-			reader.onload = (e) => {
-				/* Parse data */
-				const ab = e.target.result;
-				const wb = XLSX.read(new Uint8Array(ab), {type:'array'});
-				/* Get first worksheet */
-				const wsname = wb.SheetNames[0];
-				const ws = wb.Sheets[wsname];
-				/* Convert array of arrays */
-				const data = XLSX.utils.sheet_to_json(ws, {header:1});
-				/* Update state */
-				this.data = data;
-				this.cols = make_cols(ws['!ref']);
-			};
-			reader.readAsArrayBuffer(file);
-		}
-	}
-};
+  async asyncData ({$content}) {
+    return {
+      data: await $content('sheetjs').fetch()
+    };
+  }
+}
 </script>
diff --git a/demos/xhr/axios.html b/demos/xhr/axios.html
index 30deb81..7a492be 100644
--- a/demos/xhr/axios.html
+++ b/demos/xhr/axios.html
@@ -26,21 +26,33 @@ a { text-decoration: none }
 <script src="xlsx.full.min.js"></script>
 <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
 <script>
-var demo = 'axios', book = 'xlsx';
+var demo = 'axios', book = 'xlsx', orig = 'sheetjs.xlsx';
+
+if(!window.axios) throw new Error("This demo is not supported in your browser");
 
 function process_wb(wb) {
 	console.log(wb);
 	htmlout.innerHTML = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]], {editable:true}).replace("<table", '<table id="table" border="1"');
 }
 
-var url = "sheetjs.xlsx";
-document.getElementById('fileurl').innerHTML = '<a href="' + url + '">Download original file</a>';
-document.getElementById('outfile').innerHTML = '<a href="' + demo + '.' + book + '">Download new file</a>';
+var path = 'files/' + demo + '.' + book;
+document.getElementById('fileurl').innerHTML = '<a href="' + orig + '">Download original file</a>';
+document.getElementById('outfile').innerHTML = '<a href="' + path + '">Download new file: ' + path + '</a>';
 
-axios(url, {responseType:'arraybuffer'}).then(function(res) {
+axios(orig, {responseType:'arraybuffer'}).then(function(res) {
 		var data = new Uint8Array(res.data);
 		var wb = XLSX.read(data, {type:"array"});
 		process_wb(wb);
+}).catch(function(e) {
+	if(/404/.test(e.message) || e.response.status) {
+		var ws = XLSX.utils.aoa_to_sheet([
+			["Fetch for " + orig + " failed :("],
+			["Error Code",  e.response.status],
+			["Error Text", e.message],
+		]);
+		ws["!merges"] = [XLSX.utils.decode_range("A1:B1")];
+		process_wb({ "Sheets": { "Sheet1": ws }, "SheetNames": [ "Sheet1" ] });
+	}
 });
 
 document.getElementById('ulbutton').onclick = function() {
diff --git a/demos/xhr/fetch.html b/demos/xhr/fetch.html
index a85a7da..d7da261 100644
--- a/demos/xhr/fetch.html
+++ b/demos/xhr/fetch.html
@@ -25,27 +25,36 @@ a { text-decoration: none }
 </pre>
 <script src="xlsx.full.min.js"></script>
 <script>
-var demo = 'fetch', book = 'xlsx';
+var demo = 'fetch', book = 'xlsx', orig = 'sheetjs.xlsx';
 
-if(!window.fetch)
-	throw new Error("This demo is not supported in your browser");
+if(!window.fetch) throw new Error("This demo is not supported in your browser");
 
 function process_wb(wb) {
 	console.log(wb);
 	htmlout.innerHTML = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]], {editable:true}).replace("<table", '<table id="table" border="1"');
 }
 
-var url = "sheetjs.xlsx";
-document.getElementById('fileurl').innerHTML = '<a href="' + url + '">Download original file</a>';
-document.getElementById('outfile').innerHTML = '<a href="' + demo + '.' + book + '">Download new file</a>';
+var path = 'files/' + demo + '.' + book;
+document.getElementById('fileurl').innerHTML = '<a href="' + orig + '">Download original file</a>';
+document.getElementById('outfile').innerHTML = '<a href="' + path + '">Download new file: ' + path + '</a>';
 
-fetch(url).then(function(res) {
-	if(!res.ok) throw new Error("fetch failed");
+fetch(orig).then(function(res) {
+	if(!res.ok) { var e = new Error(res.statusText); e.response = res; return Promise.reject(e);}
 	return res.arrayBuffer();
 }).then(function(ab) {
 	var data = new Uint8Array(ab);
 	var wb = XLSX.read(data, {type:"array"});
 	process_wb(wb);
+}).catch(function(e) {
+	if(/404/.test(e.message) || e.response.status) {
+		var ws = XLSX.utils.aoa_to_sheet([
+			["Fetch for " + orig + " failed :("],
+			["Error Code",  e.response.status],
+			["Error Text", e.message],
+		]);
+		ws["!merges"] = [XLSX.utils.decode_range("A1:B1")];
+		process_wb({ "Sheets": { "Sheet1": ws }, "SheetNames": [ "Sheet1" ] });
+	}
 });
 
 document.getElementById('ulbutton').onclick = function() {
diff --git a/demos/xhr/server.js b/demos/xhr/server.js
index b16dd2f..464bb3c 100644
--- a/demos/xhr/server.js
+++ b/demos/xhr/server.js
@@ -4,8 +4,15 @@
 var fs = require('fs'), path = require('path');
 var express = require('express'), app = express();
 var sprintf = require('printj').sprintf;
-var logit = require('../server/_logit');
-var cors = require('../server/_cors');
+
+function logit(req, res, next) {
+	console.log(sprintf("%s %s %d", req.method, req.url, res.statusCode));
+	next();
+}
+function cors(req, res, next) {
+	if(!res.headersSent) res.header('Access-Control-Allow-Origin', '*');
+	next();
+}
 
 var port = +process.argv[2] || +process.env.PORT || 7262;
 var basepath = process.cwd();
@@ -13,8 +20,8 @@ var basepath = process.cwd();
 var dir = path.join(__dirname, "files");
 try { fs.mkdirSync(dir); } catch(e) {}
 
-app.use(logit.mw);
-app.use(cors.mw);
+app.use(logit);
+app.use(cors);
 app.use(require('express-formidable')({uploadDir: dir}));
 app.post('/upload', function(req, res) {
 	console.log(req.files);
diff --git a/demos/xhr/superagent.html b/demos/xhr/superagent.html
index fbcec33..10893e8 100644
--- a/demos/xhr/superagent.html
+++ b/demos/xhr/superagent.html
@@ -24,26 +24,38 @@ a { text-decoration: none }
 <div id="outfile"></div>
 </pre>
 <script src="xlsx.full.min.js"></script>
-<script src="https://unpkg.com/superagent/superagent.js"></script>
+<script src="https://unpkg.com/superagent@7.1.1/dist/superagent.min.js"></script>
 <script>
-var demo = 'superagent', book = 'xlsx';
+var demo = 'superagent', book = 'xlsx', orig = 'sheetjs.xlsx';
+
+if(!window.superagent) throw new Error("This demo is not supported in your browser");
 
 function process_wb(wb) {
 	console.log(wb);
 	htmlout.innerHTML = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]], {editable:true}).replace("<table", '<table id="table" border="1"');
 }
 
-var url = "sheetjs.xlsx";
-document.getElementById('fileurl').innerHTML = '<a href="' + url + '">Download original file</a>';
-document.getElementById('outfile').innerHTML = '<a href="' + demo + '.' + book + '">Download new file</a>';
+var path = 'files/' + demo + '.' + book;
+document.getElementById('fileurl').innerHTML = '<a href="' + orig + '">Download original file</a>';
+document.getElementById('outfile').innerHTML = '<a href="' + path + '">Download new file: ' + path + '</a>';
 
-superagent.get(url)
-	.responseType('arraybuffer')
-	.end(function(err, res) {
+superagent.get(orig).responseType('arraybuffer').end(function(e, res) {
+	if(!e) {
 		var data = new Uint8Array(res.body);
 		var wb = XLSX.read(data, {type:"array"});
 		process_wb(wb);
-	});
+		return;
+	}
+	if(/404/.test(e.message) || e.response.status) {
+		var ws = XLSX.utils.aoa_to_sheet([
+			["Fetch for " + orig + " failed :("],
+			["Error Code",  e.response.status],
+			["Error Text", e.message],
+		]);
+		ws["!merges"] = [XLSX.utils.decode_range("A1:B1")];
+		process_wb({ "Sheets": { "Sheet1": ws }, "SheetNames": [ "Sheet1" ] });
+	}
+});
 
 document.getElementById('ulbutton').onclick = function() {
 	var wb = XLSX.utils.table_to_book(document.getElementById('htmlout'));
diff --git a/demos/xhr/xhr.html b/demos/xhr/xhr.html
index 8956bc4..48e5bfc 100644
--- a/demos/xhr/xhr.html
+++ b/demos/xhr/xhr.html
@@ -25,28 +25,37 @@ a { text-decoration: none }
 </pre>
 <script src="xlsx.full.min.js"></script>
 <script>
-var demo = 'xhr', book = 'xlsx';
+var demo = 'xhr', book = 'xlsx', orig = 'sheetjs.xlsx2';
 
-if(!window.XMLHttpRequest || typeof Uint8Array === 'undefined')
-	throw new Error("This demo is not supported in your browser");
+if(!window.XMLHttpRequest || typeof Uint8Array === 'undefined') throw new Error("This demo is not supported in your browser");
 
 function process_wb(wb) {
 	console.log(wb);
 	htmlout.innerHTML = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]], {editable:true}).replace("<table", '<table id="table" border="1"');
 }
 
-var url = "sheetjs.xlsx";
-document.getElementById('fileurl').innerHTML = '<a href="' + url + '">Download original file</a>';
-document.getElementById('outfile').innerHTML = '<a href="' + demo + '.' + book + '">Download new file</a>';
+var path = 'files/' + demo + '.' + book;
+document.getElementById('fileurl').innerHTML = '<a href="' + orig + '">Download original file</a>';
+document.getElementById('outfile').innerHTML = '<a href="' + path + '">Download new file: ' + path + '</a>';
 
 {
 	var req = new XMLHttpRequest();
-	req.open("GET", url, true);
+	req.open("GET", orig, true);
 	req.responseType = "arraybuffer";
 	req.onload = function(e) {
-		var data = new Uint8Array(req.response);
-		var wb = XLSX.read(data, {type:"array"});
-		process_wb(wb);
+		if(req.status == 200) {
+			var data = new Uint8Array(req.response);
+			var wb = XLSX.read(data, {type:"array"});
+			process_wb(wb);
+			return;
+		}
+		var ws = XLSX.utils.aoa_to_sheet([
+			["Fetch for " + orig + " failed :("],
+			["Error Code",  req.status],
+			["Error Text", req.statusText],
+		]);
+		ws["!merges"] = [XLSX.utils.decode_range("A1:B1")];
+		process_wb({ "Sheets": { "Sheet1": ws }, "SheetNames": [ "Sheet1" ] });
 	};
 	req.send();
 }
diff --git a/modules/83_numbers.js b/modules/83_numbers.js
index bce2b68..48a6637 100644
--- a/modules/83_numbers.js
+++ b/modules/83_numbers.js
@@ -442,13 +442,14 @@ var NUMBERS = !Object.defineProperty ? (void 0) :(function() {
     return { Sheets: {}, SheetNames: [] };
   };
   var book_append_sheet = function(wb, ws, name) {
+    var i = 1;
     if (!name)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf(name = "Sheet ".concat(i)) == -1)
           break;
       }
     else if (wb.SheetNames.indexOf(name) > -1)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf("".concat(name, "_").concat(i)) == -1) {
           name = "".concat(name, "_").concat(i);
           break;
diff --git a/modules/src/numbers.ts b/modules/src/numbers.ts
index d36ac59..91f23d8 100644
--- a/modules/src/numbers.ts
+++ b/modules/src/numbers.ts
@@ -17,9 +17,10 @@ var encode_cell = (c: CellAddress): string => `${encode_col(c.c)}${c.r+1}`;
 var encode_range = (r: Range): string => encode_cell(r.s) + ":" + encode_cell(r.e);
 var book_new = (): WorkBook => ({Sheets:{}, SheetNames:[]});
 var book_append_sheet = (wb: WorkBook, ws: WorkSheet, name?: string): void => {
-	if(!name) for(var i = 1; i < 9999; ++i) {
+	var i = 1;
+	if(!name) for(; i < 9999; ++i) {
 		if(wb.SheetNames.indexOf(name = `Sheet ${i}`) == -1) break;
-	} else if(wb.SheetNames.indexOf(name) > -1) for(var i = 1; i < 9999; ++i) {
+	} else if(wb.SheetNames.indexOf(name) > -1) for(; i < 9999; ++i) {
 		if(wb.SheetNames.indexOf(`${name}_${i}`) == -1) { name = `${name}_${i}`; break; }
 	}
 	wb.SheetNames.push(name); wb.Sheets[name] = ws;
diff --git a/test.mjs b/test.mjs
index 69db996..b4e50ac 100644
--- a/test.mjs
+++ b/test.mjs
@@ -2271,6 +2271,20 @@ describe('HTML', function() {
 			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6");
 		});
 	});
+	describe('empty cell containing html element should increment cell index', function() {
+		var html = "<table><tr><td>abc</td><td><b> </b></td><td>def</td></tr></table>";
+		var expectedCellCount = 3;
+		it('HTML string', function() {
+			var ws = X.read(html, {type:'string'}).Sheets.Sheet1;
+			var range = X.utils.decode_range(ws['!ref']);
+			assert.equal(range.e.c,expectedCellCount - 1);
+		});
+		if(domtest) it('DOM', function() {
+			var ws = X.utils.table_to_sheet(get_dom_element(html));
+			var range = X.utils.decode_range(ws['!ref']);
+			assert.equal(range.e.c, expectedCellCount - 1);
+		});
+	});
 });
 
 describe('js -> file -> js', function() {
diff --git a/test.ts b/test.ts
index 1012535..a78463a 100644
--- a/test.ts
+++ b/test.ts
@@ -2126,6 +2126,15 @@ Deno.test('HTML', async function(t) {
 			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6");
 		});
 	});
+	await t.step('empty cell containing html element should increment cell index', async function(t) {
+		var html = "<table><tr><td>abc</td><td><b> </b></td><td>def</td></tr></table>";
+		var expectedCellCount = 3;
+		await t.step('HTML string', async function() {
+			var ws = X.read(html, {type:'string'}).Sheets.Sheet1;
+			var range = X.utils.decode_range(ws['!ref']||"A1");
+			assert.equal(range.e.c,expectedCellCount - 1);
+		});
+	});
 });
 
 Deno.test('js -> file -> js', async function(t) {
diff --git a/types/index.d.ts b/types/index.d.ts
index cda063f..187968d 100644
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -343,6 +343,21 @@ export interface WorkbookProperties {
     CodeName?: string;
 }
 
+/** DBF Field Header */
+export interface DBFField {
+    /** Original Field Name */
+    name?: string;
+
+    /** Field Type */
+    type?: string;
+
+    /** Field Length */
+    len?: number;
+
+    /** Field Decimal Count */
+    dec?: number;
+}
+
 /** Column Properties Object */
 export interface ColInfo {
     /* --- visibility --- */
@@ -366,6 +381,9 @@ export interface ColInfo {
 
     /** Excel's "Max Digit Width" unit, always integral */
     MDW?: number;
+
+    /** DBF Field Header */
+    DBF?: DBFField;
 }
 
 /** Row Properties Object */
diff --git a/xlsx.flow.js b/xlsx.flow.js
index 852cd18..577869d 100644
--- a/xlsx.flow.js
+++ b/xlsx.flow.js
@@ -1,7 +1,7 @@
 /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 /* vim: set ts=2: */
 /*exported XLSX */
-/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
+/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, Deno:false */
 var XLSX = {};
 function make_xlsx_lib(XLSX){
 XLSX.version = '0.18.3';
@@ -7681,7 +7681,7 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
 					out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);
 					break;
 				case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;
-				case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;
+				case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4 + (dd.read_shift(4, 'i')/1e4)*Math.pow(2,32); break;
 				case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;
 				case 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; }
 					/* falls through */
@@ -7695,13 +7695,20 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
 	}
 	if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
 	if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
+	opts.DBF = fields;
 	return out;
 }
 
 function dbf_to_sheet(buf, opts)/*:Worksheet*/ {
 	var o = opts || {};
 	if(!o.dateNF) o.dateNF = "yyyymmdd";
-	return aoa_to_sheet(dbf_to_aoa(buf, o), o);
+	var ws = aoa_to_sheet(dbf_to_aoa(buf, o), o);
+	ws["!cols"] = o.DBF.map(function(field) { return {
+		wch: field.len,
+		DBF: field
+	}});
+	delete o.DBF;
+	return ws;
 }
 
 function dbf_to_workbook(buf, opts)/*:Workbook*/ {
@@ -7717,10 +7724,11 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 	if(o.type == "string") throw new Error("Cannot write DBF to JS string");
 	var ba = buf_array();
 	var aoa/*:AOA*/ = sheet_to_json(ws, {header:1, raw:true, cellDates:true});
-	var headers = aoa[0], data = aoa.slice(1);
+	var headers = aoa[0], data = aoa.slice(1), cols = ws["!cols"] || [];
 	var i = 0, j = 0, hcnt = 0, rlen = 1;
 	for(i = 0; i < headers.length; ++i) {
-		if(i == null) continue;
+		if(((cols[i]||{}).DBF||{}).name) { headers[i] = cols[i].DBF.name; ++hcnt; continue; }
+		if(headers[i] == null) continue;
 		++hcnt;
 		if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
 		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
@@ -7729,13 +7737,15 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 	}
 	var range = safe_decode_range(ws['!ref']);
 	var coltypes/*:Array<string>*/ = [];
+	var colwidths/*:Array<number>*/ = [];
+	var coldecimals/*:Array<number>*/ = [];
 	for(i = 0; i <= range.e.c - range.s.c; ++i) {
+		var guess = '', _guess = '', maxlen = 0;
 		var col/*:Array<any>*/ = [];
 		for(j=0; j < data.length; ++j) {
 			if(data[j][i] != null) col.push(data[j][i]);
 		}
 		if(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; }
-		var guess = '', _guess = '';
 		for(j = 0; j < col.length; ++j) {
 			switch(typeof col[j]) {
 				/* TODO: check if L2 compat is desired */
@@ -7745,10 +7755,23 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 				case 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break;
 				default: _guess = 'C';
 			}
+			maxlen = Math.max(maxlen, String(col[j]).length);
 			guess = guess && guess != _guess ? 'C' : _guess;
-			if(guess == 'C') break;
+			//if(guess == 'C') break;
 		}
-		rlen += _RLEN[guess] || 0;
+		if(maxlen > 250) maxlen = 250;
+		_guess = ((cols[i]||{}).DBF||{}).type;
+		/* TODO: more fine grained control over DBF type resolution */
+		if(_guess == 'C') {
+			if(cols[i].DBF.len > maxlen) maxlen = cols[i].DBF.len;
+		}
+		if(guess == 'B' && _guess == 'N') {
+			guess = 'N';
+			coldecimals[i] = cols[i].DBF.dec;
+			maxlen = cols[i].DBF.len;
+		}
+		colwidths[i] = guess == 'C' || _guess == 'N' ? maxlen : (_RLEN[guess] || 0);
+		rlen += colwidths[i];
 		coltypes[i] = guess;
 	}
 
@@ -7767,14 +7790,14 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 		hf.write_shift(1, _f, "sbcs");
 		hf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], "sbcs");
 		hf.write_shift(4, j);
-		hf.write_shift(1, _RLEN[coltypes[i]] || 0);
-		hf.write_shift(1, 0);
+		hf.write_shift(1, colwidths[i] || _RLEN[coltypes[i]] || 0);
+		hf.write_shift(1, coldecimals[i] || 0);
 		hf.write_shift(1, 0x02);
 		hf.write_shift(4, 0);
 		hf.write_shift(1, 0);
 		hf.write_shift(4, 0);
 		hf.write_shift(4, 0);
-		j += _RLEN[coltypes[i]] || 0;
+		j += (colwidths[i] || _RLEN[coltypes[i]] || 0);
 	}
 
 	var hb = ba.next(264);
@@ -7788,6 +7811,12 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 			switch(coltypes[j]) {
 				case 'L': rout.write_shift(1, data[i][j] == null ? 0x3F : data[i][j] ? 0x54 : 0x46); break;
 				case 'B': rout.write_shift(8, data[i][j]||0, 'f'); break;
+				case 'N':
+					var _n = "0";
+					if(typeof data[i][j] == "number") _n = data[i][j].toFixed(coldecimals[j]||0);
+					for(hcnt=0; hcnt < colwidths[j]-_n.length; ++hcnt) rout.write_shift(1, 0x20);
+					rout.write_shift(1, _n, "sbcs");
+					break;
 				case 'D':
 					if(!data[i][j]) rout.write_shift(8, "00000000", "sbcs");
 					else {
@@ -7796,9 +7825,9 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 						rout.write_shift(2, ("00"+data[i][j].getDate()).slice(-2), "sbcs");
 					} break;
 				case 'C':
-					var _s = String(data[i][j]||"");
+					var _s = String(data[i][j] != null ? data[i][j] : "").slice(0, colwidths[j]);
 					rout.write_shift(1, _s, "sbcs");
-					for(hcnt=0; hcnt < 250-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
+					for(hcnt=0; hcnt < colwidths[j]-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
 			}
 		}
 		// data
@@ -20973,7 +21002,7 @@ var HTML_ = (function() {
 				m = htmldecode(m);
 				if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;
 				if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;
-				if(!m.length) continue;
+				if(!m.length) { C += CS; continue; }
 				var o/*:Cell*/ = {t:'s', v:m};
 				if(opts.raw || !m.trim().length || _t == 's'){}
 				else if(m === 'TRUE') o = {t:'b', v:true};
@@ -22481,13 +22510,14 @@ var NUMBERS = !Object.defineProperty ? (void 0) :(function() {
     return { Sheets: {}, SheetNames: [] };
   };
   var book_append_sheet = function(wb, ws, name) {
+    var i = 1;
     if (!name)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf(name = "Sheet ".concat(i)) == -1)
           break;
       }
     else if (wb.SheetNames.indexOf(name) > -1)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf("".concat(name, "_").concat(i)) == -1) {
           name = "".concat(name, "_").concat(i);
           break;
@@ -23698,7 +23728,8 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
 	var out/*:Array<any>*/ = [];
 	var outi = 0, counter = 0;
 	var dense = Array.isArray(sheet);
-	var R = r.s.r, C = 0, CC = 0;
+	var R = r.s.r, C = 0;
+	var header_cnt = {};
 	if(dense && !sheet[R]) sheet[R] = [];
 	for(C = r.s.c; C <= r.e.c; ++C) {
 		cols[C] = encode_col(C);
@@ -23710,8 +23741,12 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
 			default:
 				if(val == null) val = {w: "__EMPTY", t: "s"};
 				vv = v = format_cell(val, null, o);
-				counter = 0;
-				for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) { vv = v + "_" + (++counter); CC = -1; }
+				counter = header_cnt[v] || 0;
+				if(!counter) header_cnt[v] = 1;
+				else {
+					do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;
+					header_cnt[vv] = 1;
+				}
 				hdr[C] = vv;
 		}
 	}
@@ -24102,7 +24137,8 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 	var cols/*:Array<string>*/ = [];
 	var counter = 0;
 	var dense = Array.isArray(sheet);
-	var R = r.s.r, C = 0, CC = 0;
+	var R = r.s.r, C = 0;
+	var header_cnt = {};
 	if(dense && !sheet[R]) sheet[R] = [];
 	for(C = r.s.c; C <= r.e.c; ++C) {
 		cols[C] = encode_col(C);
@@ -24114,8 +24150,12 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 			default:
 				if(val == null) val = {w: "__EMPTY", t: "s"};
 				vv = v = format_cell(val, null, o);
-				counter = 0;
-				for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
+				counter = header_cnt[v] || 0;
+				if(!counter) header_cnt[v] = 1;
+				else {
+					do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;
+					header_cnt[vv] = 1;
+				}
 				hdr[C] = vv;
 		}
 	}
@@ -24133,7 +24173,7 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 		return stream.push(null);
 	};
 	return stream;
-};
+}
 
 var __stream = {
 	to_json: write_json_stream,
diff --git a/xlsx.js b/xlsx.js
index 1c7caed..da7af81 100644
--- a/xlsx.js
+++ b/xlsx.js
@@ -1,7 +1,7 @@
 /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 /* vim: set ts=2: */
 /*exported XLSX */
-/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
+/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, Deno:false */
 var XLSX = {};
 function make_xlsx_lib(XLSX){
 XLSX.version = '0.18.3';
@@ -7584,7 +7584,7 @@ var fields = [], field = ({});
 					out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);
 					break;
 				case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;
-				case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;
+				case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4 + (dd.read_shift(4, 'i')/1e4)*Math.pow(2,32); break;
 				case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;
 				case 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; }
 					/* falls through */
@@ -7598,13 +7598,20 @@ var fields = [], field = ({});
 	}
 	if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
 	if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
+	opts.DBF = fields;
 	return out;
 }
 
 function dbf_to_sheet(buf, opts) {
 	var o = opts || {};
 	if(!o.dateNF) o.dateNF = "yyyymmdd";
-	return aoa_to_sheet(dbf_to_aoa(buf, o), o);
+	var ws = aoa_to_sheet(dbf_to_aoa(buf, o), o);
+	ws["!cols"] = o.DBF.map(function(field) { return {
+		wch: field.len,
+		DBF: field
+	}});
+	delete o.DBF;
+	return ws;
 }
 
 function dbf_to_workbook(buf, opts) {
@@ -7620,10 +7627,11 @@ function sheet_to_dbf(ws, opts) {
 	if(o.type == "string") throw new Error("Cannot write DBF to JS string");
 	var ba = buf_array();
 	var aoa = sheet_to_json(ws, {header:1, raw:true, cellDates:true});
-	var headers = aoa[0], data = aoa.slice(1);
+	var headers = aoa[0], data = aoa.slice(1), cols = ws["!cols"] || [];
 	var i = 0, j = 0, hcnt = 0, rlen = 1;
 	for(i = 0; i < headers.length; ++i) {
-		if(i == null) continue;
+		if(((cols[i]||{}).DBF||{}).name) { headers[i] = cols[i].DBF.name; ++hcnt; continue; }
+		if(headers[i] == null) continue;
 		++hcnt;
 		if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
 		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
@@ -7632,13 +7640,15 @@ function sheet_to_dbf(ws, opts) {
 	}
 	var range = safe_decode_range(ws['!ref']);
 	var coltypes = [];
+	var colwidths = [];
+	var coldecimals = [];
 	for(i = 0; i <= range.e.c - range.s.c; ++i) {
+		var guess = '', _guess = '', maxlen = 0;
 		var col = [];
 		for(j=0; j < data.length; ++j) {
 			if(data[j][i] != null) col.push(data[j][i]);
 		}
 		if(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; }
-		var guess = '', _guess = '';
 		for(j = 0; j < col.length; ++j) {
 			switch(typeof col[j]) {
 				/* TODO: check if L2 compat is desired */
@@ -7648,10 +7658,23 @@ function sheet_to_dbf(ws, opts) {
 				case 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break;
 				default: _guess = 'C';
 			}
+			maxlen = Math.max(maxlen, String(col[j]).length);
 			guess = guess && guess != _guess ? 'C' : _guess;
-			if(guess == 'C') break;
+			//if(guess == 'C') break;
 		}
-		rlen += _RLEN[guess] || 0;
+		if(maxlen > 250) maxlen = 250;
+		_guess = ((cols[i]||{}).DBF||{}).type;
+		/* TODO: more fine grained control over DBF type resolution */
+		if(_guess == 'C') {
+			if(cols[i].DBF.len > maxlen) maxlen = cols[i].DBF.len;
+		}
+		if(guess == 'B' && _guess == 'N') {
+			guess = 'N';
+			coldecimals[i] = cols[i].DBF.dec;
+			maxlen = cols[i].DBF.len;
+		}
+		colwidths[i] = guess == 'C' || _guess == 'N' ? maxlen : (_RLEN[guess] || 0);
+		rlen += colwidths[i];
 		coltypes[i] = guess;
 	}
 
@@ -7670,14 +7693,14 @@ function sheet_to_dbf(ws, opts) {
 		hf.write_shift(1, _f, "sbcs");
 		hf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], "sbcs");
 		hf.write_shift(4, j);
-		hf.write_shift(1, _RLEN[coltypes[i]] || 0);
-		hf.write_shift(1, 0);
+		hf.write_shift(1, colwidths[i] || _RLEN[coltypes[i]] || 0);
+		hf.write_shift(1, coldecimals[i] || 0);
 		hf.write_shift(1, 0x02);
 		hf.write_shift(4, 0);
 		hf.write_shift(1, 0);
 		hf.write_shift(4, 0);
 		hf.write_shift(4, 0);
-		j += _RLEN[coltypes[i]] || 0;
+		j += (colwidths[i] || _RLEN[coltypes[i]] || 0);
 	}
 
 	var hb = ba.next(264);
@@ -7691,6 +7714,12 @@ function sheet_to_dbf(ws, opts) {
 			switch(coltypes[j]) {
 				case 'L': rout.write_shift(1, data[i][j] == null ? 0x3F : data[i][j] ? 0x54 : 0x46); break;
 				case 'B': rout.write_shift(8, data[i][j]||0, 'f'); break;
+				case 'N':
+					var _n = "0";
+					if(typeof data[i][j] == "number") _n = data[i][j].toFixed(coldecimals[j]||0);
+					for(hcnt=0; hcnt < colwidths[j]-_n.length; ++hcnt) rout.write_shift(1, 0x20);
+					rout.write_shift(1, _n, "sbcs");
+					break;
 				case 'D':
 					if(!data[i][j]) rout.write_shift(8, "00000000", "sbcs");
 					else {
@@ -7699,9 +7728,9 @@ function sheet_to_dbf(ws, opts) {
 						rout.write_shift(2, ("00"+data[i][j].getDate()).slice(-2), "sbcs");
 					} break;
 				case 'C':
-					var _s = String(data[i][j]||"");
+					var _s = String(data[i][j] != null ? data[i][j] : "").slice(0, colwidths[j]);
 					rout.write_shift(1, _s, "sbcs");
-					for(hcnt=0; hcnt < 250-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
+					for(hcnt=0; hcnt < colwidths[j]-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
 			}
 		}
 		// data
@@ -20856,7 +20885,7 @@ var HTML_ = (function() {
 				m = htmldecode(m);
 				if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;
 				if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;
-				if(!m.length) continue;
+				if(!m.length) { C += CS; continue; }
 				var o = {t:'s', v:m};
 				if(opts.raw || !m.trim().length || _t == 's'){}
 				else if(m === 'TRUE') o = {t:'b', v:true};
@@ -22364,13 +22393,14 @@ var NUMBERS = !Object.defineProperty ? (void 0) :(function() {
     return { Sheets: {}, SheetNames: [] };
   };
   var book_append_sheet = function(wb, ws, name) {
+    var i = 1;
     if (!name)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf(name = "Sheet ".concat(i)) == -1)
           break;
       }
     else if (wb.SheetNames.indexOf(name) > -1)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf("".concat(name, "_").concat(i)) == -1) {
           name = "".concat(name, "_").concat(i);
           break;
@@ -23570,7 +23600,8 @@ function sheet_to_json(sheet, opts) {
 	var out = [];
 	var outi = 0, counter = 0;
 	var dense = Array.isArray(sheet);
-	var R = r.s.r, C = 0, CC = 0;
+	var R = r.s.r, C = 0;
+	var header_cnt = {};
 	if(dense && !sheet[R]) sheet[R] = [];
 	for(C = r.s.c; C <= r.e.c; ++C) {
 		cols[C] = encode_col(C);
@@ -23582,8 +23613,12 @@ function sheet_to_json(sheet, opts) {
 			default:
 				if(val == null) val = {w: "__EMPTY", t: "s"};
 				vv = v = format_cell(val, null, o);
-				counter = 0;
-				for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) { vv = v + "_" + (++counter); CC = -1; }
+				counter = header_cnt[v] || 0;
+				if(!counter) header_cnt[v] = 1;
+				else {
+					do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;
+					header_cnt[vv] = 1;
+				}
 				hdr[C] = vv;
 		}
 	}
@@ -23974,7 +24009,8 @@ function write_json_stream(sheet, opts) {
 	var cols = [];
 	var counter = 0;
 	var dense = Array.isArray(sheet);
-	var R = r.s.r, C = 0, CC = 0;
+	var R = r.s.r, C = 0;
+	var header_cnt = {};
 	if(dense && !sheet[R]) sheet[R] = [];
 	for(C = r.s.c; C <= r.e.c; ++C) {
 		cols[C] = encode_col(C);
@@ -23986,8 +24022,12 @@ function write_json_stream(sheet, opts) {
 			default:
 				if(val == null) val = {w: "__EMPTY", t: "s"};
 				vv = v = format_cell(val, null, o);
-				counter = 0;
-				for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
+				counter = header_cnt[v] || 0;
+				if(!counter) header_cnt[v] = 1;
+				else {
+					do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;
+					header_cnt[vv] = 1;
+				}
 				hdr[C] = vv;
 		}
 	}
@@ -24005,7 +24045,7 @@ function write_json_stream(sheet, opts) {
 		return stream.push(null);
 	};
 	return stream;
-};
+}
 
 var __stream = {
 	to_json: write_json_stream,
diff --git a/xlsx.mjs b/xlsx.mjs
index 43a416b..b8d6c8a 100644
--- a/xlsx.mjs
+++ b/xlsx.mjs
@@ -7678,7 +7678,7 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
 					out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);
 					break;
 				case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;
-				case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;
+				case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4 + (dd.read_shift(4, 'i')/1e4)*Math.pow(2,32); break;
 				case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;
 				case 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; }
 					/* falls through */
@@ -7692,13 +7692,20 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
 	}
 	if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
 	if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
+	opts.DBF = fields;
 	return out;
 }
 
 function dbf_to_sheet(buf, opts)/*:Worksheet*/ {
 	var o = opts || {};
 	if(!o.dateNF) o.dateNF = "yyyymmdd";
-	return aoa_to_sheet(dbf_to_aoa(buf, o), o);
+	var ws = aoa_to_sheet(dbf_to_aoa(buf, o), o);
+	ws["!cols"] = o.DBF.map(function(field) { return {
+		wch: field.len,
+		DBF: field
+	}});
+	delete o.DBF;
+	return ws;
 }
 
 function dbf_to_workbook(buf, opts)/*:Workbook*/ {
@@ -7714,10 +7721,11 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 	if(o.type == "string") throw new Error("Cannot write DBF to JS string");
 	var ba = buf_array();
 	var aoa/*:AOA*/ = sheet_to_json(ws, {header:1, raw:true, cellDates:true});
-	var headers = aoa[0], data = aoa.slice(1);
+	var headers = aoa[0], data = aoa.slice(1), cols = ws["!cols"] || [];
 	var i = 0, j = 0, hcnt = 0, rlen = 1;
 	for(i = 0; i < headers.length; ++i) {
-		if(i == null) continue;
+		if(((cols[i]||{}).DBF||{}).name) { headers[i] = cols[i].DBF.name; ++hcnt; continue; }
+		if(headers[i] == null) continue;
 		++hcnt;
 		if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
 		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
@@ -7726,13 +7734,15 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 	}
 	var range = safe_decode_range(ws['!ref']);
 	var coltypes/*:Array<string>*/ = [];
+	var colwidths/*:Array<number>*/ = [];
+	var coldecimals/*:Array<number>*/ = [];
 	for(i = 0; i <= range.e.c - range.s.c; ++i) {
+		var guess = '', _guess = '', maxlen = 0;
 		var col/*:Array<any>*/ = [];
 		for(j=0; j < data.length; ++j) {
 			if(data[j][i] != null) col.push(data[j][i]);
 		}
 		if(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; }
-		var guess = '', _guess = '';
 		for(j = 0; j < col.length; ++j) {
 			switch(typeof col[j]) {
 				/* TODO: check if L2 compat is desired */
@@ -7742,10 +7752,23 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 				case 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break;
 				default: _guess = 'C';
 			}
+			maxlen = Math.max(maxlen, String(col[j]).length);
 			guess = guess && guess != _guess ? 'C' : _guess;
-			if(guess == 'C') break;
+			//if(guess == 'C') break;
 		}
-		rlen += _RLEN[guess] || 0;
+		if(maxlen > 250) maxlen = 250;
+		_guess = ((cols[i]||{}).DBF||{}).type;
+		/* TODO: more fine grained control over DBF type resolution */
+		if(_guess == 'C') {
+			if(cols[i].DBF.len > maxlen) maxlen = cols[i].DBF.len;
+		}
+		if(guess == 'B' && _guess == 'N') {
+			guess = 'N';
+			coldecimals[i] = cols[i].DBF.dec;
+			maxlen = cols[i].DBF.len;
+		}
+		colwidths[i] = guess == 'C' || _guess == 'N' ? maxlen : (_RLEN[guess] || 0);
+		rlen += colwidths[i];
 		coltypes[i] = guess;
 	}
 
@@ -7764,14 +7787,14 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 		hf.write_shift(1, _f, "sbcs");
 		hf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], "sbcs");
 		hf.write_shift(4, j);
-		hf.write_shift(1, _RLEN[coltypes[i]] || 0);
-		hf.write_shift(1, 0);
+		hf.write_shift(1, colwidths[i] || _RLEN[coltypes[i]] || 0);
+		hf.write_shift(1, coldecimals[i] || 0);
 		hf.write_shift(1, 0x02);
 		hf.write_shift(4, 0);
 		hf.write_shift(1, 0);
 		hf.write_shift(4, 0);
 		hf.write_shift(4, 0);
-		j += _RLEN[coltypes[i]] || 0;
+		j += (colwidths[i] || _RLEN[coltypes[i]] || 0);
 	}
 
 	var hb = ba.next(264);
@@ -7785,6 +7808,12 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 			switch(coltypes[j]) {
 				case 'L': rout.write_shift(1, data[i][j] == null ? 0x3F : data[i][j] ? 0x54 : 0x46); break;
 				case 'B': rout.write_shift(8, data[i][j]||0, 'f'); break;
+				case 'N':
+					var _n = "0";
+					if(typeof data[i][j] == "number") _n = data[i][j].toFixed(coldecimals[j]||0);
+					for(hcnt=0; hcnt < colwidths[j]-_n.length; ++hcnt) rout.write_shift(1, 0x20);
+					rout.write_shift(1, _n, "sbcs");
+					break;
 				case 'D':
 					if(!data[i][j]) rout.write_shift(8, "00000000", "sbcs");
 					else {
@@ -7793,9 +7822,9 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 						rout.write_shift(2, ("00"+data[i][j].getDate()).slice(-2), "sbcs");
 					} break;
 				case 'C':
-					var _s = String(data[i][j]||"");
+					var _s = String(data[i][j] != null ? data[i][j] : "").slice(0, colwidths[j]);
 					rout.write_shift(1, _s, "sbcs");
-					for(hcnt=0; hcnt < 250-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
+					for(hcnt=0; hcnt < colwidths[j]-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
 			}
 		}
 		// data
@@ -20970,7 +20999,7 @@ var HTML_ = (function() {
 				m = htmldecode(m);
 				if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;
 				if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;
-				if(!m.length) continue;
+				if(!m.length) { C += CS; continue; }
 				var o/*:Cell*/ = {t:'s', v:m};
 				if(opts.raw || !m.trim().length || _t == 's'){}
 				else if(m === 'TRUE') o = {t:'b', v:true};
@@ -22478,13 +22507,14 @@ var NUMBERS = !Object.defineProperty ? (void 0) :(function() {
     return { Sheets: {}, SheetNames: [] };
   };
   var book_append_sheet = function(wb, ws, name) {
+    var i = 1;
     if (!name)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf(name = "Sheet ".concat(i)) == -1)
           break;
       }
     else if (wb.SheetNames.indexOf(name) > -1)
-      for (var i = 1; i < 9999; ++i) {
+      for (; i < 9999; ++i) {
         if (wb.SheetNames.indexOf("".concat(name, "_").concat(i)) == -1) {
           name = "".concat(name, "_").concat(i);
           break;
@@ -23695,7 +23725,8 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
 	var out/*:Array<any>*/ = [];
 	var outi = 0, counter = 0;
 	var dense = Array.isArray(sheet);
-	var R = r.s.r, C = 0, CC = 0;
+	var R = r.s.r, C = 0;
+	var header_cnt = {};
 	if(dense && !sheet[R]) sheet[R] = [];
 	for(C = r.s.c; C <= r.e.c; ++C) {
 		cols[C] = encode_col(C);
@@ -23707,8 +23738,12 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
 			default:
 				if(val == null) val = {w: "__EMPTY", t: "s"};
 				vv = v = format_cell(val, null, o);
-				counter = 0;
-				for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) { vv = v + "_" + (++counter); CC = -1; }
+				counter = header_cnt[v] || 0;
+				if(!counter) header_cnt[v] = 1;
+				else {
+					do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;
+					header_cnt[vv] = 1;
+				}
 				hdr[C] = vv;
 		}
 	}
@@ -24099,7 +24134,8 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 	var cols/*:Array<string>*/ = [];
 	var counter = 0;
 	var dense = Array.isArray(sheet);
-	var R = r.s.r, C = 0, CC = 0;
+	var R = r.s.r, C = 0;
+	var header_cnt = {};
 	if(dense && !sheet[R]) sheet[R] = [];
 	for(C = r.s.c; C <= r.e.c; ++C) {
 		cols[C] = encode_col(C);
@@ -24111,8 +24147,12 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 			default:
 				if(val == null) val = {w: "__EMPTY", t: "s"};
 				vv = v = format_cell(val, null, o);
-				counter = 0;
-				for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
+				counter = header_cnt[v] || 0;
+				if(!counter) header_cnt[v] = 1;
+				else {
+					do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;
+					header_cnt[vv] = 1;
+				}
 				hdr[C] = vv;
 		}
 	}
@@ -24130,7 +24170,7 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
 		return stream.push(null);
 	};
 	return stream;
-};
+}
 
 var __stream = {
 	to_json: write_json_stream,