如何使用 js-xlsx 从 HTML 输入读取文件?
How can I read a file from an HTML input with js-xlsx?
我有一个 angular 应用程序,我试图借助 js-xlsx JavaScript 库读取和解析 .xlsx 文件。但是我在 JavaScript 端打开文件时遇到问题。
在我的 html 上,我有一个简单的文件类型输入,可以打开一个文件选择器,用户可以在其中选择合适的文件。我在使用 angular 指令将文件发送到控制器上的函数时遇到了问题,因为当用户仅在按下输入按钮时选择文件时,ng-change 不会更新。我最终不得不通过在我的输入中添加 'onchange="angular.element(this).scope().handleFile(this)"' 来混合使用普通的旧 JavaScript 和一些 angular。
添加-quotation.html:
<div class="container-fluid" ng-controller="addQuotationController">
...
<input type="file" id="file" class="" onchange="angular.element(this).scope().handleFile(this)">
...
</div>
这解决了我无法将文件从 HTML 发送到 JavaScript 端的问题。但是,我无法打开文件。我已经尝试了官方文档中的许多示例,但我没有成功地使其工作。这是我当前的代码:
添加-quotation.component.js:
$scope.handleFile = function(e) {
var files = e.target.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;
var workbook = XLSX.read(data, {type: 'binary'});
/* DO SOMETHING WITH workbook HERE */
};
reader.readAsBinaryString(f);
}
}
我尝试调试,发现该文件确实进入了该方法,但在尝试访问时出现异常 "e.target.files;"
我完全不知道如何解决这个问题,我看到的例子也没有帮助。我做错了什么?
您正在寻找错误的对象,而您应该使用 e.files
。这是因为 e
表示 <input>
元素;也就是 onchange
属性中 this
的值:onchange="angular.element(this).scope().handleFile(this)"
$scope.handleFile = function(e) {
console.log(e.files);
var files = e.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;
var workbook = XLSX.read(data, {type: 'binary'});
/* DO SOMETHING WITH workbook HERE */
};
reader.readAsBinaryString(f);
}
}
我有一个 angular 应用程序,我试图借助 js-xlsx JavaScript 库读取和解析 .xlsx 文件。但是我在 JavaScript 端打开文件时遇到问题。
在我的 html 上,我有一个简单的文件类型输入,可以打开一个文件选择器,用户可以在其中选择合适的文件。我在使用 angular 指令将文件发送到控制器上的函数时遇到了问题,因为当用户仅在按下输入按钮时选择文件时,ng-change 不会更新。我最终不得不通过在我的输入中添加 'onchange="angular.element(this).scope().handleFile(this)"' 来混合使用普通的旧 JavaScript 和一些 angular。
添加-quotation.html:
<div class="container-fluid" ng-controller="addQuotationController">
...
<input type="file" id="file" class="" onchange="angular.element(this).scope().handleFile(this)">
...
</div>
这解决了我无法将文件从 HTML 发送到 JavaScript 端的问题。但是,我无法打开文件。我已经尝试了官方文档中的许多示例,但我没有成功地使其工作。这是我当前的代码:
添加-quotation.component.js:
$scope.handleFile = function(e) {
var files = e.target.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;
var workbook = XLSX.read(data, {type: 'binary'});
/* DO SOMETHING WITH workbook HERE */
};
reader.readAsBinaryString(f);
}
}
我尝试调试,发现该文件确实进入了该方法,但在尝试访问时出现异常 "e.target.files;"
我完全不知道如何解决这个问题,我看到的例子也没有帮助。我做错了什么?
您正在寻找错误的对象,而您应该使用 e.files
。这是因为 e
表示 <input>
元素;也就是 onchange
属性中 this
的值:onchange="angular.element(this).scope().handleFile(this)"
$scope.handleFile = function(e) {
console.log(e.files);
var files = e.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;
var workbook = XLSX.read(data, {type: 'binary'});
/* DO SOMETHING WITH workbook HERE */
};
reader.readAsBinaryString(f);
}
}