forked from sheetjs/sheetjs
		
	version bump 0.5.0: changes to cell interface
Cell object stores the formatted text in the `.w` field - Raw format and types are preserved in the `.t`, `.v` fields - Accessors have been updated to use the field updates for older OOXML: - ECMA-376 makes reference to old sstItem shared string item - [MS-XLSX] xmlns for workbook
This commit is contained in:
		
							parent
							
								
									5c4bf62b83
								
							
						
					
					
						commit
						a96d8964e2
					
				
							
								
								
									
										33
									
								
								README.md
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										33
									
								
								README.md
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| # xlsx | ||||
| 
 | ||||
| Currently a parser for XLSX/XLSM/XLSB files.  Cleanroom implementation from the  | ||||
| Currently a parser for XLSX/XLSM/XLSB files.  Cleanroom implementation from the | ||||
| ISO 29500  Office Open XML specifications, [MS-XLSB], and related documents. | ||||
| 
 | ||||
| ## Installation | ||||
| @ -19,7 +19,7 @@ In the browser: | ||||
| 
 | ||||
| The node version installs a binary `xlsx2csv` which can read XLSX/XLSM/XLSB files and output the contents in various formats.  The source is available at `xlsx2csv.njs` in the bin directory. | ||||
| 
 | ||||
| See <http://oss.sheetjs.com/js-xlsx/> for a browser example.  | ||||
| See <http://oss.sheetjs.com/js-xlsx/> for a browser example. | ||||
| 
 | ||||
| Note that older versions of IE does not support HTML5 File API, so the base64 mode is provided for testing.  On OSX you can get the base64 encoding by running: | ||||
| 
 | ||||
| @ -39,18 +39,24 @@ Simple usage (walks through every cell of every sheet and dumps the values): | ||||
| 
 | ||||
| Some helper functions in `XLSX.utils` generate different views of the sheets: | ||||
| 
 | ||||
| - `XLSX.utils.sheet_to_csv` generates CSV  | ||||
| - `XLSX.utils.sheet_to_csv` generates CSV | ||||
| - `XLSX.utils.sheet_to_row_object_array` interprets sheets as tables with a header column and generates an array of objects | ||||
| - `XLSX.utils.get_formulae` generates a list of formulae | ||||
| 
 | ||||
| ## Notes  | ||||
| ## Notes | ||||
| 
 | ||||
| `.SheetNames` is an ordered list of the sheets in the workbook | ||||
| 
 | ||||
| `.Sheets[sheetname]` returns a data structure representing the sheet.  Each key | ||||
| that does not start with `!` corresponds to a cell (using `A-1` notation).   | ||||
| that does not start with `!` corresponds to a cell (using `A-1` notation). | ||||
| 
 | ||||
| `.Sheets[sheetname][address].v` returns the value of the specified cell and `.Sheets[sheetname][address].t` returns the type of the cell (constrained to the enumeration `ST_CellType` as documented in page 4215 of ISO/IEC 29500-1:2012(E) )  | ||||
| `.Sheets[sheetname][address]` returns the specified cell: | ||||
| 
 | ||||
| - `.v` returns the raw value of the cell | ||||
| - `.w` returns the formatted text of the cell | ||||
| - `.t` returns the type of the cell (constrained to the enumeration `ST_CellType` as documented in page 4215 of ISO/IEC 29500-1:2012(E) ) | ||||
| 
 | ||||
| For dates, `.v` holds the raw date code from the sheet and `.w` holds the text | ||||
| 
 | ||||
| For more details: | ||||
| 
 | ||||
| @ -69,12 +75,25 @@ Tests utilize the mocha testing framework.  Travis-CI and Sauce Labs links: | ||||
| 
 | ||||
|  - <https://travis-ci.org/SheetJS/js-xlsx> for XLSX module in node | ||||
|  - <https://travis-ci.org/SheetJS/SheetJS.github.io> for XLS* modules | ||||
|  - <https://saucelabs.com/u/sheetjs> for XLS* modules using Sauce Labs  | ||||
|  - <https://saucelabs.com/u/sheetjs> for XLS* modules using Sauce Labs | ||||
| 
 | ||||
