Psyduck - 可達鴨 之 鴨力山大 v0.1
Current File : /home/irplbiz/node_application/icl_calc/node_modules/xlsx-calc/index.html |
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
#drop_xlsx {
border: 2px dashed #CCC;
padding: 10px;
margin: 10px;
}
.selected {
border: 1px solid #00F;
}
</style>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.full.min.js"></script>
<script type="text/javascript" src="xlsx-calc.js"></script>
</head>
<body ng-app="xlsxApp">
<div id="drop_xlsx">
Arraste o arquivo aqui
</div>
<div ng-controller="xlsxCtrl">
<table>
<tr ng-repeat="row in sheet track by $index">
<td ng-repeat="cell in row track by $index">
<input type="text" ng-model="cell.v" onkeydown="excel()" ng-change="recalc()"/>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
/* global angular, XLSX_CALC, XLSX */
var tdSelection, originalValue;
function setSelected(td) {
td.classList.add('selected');
tdSelection.classList.remove('selected');
tdSelection = td;
}
function excel(e) {
var event = window.event ? window.event : e;
var td = tdSelection || (tdSelection = event.target.parentNode);
var tr = td.parentNode;
var tdIndex = td.cellIndex;
var table = tr.parentNode;
var trIndex = tr.rowIndex;
if (event.keyCode === 38) {
var tdUp = table.children[trIndex-1].children[tdIndex];
setSelected(tdUp);
}
if (event.keyCode === 37) {
var tdLeft = table.children[trIndex].children[tdIndex-1];
setSelected(tdLeft);
}
if (event.keyCode === 39) {
var tdRight = table.children[trIndex].children[tdIndex+1];
setSelected(tdRight);
}
if (event.keyCode === 40) {
var tdDown = table.children[trIndex+1].children[tdIndex];
setSelected(tdDown);
}
if (isArrow(event)) {
event.preventDefault();
var val = originalValue || (originalValue = event.target.value);
var cel = XLSX_CALC.int_2_col_str(tdSelection.cellIndex) + (tdSelection.parentNode.rowIndex + 1);
val = val + cel;
event.target.value = val;
}
if (event.keyCode === 13 || !isArrow(event)) {
if (tdSelection) {
tdSelection.classList.remove('selected');
}
tdSelection = null;
originalValue = null;
}
}
function isArrow(event) {
return 37 <= event.keyCode && event.keyCode <= 40;
}
angular
.module('xlsxApp', [])
.controller('xlsxCtrl', function($scope) {
$scope.recalc = function() {
XLSX_CALC($scope.workbook);
};
function max_row(str_range) {
return parseInt(str_range.split(':')[1].replace(/^[A-Z]+/, ''), 10);
}
function max_col(str_range) {
return XLSX_CALC.col_str_2_int(str_range.split(':')[1]);
}
function convert2matrix(sheet) {
var matrix = [];
var mr = max_row(sheet['!ref']);
var mc = max_col(sheet['!ref']);
for (var i = 0; i <= mr; i++) {
var row = [];
for (var j = 0; j <= mc; j++) {
var cell_name = XLSX_CALC.int_2_col_str(j) + (i+1);
row.push(sheet[cell_name] || (sheet[cell_name] = {v:''}));
}
matrix.push(row);
}
return matrix;
}
function handleDrop(e) {
e.stopPropagation();
e.preventDefault();
var files = e.dataTransfer.files;
var i, f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
//var name = f.name;
reader.onload = function(e) {
var data = e.target.result;
/* if binary string, read with type 'binary' */
$scope.workbook = XLSX.read(data, {
type: 'binary'
});
/* DO SOMETHING WITH workbook HERE */
var sheet_name = $scope.workbook.SheetNames[0];
var start = new Date().getTime();
XLSX_CALC($scope.workbook);
console.log($scope.workbook.Sheets['Planilha2']);
console.log('calculada em', (new Date().getTime() - start) + 'ms');
$scope.sheet = convert2matrix($scope.workbook.Sheets[sheet_name]);
$scope.ref = $scope.sheet['!ref'];
$scope.$apply();
};
reader.readAsBinaryString(f);
}
}
var drop = document.getElementById('drop_xlsx');
function handleDragover(e) {
e.stopPropagation();
e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
}
if(drop.addEventListener) {
drop.addEventListener('dragenter', handleDragover, false);
drop.addEventListener('dragover', handleDragover, false);
drop.addEventListener('drop', handleDrop, false);
}
});
</script>
</body>
</html>