forked from sheetjs/sheetjs
angular 1 demo [ci skip]
This commit is contained in:
parent
36022a0f56
commit
c7e7180ab9
32
demos/angular/README.md
Normal file
32
demos/angular/README.md
Normal file
@ -0,0 +1,32 @@
|
||||
# Angular 1
|
||||
|
||||
The `xlsx.core.min.js` and `xlsx.full.min.js` scripts are designed to be dropped
|
||||
into web pages with script tags e.g.
|
||||
|
||||
```html
|
||||
<script src="xlsx.full.min.js"></script>
|
||||
```
|
||||
|
||||
Strictly speaking, there should be no need for an angular demo! You can proceed
|
||||
as you would with any other browser-friendly library. To make this meaningful,
|
||||
we chose to show an integration with a common angular table component.
|
||||
|
||||
This demo uses angular-ui-grid to display a data table. The ui-grid does not
|
||||
provide any way to hook into the import button, so the demo includes a simple
|
||||
directive for a HTML File Input control. It also includes a sample service for
|
||||
export which adds an item to the export menu.
|
||||
|
||||
## Import Directive
|
||||
|
||||
`SheetJSImportDirective` follows the prescription from the README for File input
|
||||
controls using `readAsBinaryString`, converting to a suitable representation
|
||||
and updating the scope.
|
||||
|
||||
## Export Service
|
||||
|
||||
`SheetJSExportService` exposes export functions for `XLSB` and `XLSX`. Other
|
||||
formats are easily supported by changing the `bookType` variable. It grabs
|
||||
values from the grid, builds an array of arrays, generates a workbook and uses
|
||||
FileSaver to generate a download. By setting the `filename` and `sheetname`
|
||||
options in the ui-grid options, the output can be controlled.
|
||||
|
107
demos/angular/SheetJS-angular.js
vendored
Normal file
107
demos/angular/SheetJS-angular.js
vendored
Normal file
@ -0,0 +1,107 @@
|
||||
/* 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]);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<!--
|
||||
demo from angular-js-xlsx
|
||||
npm: https://www.npmjs.com/package/angular-js-xlsx
|
||||
author: @brexis Boris Koumondji
|
||||
license: MIT
|
||||
-->
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Angular Js XLS</title>
|
||||
</head>
|
||||
<body ng-app="MyApp">
|
||||
<div ng-controller="myController">
|
||||
<js-xls onread="read" onerror="error"></js-xls>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
|
||||
<!--<script type="text/javascript" src="xlsx.core.min.js"></script>-->
|
||||
<script type="text/javascript" src="xlsx.full.min.js"></script>
|
||||
<script type="text/javascript" src="//unpkg.com/angular-js-xlsx/angular-js-xlsx.js"></script>
|
||||
<script type="text/javascript">
|
||||
angular.module('MyApp', ['angular-js-xlsx'])
|
||||
.controller('myController', function($scope) {
|
||||
$scope.read = function (workbook) {
|
||||
/* DO SOMETHING WITH workbook HERE */
|
||||
console.log(workbook);
|
||||
}
|
||||
|
||||
$scope.error = function (e) {
|
||||
/* DO SOMETHING WHEN ERROR IS THROWN */
|
||||
console.log(e);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
43
demos/angular/app.js
vendored
Normal file
43
demos/angular/app.js
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
var app = angular.module('app', ['ngAnimate', 'ngTouch', 'ui.grid', 'ui.grid.selection', 'ui.grid.exporter']);
|
||||
|
||||
/* Inject SheetJSExportService */
|
||||
app.factory('SheetJSExportService', SheetJSExportService);
|
||||
SheetJSExportService.inject = ['uiGridExporterService'];
|
||||
|
||||
app.controller('MainCtrl', ['$scope', '$http','SheetJSExportService', function ($scope, $http, SheetJSExportService) {
|
||||
$scope.gridOptions = {
|
||||
columnDefs: [
|
||||
{ field: 'name' },
|
||||
{ field: 'gender', visible: false},
|
||||
{ field: 'company' }
|
||||
],
|
||||
enableGridMenu: true,
|
||||
enableSelectAll: true,
|
||||
exporterMenuPdf: false,
|
||||
exporterMenuCsv: false,
|
||||
showHeader: true,
|
||||
onRegisterApi: function(gridApi){
|
||||
$scope.gridApi = gridApi;
|
||||
},
|
||||
/* SheetJS Service setup */
|
||||
filename: "SheetJSAngular",
|
||||
sheetname: "ng-SheetJS",
|
||||
gridMenuCustomItems: [
|
||||
{
|
||||
title: 'Export all data as XLSX',
|
||||
action: function ($event) { SheetJSExportService.exportXLSX($scope.gridApi); },
|
||||
order: 200
|
||||
},
|
||||
{
|
||||
title: 'Export all data as XLSB',
|
||||
action: function ($event) { SheetJSExportService.exportXLSB($scope.gridApi); },
|
||||
order: 201
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
$http.get('https://cdn.rawgit.com/angular-ui/ui-grid.info/gh-pages/data/100.json').success(function(data) { $scope.gridOptions.data = data; });
|
||||
|
||||
}]);
|
||||
app.directive("importSheetJs", [SheetJSImportDirective]);
|
Loading…
Reference in New Issue
Block a user