【发布时间】:2016-09-19 06:42:20
【问题描述】:
我正在使用 sheetJs 从指令中的 csv/xls 文件中获取 json 数据。
myApp.directive("fileRead", [function () {
return {
scope: {
data: '='
},
link: function ($scope, $elm, $attrs) {
$elm.on('change', function (changeEvent) {
var reader = new FileReader();
reader.onload = function (evt) {
$scope.$apply(function () {
var data = evt.target.result;
var workbook = XLSX.read(data, {type: 'binary'});
var headerNames = XLSX.utils.sheet_to_json(
workbook.Sheets[workbook.SheetNames[0]],
{header: 1}
)[0];
console.log("headerNames: ", headerNames);
var data = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
console.log("sheet2Json: " , data);
$scope.columnDefs = [];
headerNames.forEach(function (h) {
$scope.columnDefs.push({field: h});
});
$scope.data = data;
console.log("file 4: " , data);
$elm.val(null);
});
};
reader.readAsBinaryString(changeEvent.target.files[0]);
});
}
};
}]);
以 json 格式检索的数据位于 $scope.data = data; 对象中。我在一个单独的 js 文件中有我的示例handsontable,如下所示:
var myData = [
["KK", 1234567890, "k.k999@gmail.com", "kvp@gmail.com"],
["KK", 1234567890, "k.k999@gmail.com", "kvp@gmail.com"],
["KK", 1234567890, "k.k999@gmail.com", "kvp@gmail.com"],
],
container = document.querySelector('#exampleGrid');
var hot = new Handsontable(container, {
data: myData,
startRows: 5,
startCols: 5,
minSpareCols: 0,
//always keep at least 1 spare row at the right
minSpareRows: 0,
//always keep at least 1 spare row at the bottom,
rowHeaders: true,
colHeaders: ['Name', 'Mobile number', 'Sender Email', 'Receiver Email'],
contextMenu: true,
width: 120,
wordWrap: true
});
查看 Handsontable 文档,我看到了一种加载 json 数据的方法:
hot.loadData(data.data);
现在我如何将 scope.data(jsondata) 加载到上述方法中,该方法位于单独的 js 文件中。我是否必须创建一个控制器并将数据传递给控制器范围?
HTML:
<div class="top-big-link">
<file-read>
<input id="csvFile" type="file" name="image" accept=".xls, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" title=" "/>
<button id="csvFileImport" class="ImportFromExcelButton"><i class="fa fa-file-excel-o"> </i> Import from Excel</button>
</file-read>
<script>
document.getElementById('csvFileImport').addEventListener('click', function () {
document.getElementById('csvFile').click();
});
</script>
</div>
【问题讨论】:
标签: javascript angularjs handsontable