forked from sheetjs/sheetjs
		
	CSV omit trailing record separator [ci skip]
This commit is contained in:
		
							parent
							
								
									467020fc69
								
							
						
					
					
						commit
						a32b30414b
					
				@ -1,5 +1,6 @@
 | 
			
		||||
# xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com
 | 
			
		||||
SheetJS
 | 
			
		||||
sheetjs
 | 
			
		||||
js-xlsx
 | 
			
		||||
xls
 | 
			
		||||
xlsb
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,8 @@ This log is intended to keep track of backwards-incompatible changes, including
 | 
			
		||||
but not limited to API changes and file location changes.  Minor behavioral
 | 
			
		||||
changes may not be included if they are not expected to break existing code.
 | 
			
		||||
 | 
			
		||||
* CSV output omits trailing record separator
 | 
			
		||||
 | 
			
		||||
## v0.18.2
 | 
			
		||||
 | 
			
		||||
* Hotfix for unicode processing of XLSX exports
 | 
			
		||||
 | 
			
		||||
@ -126,12 +126,13 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ {
 | 
			
		||||
	var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || [];
 | 
			
		||||
	var rowinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!rows"] || [];
 | 
			
		||||
	for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
 | 
			
		||||
	var w = 0;
 | 
			
		||||
	for(var R = r.s.r; R <= r.e.r; ++R) {
 | 
			
		||||
		if ((rowinfo[R]||{}).hidden) continue;
 | 
			
		||||
		row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);
 | 
			
		||||
		if(row == null) { continue; }
 | 
			
		||||
		if(o.strip) row = row.replace(endregex,"");
 | 
			
		||||
		out.push(row + RS);
 | 
			
		||||
		out.push((w++ ? RS : "") + row);
 | 
			
		||||
	}
 | 
			
		||||
	delete o.dense;
 | 
			
		||||
	return out.join("");
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,7 @@ if(has_buf && typeof require != 'undefined') (function() {
 | 
			
		||||
		var rowinfo/*:Array<RowInfo>*/ = o.skipHidden && sheet["!rows"] || [];
 | 
			
		||||
		for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
 | 
			
		||||
		var R = r.s.r;
 | 
			
		||||
		var BOM = false;
 | 
			
		||||
		var BOM = false, w = 0;
 | 
			
		||||
		stream._read = function() {
 | 
			
		||||
			if(!BOM) { BOM = true; return stream.push("\uFEFF"); }
 | 
			
		||||
			while(R <= r.e.r) {
 | 
			
		||||
@ -27,11 +27,10 @@ if(has_buf && typeof require != 'undefined') (function() {
 | 
			
		||||
				row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);
 | 
			
		||||
				if(row != null) {
 | 
			
		||||
					if(o.strip) row = row.replace(endregex,"");
 | 
			
		||||
					stream.push(row + RS);
 | 
			
		||||
					break;
 | 
			
		||||
					return stream.push((w++ ? RS : "") + row);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if(R > r.e.r) return stream.push(null);
 | 
			
		||||
			return stream.push(null);
 | 
			
		||||
		};
 | 
			
		||||
		return stream;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								test.js
									
									
									
									
									
								
							@ -1453,8 +1453,8 @@ describe('write features', function() {
 | 
			
		||||
		var wb = X.utils.book_new();
 | 
			
		||||
		X.utils.book_append_sheet(wb, X.utils.aoa_to_sheet([[1,2],[3,4]]), "Sheet1");
 | 
			
		||||
		X.utils.book_append_sheet(wb, X.utils.aoa_to_sheet([[5,6],[7,8]]), "Sheet2");
 | 
			
		||||
		assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet1"}), "1,2\n3,4\n");
 | 
			
		||||
		assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet2"}), "5,6\n7,8\n");
 | 
			
		||||
		assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet1"}), "1,2\n3,4");
 | 
			
		||||
		assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet2"}), "5,6\n7,8");
 | 
			
		||||
		assert.throws(function() { X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet3"}); });
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
@ -2030,7 +2030,7 @@ describe('CSV', function() {
 | 
			
		||||
		if(typeof before != 'undefined') before(bef);
 | 
			
		||||
		else it('before', bef);
 | 
			
		||||
		it('should generate csv', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
 | 
			
		||||
			assert.equal(baseline, X.utils.sheet_to_csv(ws));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle FS', function() {
 | 
			
		||||
@ -2042,18 +2042,18 @@ describe('CSV', function() {
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {RS:";"}).replace(/[;]/g,"\n"), X.utils.sheet_to_csv(ws));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle dateNF', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,20140219,0.3\n,,,\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,20140219,0.3\n,,,\nbaz,,qux,";
 | 
			
		||||
			var _ws =  X.utils.aoa_to_sheet(data, {cellDates:true});
 | 
			
		||||
			delete get_cell(_ws,"C3").w;
 | 
			
		||||
			delete get_cell(_ws,"C3").z;
 | 
			
		||||
			assert.equal(baseline, X.utils.sheet_to_csv(_ws, {dateNF:"YYYYMMDD"}));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle strip', function() {
 | 
			
		||||
			var baseline = "1,2,3\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n\nbaz,,qux\n";
 | 
			
		||||
			var baseline = "1,2,3\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n\nbaz,,qux";
 | 
			
		||||
			assert.equal(baseline, X.utils.sheet_to_csv(ws, {strip:true}));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle blankrows', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\nbaz,,qux,";
 | 
			
		||||
			assert.equal(baseline, X.utils.sheet_to_csv(ws, {blankrows:false}));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle various line endings', function() {
 | 
			
		||||
@ -2066,25 +2066,25 @@ describe('CSV', function() {
 | 
			
		||||
			});
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle skipHidden for rows if requested', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
 | 
			
		||||
			delete ws["!rows"];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws), baseline);
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline);
 | 
			
		||||
			ws["!rows"] = [null,{hidden:true},null,null];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws), baseline);
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,2,3,\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,2,3,\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,");
 | 
			
		||||
			delete ws["!rows"];
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle skipHidden for columns if requested', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
 | 
			
		||||
			delete ws["!cols"];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws), baseline);
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline);
 | 
			
		||||
			ws["!cols"] = [null,{hidden:true},null,null];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws), baseline);
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,3,\nTRUE,,sheetjs\nfoo,2/19/14,0.3\n,,\nbaz,qux,\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,3,\nTRUE,,sheetjs\nfoo,2/19/14,0.3\n,,\nbaz,qux,");
 | 
			
		||||
			ws["!cols"] = [{hidden:true},null,null,null];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,");
 | 
			
		||||
			delete ws["!cols"];
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
@ -2264,11 +2264,11 @@ describe('HTML', function() {
 | 
			
		||||
		var html = "<table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td></tr></tbody><tfoot><tr><th>4</th><th>6</th></tr></tfoot></table>";
 | 
			
		||||
		it('HTML string', function() {
 | 
			
		||||
			var ws = X.read(html, {type:'string'}).Sheets.Sheet1;
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6");
 | 
			
		||||
		});
 | 
			
		||||
		if(domtest) it('DOM', function() {
 | 
			
		||||
			var ws = X.utils.table_to_sheet(get_dom_element(html));
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6");
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							@ -1453,8 +1453,8 @@ describe('write features', function() {
 | 
			
		||||
		var wb = X.utils.book_new();
 | 
			
		||||
		X.utils.book_append_sheet(wb, X.utils.aoa_to_sheet([[1,2],[3,4]]), "Sheet1");
 | 
			
		||||
		X.utils.book_append_sheet(wb, X.utils.aoa_to_sheet([[5,6],[7,8]]), "Sheet2");
 | 
			
		||||
		assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet1"}), "1,2\n3,4\n");
 | 
			
		||||
		assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet2"}), "5,6\n7,8\n");
 | 
			
		||||
		assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet1"}), "1,2\n3,4");
 | 
			
		||||
		assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet2"}), "5,6\n7,8");
 | 
			
		||||
		assert.throws(function() { X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet3"}); });
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
@ -2030,7 +2030,7 @@ describe('CSV', function() {
 | 
			
		||||
		if(typeof before != 'undefined') before(bef);
 | 
			
		||||
		else it('before', bef);
 | 
			
		||||
		it('should generate csv', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
 | 
			
		||||
			assert.equal(baseline, X.utils.sheet_to_csv(ws));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle FS', function() {
 | 
			
		||||
@ -2042,18 +2042,18 @@ describe('CSV', function() {
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {RS:";"}).replace(/[;]/g,"\n"), X.utils.sheet_to_csv(ws));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle dateNF', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,20140219,0.3\n,,,\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,20140219,0.3\n,,,\nbaz,,qux,";
 | 
			
		||||
			var _ws =  X.utils.aoa_to_sheet(data, {cellDates:true});
 | 
			
		||||
			delete get_cell(_ws,"C3").w;
 | 
			
		||||
			delete get_cell(_ws,"C3").z;
 | 
			
		||||
			assert.equal(baseline, X.utils.sheet_to_csv(_ws, {dateNF:"YYYYMMDD"}));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle strip', function() {
 | 
			
		||||
			var baseline = "1,2,3\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n\nbaz,,qux\n";
 | 
			
		||||
			var baseline = "1,2,3\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n\nbaz,,qux";
 | 
			
		||||
			assert.equal(baseline, X.utils.sheet_to_csv(ws, {strip:true}));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle blankrows', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\nbaz,,qux,";
 | 
			
		||||
			assert.equal(baseline, X.utils.sheet_to_csv(ws, {blankrows:false}));
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle various line endings', function() {
 | 
			
		||||
@ -2066,25 +2066,25 @@ describe('CSV', function() {
 | 
			
		||||
			});
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle skipHidden for rows if requested', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
 | 
			
		||||
			delete ws["!rows"];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws), baseline);
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline);
 | 
			
		||||
			ws["!rows"] = [null,{hidden:true},null,null];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws), baseline);
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,2,3,\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,2,3,\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,");
 | 
			
		||||
			delete ws["!rows"];
 | 
			
		||||
		});
 | 
			
		||||
		it('should handle skipHidden for columns if requested', function() {
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
 | 
			
		||||
			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
 | 
			
		||||
			delete ws["!cols"];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws), baseline);
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline);
 | 
			
		||||
			ws["!cols"] = [null,{hidden:true},null,null];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws), baseline);
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,3,\nTRUE,,sheetjs\nfoo,2/19/14,0.3\n,,\nbaz,qux,\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,3,\nTRUE,,sheetjs\nfoo,2/19/14,0.3\n,,\nbaz,qux,");
 | 
			
		||||
			ws["!cols"] = [{hidden:true},null,null,null];
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,");
 | 
			
		||||
			delete ws["!cols"];
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
@ -2264,11 +2264,11 @@ describe('HTML', function() {
 | 
			
		||||
		var html = "<table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td></tr></tbody><tfoot><tr><th>4</th><th>6</th></tr></tfoot></table>";
 | 
			
		||||
		it('HTML string', function() {
 | 
			
		||||
			var ws = X.read(html, {type:'string'}).Sheets.Sheet1;
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6");
 | 
			
		||||
		});
 | 
			
		||||
		if(domtest) it('DOM', function() {
 | 
			
		||||
			var ws = X.utils.table_to_sheet(get_dom_element(html));
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6\n");
 | 
			
		||||
			assert.equal(X.utils.sheet_to_csv(ws),  "A,B\n1,2\n3,4\n4,6");
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user