如何使用来自外部 link (Amazon S3) 的 SheetJS 解析 Excel 文件
How can I parse an Excel file using SheetJS from an external link (Amazon S3)
我正在尝试解析我已有 URL 的 excel 文件。尝试访问文件以使其可读时,我不断收到不同的错误。现在,这是我的代码:
const input_file = doc.input_file;
const extension = input_file.split('.').pop();
let XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
let oReq = new XMLHttpRequest();
oReq.open("GET", input_file, true);
oReq.responseType = "arraybuffer";
oReq.onload = function(e) {
let arraybuffer = oReq.responseText;
/* convert data to binary string */
let data = new Uint8Array(arraybuffer);
let arr = new Array();
for(let i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
let bstr = arr.join("");
/* Call XLSX */
let workbook = XLSX.read(bstr, {type:"binary"});
/* DO SOMETHING WITH workbook HERE */
let firstSheet = workbook.SheetNames[0];
let parsed = XLSX.utils.sheet_to_csv(firstSheet);
console.log(parsed);
}
oReq.send();
我得到的当前错误是:Error: Unsupported file NaN
在我尝试读取文件时:let workbook = XLSX.read(bstr, {type:"binary"});
我不确定读取外部 link 的最简单方法。有任何想法吗?如果有帮助,我正在使用 Meteor。
XMLHttpRequest 受到 Same Origin Policy 的限制,这意味着您只能直接从自己的域访问内容。
但是您可以在您的服务器上创建一个服务,它会为您加载 sheet 并将其传回客户端。
Here 是一个简单明了的教程。
但请注意,加载第三方文件的一般方法可能是一个严重的安全问题。
因此,如果您的 URL 到 sheet 是不变的,您可以考虑仅通过 php 脚本加载此特定 link,而不允许任何其他 URL。
这是一个可靠的答案。
您的代码有两个问题:
对于二进制文件,应该是let arraybuffer = oReq.response;
,而不是let arraybuffer = oReq.responseText;
您应该在您的 Amazon S3 实例上启用跨源资源共享。只需按照 official tutorial here.
这是一个工作代码笔:
http://codepen.io/KevinWang15/pen/GZXJKj
你在使用 nodeJS 吗?
注意:以上代码仅使用了网络浏览器的 (chrome) XMLHttpRequest,我注意到您正在使用
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest
您使用的是 nodejs 之类的东西吗? (对不起,我对 Meteor 不熟悉)
更具体地说,您使用的是 driverdan/node-XMLHttpRequest
吗?
我对它和您的代码进行了试验,它导致了完全相同的错误消息。我认为这是因为 XMLHttpRequest
与 oReq.response
和 oReq.responseText
仍然存在兼容性问题
如果你使用的是nodeJS,我推荐另一个库:ykzts/node-xmlhttprequest
用
安装
npm i w3c-xmlhttprequest
将您的 XMLHttpRequest 更改为
let XMLHttpRequest = require('w3c-xmlhttprequest').XMLHttpRequest;
而且它立即解决了问题!
一个更好的主意可能是使用 Meteor 的 HTTP package to get the file. The docs are here
使用
添加包
meteor add http
然后使用:
let result = HTTP.get(input_file,function (error,result){
//process result here
});
result.data 将包含您的 Excel 文件,您可以使用 SheetJS 轻松解析该文件。
但是,请确保您已在 Amazon S3 上允许跨源,否则您将收到以下形式的错误:
"No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'blah blah' is therefore not allowed access."
我最终使用了其中一些答案的组合。我想把它 post 放在这里,以防它对其他人有帮助。
我开始使用 Achal 提到的 Meteor HTTP 包。
meteor add http
我还添加了一个来自 Meteor 社区的附加包,允许添加响应类型。
meteor add aldeed:http
然后,我用下面的代码转换成二进制,就可以继续读取sheet:
HTTP.get(input_file, {responseType: 'arraybuffer'}, function(error, result) {
let data = new Uint8Array(result.content);
let arr = new Array();
for(let i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
let bstr = arr.join("");
let workbook = XLSX.read(bstr, {type:"binary"});
var first_sheet_name = workbook.SheetNames[0];
let sheet = workbook.Sheets[first_sheet_name];
let parsed = XLSX.utils.sheet_to_json(sheet);
});
我正在尝试解析我已有 URL 的 excel 文件。尝试访问文件以使其可读时,我不断收到不同的错误。现在,这是我的代码:
const input_file = doc.input_file;
const extension = input_file.split('.').pop();
let XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
let oReq = new XMLHttpRequest();
oReq.open("GET", input_file, true);
oReq.responseType = "arraybuffer";
oReq.onload = function(e) {
let arraybuffer = oReq.responseText;
/* convert data to binary string */
let data = new Uint8Array(arraybuffer);
let arr = new Array();
for(let i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
let bstr = arr.join("");
/* Call XLSX */
let workbook = XLSX.read(bstr, {type:"binary"});
/* DO SOMETHING WITH workbook HERE */
let firstSheet = workbook.SheetNames[0];
let parsed = XLSX.utils.sheet_to_csv(firstSheet);
console.log(parsed);
}
oReq.send();
我得到的当前错误是:Error: Unsupported file NaN
在我尝试读取文件时:let workbook = XLSX.read(bstr, {type:"binary"});
我不确定读取外部 link 的最简单方法。有任何想法吗?如果有帮助,我正在使用 Meteor。
XMLHttpRequest 受到 Same Origin Policy 的限制,这意味着您只能直接从自己的域访问内容。
但是您可以在您的服务器上创建一个服务,它会为您加载 sheet 并将其传回客户端。
Here 是一个简单明了的教程。
但请注意,加载第三方文件的一般方法可能是一个严重的安全问题。 因此,如果您的 URL 到 sheet 是不变的,您可以考虑仅通过 php 脚本加载此特定 link,而不允许任何其他 URL。
这是一个可靠的答案。
您的代码有两个问题:
对于二进制文件,应该是
let arraybuffer = oReq.response;
,而不是let arraybuffer = oReq.responseText;
您应该在您的 Amazon S3 实例上启用跨源资源共享。只需按照 official tutorial here.
这是一个工作代码笔:
http://codepen.io/KevinWang15/pen/GZXJKj
你在使用 nodeJS 吗?
注意:以上代码仅使用了网络浏览器的 (chrome) XMLHttpRequest,我注意到您正在使用
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest
您使用的是 nodejs 之类的东西吗? (对不起,我对 Meteor 不熟悉)
更具体地说,您使用的是 driverdan/node-XMLHttpRequest
吗?
我对它和您的代码进行了试验,它导致了完全相同的错误消息。我认为这是因为 XMLHttpRequest
与 oReq.response
和 oReq.responseText
如果你使用的是nodeJS,我推荐另一个库:ykzts/node-xmlhttprequest
用
安装npm i w3c-xmlhttprequest
将您的 XMLHttpRequest 更改为
let XMLHttpRequest = require('w3c-xmlhttprequest').XMLHttpRequest;
而且它立即解决了问题!
一个更好的主意可能是使用 Meteor 的 HTTP package to get the file. The docs are here
使用
添加包meteor add http
然后使用:
let result = HTTP.get(input_file,function (error,result){
//process result here
});
result.data 将包含您的 Excel 文件,您可以使用 SheetJS 轻松解析该文件。
但是,请确保您已在 Amazon S3 上允许跨源,否则您将收到以下形式的错误:
"No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'blah blah' is therefore not allowed access."
我最终使用了其中一些答案的组合。我想把它 post 放在这里,以防它对其他人有帮助。
我开始使用 Achal 提到的 Meteor HTTP 包。
meteor add http
我还添加了一个来自 Meteor 社区的附加包,允许添加响应类型。
meteor add aldeed:http
然后,我用下面的代码转换成二进制,就可以继续读取sheet:
HTTP.get(input_file, {responseType: 'arraybuffer'}, function(error, result) {
let data = new Uint8Array(result.content);
let arr = new Array();
for(let i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
let bstr = arr.join("");
let workbook = XLSX.read(bstr, {type:"binary"});
var first_sheet_name = workbook.SheetNames[0];
let sheet = workbook.Sheets[first_sheet_name];
let parsed = XLSX.utils.sheet_to_json(sheet);
});