| ## Test Files | ||||
| 
 | ||||
| Test files are housed in [another repo](https://github.com/SheetJS/test_files). | ||||
| 
 | ||||
| ## Testing | ||||
| 
 | ||||
| `make test` will run the node-based tests.  To run the in-browser tests, clone | ||||
| [the oss.sheetjs.com repo](https://github.com/SheetJS/SheetJS.github.io) and | ||||
| replace the xlsx.js file (then fire up the browser and go to `stress.html`): | ||||
| 
 | ||||
| ``` | ||||
| $ cp xlsx.js ../SheetJS.github.io | ||||
| $ cd ../SheetJS.github.io | ||||
| $ simplehttpserver # or "python -mSimpleHTTPServer" or "serve" | ||||
| $ open -a Chromium.app http://localhost:8000/stress.html | ||||
| ``` | ||||
| 
 | ||||
| ## XLS Support | ||||
| 
 | ||||
| XLS is available in [js-xls](https://github.com/SheetJS/js-xls). | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| XLSX.version = '0.4.3'; | ||||
| XLSX.version = '0.5.0'; | ||||
|  | ||||
| @ -133,7 +133,7 @@ var parse_sst_xml = function(data) { | ||||
| 	/* 18.4.9 sst CT_Sst */ | ||||
| 	var sst = data.match(new RegExp("<sst([^>]*)>([\\s\\S]*)<\/sst>","m")); | ||||
| 	if(isval(sst)) { | ||||
| 		s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(parse_si).filter(function(x) { return x; }); | ||||
| 		s = sst[2].replace(/<(?:si|sstItem)>/g,"").split(/<\/(?:si|sstItem)>/).map(parse_si).filter(function(x) { return x; }); | ||||
| 		sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount; | ||||
| 	} | ||||
| 	return s; | ||||
|  | ||||
| @ -70,12 +70,7 @@ function parse_worksheet(data) { | ||||
| 				var cf = styles.CellXf[cell.s]; | ||||
| 				if(cf && cf.numFmtId) fmtid = cf.numFmtId; | ||||
| 			} | ||||
| 			p.raw = p.v; | ||||
| 			p.rawt = p.t; | ||||
| 			try { | ||||
| 				p.v = SSF.format(fmtid,p.v,_ssfopts); | ||||
| 				p.t = 'str'; | ||||
| 			} catch(e) { p.v = p.raw; p.t = p.rawt; } | ||||
| 			try { p.w = SSF.format(fmtid,p.v,_ssfopts); } catch(e) { } | ||||
| 
 | ||||
| 			s[cell.r] = p; | ||||
| 		}); | ||||
|  | ||||
| @ -1,4 +1,8 @@ | ||||
| var XMLNS_WB = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'; | ||||
| var XMLNS_WB = [ | ||||
| 	'http://schemas.openxmlformats.org/spreadsheetml/2006/main', | ||||
| 	'http://schemas.microsoft.com/office/excel/2006/main', | ||||
| 	'http://schemas.microsoft.com/office/excel/2006/2' | ||||
| ]; | ||||
| 
 | ||||
| /* 18.2 Workbook */ | ||||
| function parse_workbook(data) { | ||||
| @ -102,7 +106,7 @@ function parse_workbook(data) { | ||||
| 			case '</mc:AlternateContent>': pass=false; break; | ||||
| 		} | ||||
| 	}); | ||||
| 	if(wb.xmlns !== XMLNS_WB) throw new Error("Unknown Namespace: " + wb.xmlns); | ||||
| 	if(XMLNS_WB.indexOf(wb.xmlns) === -1) throw new Error("Unknown Namespace: " + wb.xmlns); | ||||
| 
 | ||||
| 	var z; | ||||
| 	/* defaults */ | ||||
|  | ||||
| @ -16,9 +16,12 @@ function parseZip(zip) { | ||||
| 	if(dir.style) styles = parse_sty(getdata(getzipfile(zip, dir.style.replace(/^\//,''))),dir.style); | ||||
| 
 | ||||
| 	var wb = parse_wb(getdata(getzipfile(zip, dir.workbooks[0].replace(/^\//,''))), dir.workbooks[0]); | ||||
| 	var propdata = dir.coreprops.length !== 0 ? getdata(getzipfile(zip, dir.coreprops[0].replace(/^\//,''))) : ""; | ||||
| 	var props = {}, propdata = ""; | ||||
| 	try { | ||||
| 		propdata = dir.coreprops.length !== 0 ? getdata(getzipfile(zip, dir.coreprops[0].replace(/^\//,''))) : ""; | ||||
| 	propdata += dir.extprops.length !== 0 ? getdata(getzipfile(zip, dir.extprops[0].replace(/^\//,''))) : ""; | ||||
| 	var props = propdata !== "" ? parseProps(propdata) : {}; | ||||
| 		props = propdata !== "" ? parseProps(propdata) : {}; | ||||
| 	} catch(e) { } | ||||
| 	var deps = {}; | ||||
| 	if(dir.calcchain) deps=parseDeps(getdata(getzipfile(zip, dir.calcchain.replace(/^\//,'')))); | ||||
| 	var sheets = {}, i=0; | ||||
|  | ||||
| @ -20,7 +20,8 @@ function sheet_to_row_object_array(sheet, opts){ | ||||
| 	for(R=r.s.r, C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		val = sheet[encode_cell({c:C,r:R})]; | ||||
| 		if(!val) continue; | ||||
| 		switch(val.t) { | ||||
| 		if(val.w) hdr[C] = val.w; | ||||
| 		else switch(val.t) { | ||||
| 			case 's': case 'str': hdr[C] = val.v; break; | ||||
| 			case 'n': hdr[C] = val.v; break; | ||||
| 		} | ||||
| @ -33,7 +34,7 @@ function sheet_to_row_object_array(sheet, opts){ | ||||
| 		for (C = r.s.c; C <= r.e.c; ++C) { | ||||
| 			val = sheet[encode_cell({c: C,r: R})]; | ||||
| 			if(!val || !val.t) continue; | ||||
| 			if(typeof val.w !== 'undefined') { row[hdr[C]] = val.w; isempty = false; } | ||||
| 			if(typeof val.w !== 'undefined' && !opts.raw) { row[hdr[C]] = val.w; isempty = false; } | ||||
| 			else switch(val.t){ | ||||
| 				case 's': case 'str': case 'b': case 'n': | ||||
| 					if(val.v !== undefined) { | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| { | ||||
| 	"name": "xlsx", | ||||
| 	"version": "0.4.3", | ||||
| 	"version": "0.5.0", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "XLSB / XLSX / XLSM parser", | ||||
| 	"keywords": [ "xlsx", "xlsb", "xlsm", "office", "excel", "spreadsheet" ], | ||||
|  | ||||
							
								
								
									
										12
									
								
								tests.lst
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										12
									
								
								tests.lst
									
									
									
									
									
								
							| @ -51,6 +51,7 @@ apachepoi_52348.xlsx | ||||
| apachepoi_52716.xlsx | ||||
| apachepoi_53101.xlsx | ||||
| apachepoi_53282.xlsx | ||||
| apachepoi_53282b.xlsx | ||||
| apachepoi_53568.xlsx | ||||
| apachepoi_53734.xlsx | ||||
| apachepoi_53798.xlsx | ||||
| @ -66,6 +67,12 @@ apachepoi_54607.xlsx | ||||
| apachepoi_55640.xlsx | ||||
| apachepoi_55745.xlsx | ||||
| apachepoi_55850.xlsx | ||||
| apachepoi_55923.xlsx | ||||
| apachepoi_55924.xlsx | ||||
| apachepoi_55926.xlsx | ||||
| apachepoi_55927.xlsx | ||||
| apachepoi_56011.xlsx | ||||
| apachepoi_56017.xlsx | ||||
| apachepoi_AverageTaxRates.xlsx | ||||
| apachepoi_Booleans.xlsx | ||||
| apachepoi_BrNotClosed.xlsx | ||||
| @ -111,9 +118,10 @@ apachepoi_WithVariousData.xlsx | ||||
| apachepoi_atp.xlsx | ||||
| apachepoi_chart_sheet.xlsx.pending | ||||
| apachepoi_comments.xlsx | ||||
| apachepoi_headerFooterTest.xlsx | ||||
| apachepoi_picture.xlsx | ||||
| apachepoi_reordered_sheets.xlsx | ||||
| apachepoi_sample-beta.xlsx.pending | ||||
| apachepoi_sample-beta.xlsx | ||||
| apachepoi_sample.xlsx | ||||
| apachepoi_shared_formulas.xlsx | ||||
| apachepoi_sheetProtection_allLocked.xlsx | ||||
| @ -154,7 +162,7 @@ openpyxl_g_empty-with-styles.xlsx | ||||
| openpyxl_g_empty.xlsx | ||||
| openpyxl_g_empty_libre.xlsx | ||||
| openpyxl_g_empty_no_dimensions.xlsx | ||||
| openpyxl_g_empty_with_no_properties.xlsx.pending | ||||
| openpyxl_g_empty_with_no_properties.xlsx | ||||
| openpyxl_g_guess_types.xlsx | ||||
| openpyxl_g_libreoffice_nrt.xlsx | ||||
| openpyxl_g_merge_range.xlsx | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| Subproject commit a9fc7e00949b0f7621f0b51e0ed5b139bac8e109 | ||||
| Subproject commit dc341311b12ebd490dd876086e822eb992f45e49 | ||||
							
								
								
									
										31
									
								
								xlsx.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										31
									
								
								xlsx.js
									
									
									
									
									
								
							| @ -420,7 +420,7 @@ SSF.load_table = function(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i]) SSF.loa | ||||
| make_ssf(SSF); | ||||
| var XLSX = {}; | ||||
| (function(XLSX){ | ||||
| XLSX.version = '0.4.3'; | ||||
| XLSX.version = '0.5.0'; | ||||
| var current_codepage, current_cptable, cptable; | ||||
| if(typeof module !== "undefined" && typeof require !== 'undefined') { | ||||
| 	if(typeof cptable === 'undefined') cptable = require('codepage'); | ||||
| @ -932,7 +932,7 @@ var parse_sst_xml = function(data) { | ||||
| 	/* 18.4.9 sst CT_Sst */ | ||||
| 	var sst = data.match(new RegExp("<sst([^>]*)>([\\s\\S]*)<\/sst>","m")); | ||||
| 	if(isval(sst)) { | ||||
| 		s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(parse_si).filter(function(x) { return x; }); | ||||
| 		s = sst[2].replace(/<(?:si|sstItem)>/g,"").split(/<\/(?:si|sstItem)>/).map(parse_si).filter(function(x) { return x; }); | ||||
| 		sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount; | ||||
| 	} | ||||
| 	return s; | ||||
| @ -1385,12 +1385,7 @@ function parse_worksheet(data) { | ||||
| 				var cf = styles.CellXf[cell.s]; | ||||
| 				if(cf && cf.numFmtId) fmtid = cf.numFmtId; | ||||
| 			} | ||||
| 			p.raw = p.v; | ||||
| 			p.rawt = p.t; | ||||
| 			try { | ||||
| 				p.v = SSF.format(fmtid,p.v,_ssfopts); | ||||
| 				p.t = 'str'; | ||||
| 			} catch(e) { p.v = p.raw; p.t = p.rawt; } | ||||
| 			try { p.w = SSF.format(fmtid,p.v,_ssfopts); } catch(e) { } | ||||
| 
 | ||||
| 			s[cell.r] = p; | ||||
| 		}); | ||||
| @ -1635,7 +1630,11 @@ var CustomWBViewDef = { | ||||
| 	xWindow: '0', | ||||
| 	yWindow: '0' | ||||
| }; | ||||
| var XMLNS_WB = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'; | ||||
| var XMLNS_WB = [ | ||||
| 	'http://schemas.openxmlformats.org/spreadsheetml/2006/main', | ||||
| 	'http://schemas.microsoft.com/office/excel/2006/main', | ||||
| 	'http://schemas.microsoft.com/office/excel/2006/2' | ||||
| ]; | ||||
| 
 | ||||
| /* 18.2 Workbook */ | ||||
| function parse_workbook(data) { | ||||
| @ -1739,7 +1738,7 @@ function parse_workbook(data) { | ||||
| 			case '</mc:AlternateContent>': pass=false; break; | ||||
| 		} | ||||
| 	}); | ||||
| 	if(wb.xmlns !== XMLNS_WB) throw new Error("Unknown Namespace: " + wb.xmlns); | ||||
| 	if(XMLNS_WB.indexOf(wb.xmlns) === -1) throw new Error("Unknown Namespace: " + wb.xmlns); | ||||
| 
 | ||||
| 	var z; | ||||
| 	/* defaults */ | ||||
| @ -2656,9 +2655,12 @@ function parseZip(zip) { | ||||
| 	if(dir.style) styles = parse_sty(getdata(getzipfile(zip, dir.style.replace(/^\//,''))),dir.style); | ||||
| 
 | ||||
| 	var wb = parse_wb(getdata(getzipfile(zip, dir.workbooks[0].replace(/^\//,''))), dir.workbooks[0]); | ||||
| 	var propdata = dir.coreprops.length !== 0 ? getdata(getzipfile(zip, dir.coreprops[0].replace(/^\//,''))) : ""; | ||||
| 	var props = {}, propdata = ""; | ||||
| 	try { | ||||
| 		propdata = dir.coreprops.length !== 0 ? getdata(getzipfile(zip, dir.coreprops[0].replace(/^\//,''))) : ""; | ||||
| 	propdata += dir.extprops.length !== 0 ? getdata(getzipfile(zip, dir.extprops[0].replace(/^\//,''))) : ""; | ||||
| 	var props = propdata !== "" ? parseProps(propdata) : {}; | ||||
| 		props = propdata !== "" ? parseProps(propdata) : {}; | ||||
| 	} catch(e) { } | ||||
| 	var deps = {}; | ||||
| 	if(dir.calcchain) deps=parseDeps(getdata(getzipfile(zip, dir.calcchain.replace(/^\//,'')))); | ||||
| 	var sheets = {}, i=0; | ||||
| @ -2755,7 +2757,8 @@ function sheet_to_row_object_array(sheet, opts){ | ||||
| 	for(R=r.s.r, C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		val = sheet[encode_cell({c:C,r:R})]; | ||||
| 		if(!val) continue; | ||||
| 		switch(val.t) { | ||||
| 		if(val.w) hdr[C] = val.w; | ||||
| 		else switch(val.t) { | ||||
| 			case 's': case 'str': hdr[C] = val.v; break; | ||||
| 			case 'n': hdr[C] = val.v; break; | ||||
| 		} | ||||
| @ -2768,7 +2771,7 @@ function sheet_to_row_object_array(sheet, opts){ | ||||
| 		for (C = r.s.c; C <= r.e.c; ++C) { | ||||
| 			val = sheet[encode_cell({c: C,r: R})]; | ||||
| 			if(!val || !val.t) continue; | ||||
| 			if(typeof val.w !== 'undefined') { row[hdr[C]] = val.w; isempty = false; } | ||||
| 			if(typeof val.w !== 'undefined' && !opts.raw) { row[hdr[C]] = val.w; isempty = false; } | ||||
| 			else switch(val.t){ | ||||
| 				case 's': case 'str': case 'b': case 'n': | ||||
| 					if(val.v !== undefined) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user