forked from sheetjs/sheetjs
		
	
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | |
| function SheetJSExportService(uiGridExporterService) {
 | |
| 
 | |
| 	function exportSheetJS(gridApi, wopts) {
 | |
| 		var columns = uiGridExporterService.getColumnHeaders(gridApi.grid, 'all');
 | |
| 		var data = uiGridExporterService.getData(gridApi.grid, 'all', 'all');
 | |
| 
 | |
| 		var fileName = gridApi.grid.options.filename || 'SheetJS';
 | |
| 		fileName += wopts.bookType ? "." + wopts.bookType : '.xlsx';
 | |
| 
 | |
| 		var sheetName = gridApi.grid.options.sheetname || 'Sheet1';
 | |
| 
 | |
| 		var wb = XLSX.utils.book_new(), ws = uigrid_to_sheet(data, columns);
 | |
| 		XLSX.utils.book_append_sheet(wb, ws, sheetName);
 | |
| 		var wbout = XLSX.write(wb, wopts);
 | |
| 		saveAs(new Blob([s2ab(wbout)], { type: 'application/octet-stream' }), fileName);
 | |
| 	}
 | |
| 
 | |
| 	var service = {};
 | |
| 	service.exportXLSB = function exportXLSB(gridApi) { return exportSheetJS(gridApi, { bookType: 'xlsb', bookSST: true, type: 'binary' }); };
 | |
| 	service.exportXLSX = function exportXLSX(gridApi) { return exportSheetJS(gridApi, { bookType: 'xlsx', bookSST: true, type: 'binary' }); }
 | |
| 
 | |
| 	return service;
 | |
| 
 | |
| 	/* utilities */
 | |
| 	function uigrid_to_sheet(data, columns) {
 | |
| 		var o = [], oo = [], i = 0, j = 0;
 | |
| 
 | |
| 		/* column headers */
 | |
| 		for(j = 0; j < columns.length; ++j) oo.push(get_value(columns[j]));
 | |
| 		o.push(oo);
 | |
| 
 | |
| 		/* table data */
 | |
| 		for(i = 0; i < data.length; ++i) {
 | |
| 			oo = [];
 | |
| 			for(j = 0; j < data[i].length; ++j) oo.push(get_value(data[i][j]));
 | |
| 			o.push(oo);
 | |
| 		}
 | |
| 		/* aoa_to_sheet converts an array of arrays into a worksheet object */
 | |
| 		return XLSX.utils.aoa_to_sheet(o);
 | |
| 	}
 | |
| 
 | |
| 	function get_value(col) {
 | |
| 		if(!col) return col;
 | |
| 		if(col.value) return col.value;
 | |
| 		if(col.displayName) return col.displayName;
 | |
| 		if(col.name) return col.name;
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 	function s2ab(s) {
 | |
| 		if(typeof ArrayBuffer !== 'undefined') {
 | |
| 			var buf = new ArrayBuffer(s.length);
 | |
| 			var view = new Uint8Array(buf);
 | |
| 			for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
 | |
| 			return buf;
 | |
| 		} else {
 | |
| 			var buf = new Array(s.length);
 | |
| 			for (var i=0; i!=s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
 | |
| 			return buf;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| var SheetJSImportDirective = function() {
 | |
| 	return {
 | |
| 		scope: { opts: '=' },
 | |
| 		link: function ($scope, $elm, $attrs) {
 | |
| 			$elm.on('change', function (changeEvent) {
 | |
| 				var reader = new FileReader();
 | |
| 
 | |
| 				reader.onload = function (e) {
 | |
| 					/* read workbook */
 | |
| 					var bstr = e.target.result;
 | |
| 					var wb = XLSX.read(bstr, {type:'binary'});
 | |
| 
 | |
| 					/* grab first sheet */
 | |
| 					var wsname = wb.SheetNames[0];
 | |
| 					var ws = wb.Sheets[wsname];
 | |
| 
 | |
| 					/* grab first row and generate column headers */
 | |
| 					var aoa = XLSX.utils.sheet_to_json(ws, {header:1, raw:false});
 | |
| 					var cols = [];
 | |
| 					for(var i = 0; i < aoa[0].length; ++i) cols[i] = { field: aoa[0][i] };
 | |
| 
 | |
| 					/* generate rest of the data */
 | |
| 					var data = [];
 | |
| 					for(var r = 1; r < aoa.length; ++r) {
 | |
| 						data[r-1] = {};
 | |
| 						for(i = 0; i < aoa[r].length; ++i) {
 | |
| 							if(aoa[r][i] == null) continue;
 | |
| 							data[r-1][aoa[0][i]] = aoa[r][i]
 | |
| 						}
 | |
| 					}
 | |
| 
 | |
| 					/* update scope */
 | |
| 					$scope.$apply(function() {
 | |
| 						$scope.opts.columnDefs = cols;
 | |
| 						$scope.opts.data = data;
 | |
| 					});
 | |
| 				};
 | |
| 
 | |
| 				reader.readAsBinaryString(changeEvent.target.files[0]);
 | |
| 			});
 | |
| 		}
 | |
| 	}
 | |
| }
 |