Javascript 如何从外部链接(Amazon S3)使用SheetJS解析Excel文件
我正在尝试解析一个excel文件,我已经有了它的URL。我在尝试访问该文件以使其可读时不断遇到不同的错误。现在,这是我的代码:Javascript 如何从外部链接(Amazon S3)使用SheetJS解析Excel文件,javascript,excel,meteor,amazon-s3,xmlhttprequest,Javascript,Excel,Meteor,Amazon S3,Xmlhttprequest,我正在尝试解析一个excel文件,我已经有了它的URL。我在尝试访问该文件以使其可读时不断遇到不同的错误。现在,这是我的代码: const input_file = doc.input_file; const extension = input_file.split('.').pop(); let XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; let oReq = new XMLHttpRequest(
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})代码>
我不确定阅读外部链接的最简单方法。有什么想法吗?如果有帮助,我正在使用Meteor。XMLHttpRequest受限制,这意味着您只能直接从自己的域访问内容
但是,您可以在服务器上创建一个服务,该服务将为您加载工作表并将其传递回客户端
这是一个直接的教程
但是请注意,加载第三方文件的一般方法可能是一个严重的安全问题。
因此,如果你的页面的URL是不变的,你可以考虑只通过PHP脚本加载这个特定的链接,而不允许任何其他URL。这是一个经过考验的真实答案。
您的代码有两个问题:
对于二进制文件,它应该是let arraybuffer=oReq.response
,而不是让arraybuffer=oReq.responseText代码>
您应该在AmazonS3实例上启用跨源资源共享。只需遵循
这是一个工作代码笔:
你在用nodeJS吗?
注意:上面的代码只使用了web浏览器的(chrome)XMLHttpRequest,我注意到您正在使用
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest
你用的是nodejs吗?(对不起,我不熟悉流星)
更具体地说,您使用的是driverdan/node-XMLHttpRequest
我用它和你的代码进行了实验,结果显示了完全相同的错误信息。我认为这是因为这个XMLHttpRequest
与oReq.response
和oReq.responseText
如果您使用的是nodeJS,我建议使用另一个库:ykzts/node-xmlhttprequest
安装它与
npm i w3c-xmlhttprequest
使用更改XMLHttpRequest
let XMLHttpRequest = require('w3c-xmlhttprequest').XMLHttpRequest;
它立刻解决了问题 更好的办法可能是使用Meteor's获取文件。这些文件是
使用添加包
meteor add http
然后使用:
let result = HTTP.get(input_file,function (error,result){
//process result here
});
data将包含您的Excel文件,您可以使用SheetJS轻松解析该文件
但是,请确保您已在Amazon S3上允许跨源,否则您将收到以下格式的错误:
“请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许对源“blah blah”进行访问。”我最后使用了以下几个答案的组合。我想把它贴在这里,以防对其他人有所帮助
我开始使用Achal提到的Meteor HTTP包
meteor add http
我还从Meteor社区添加了一个额外的包,允许添加响应类型
meteor add aldeed:http
然后,我使用以下代码将其转换为二进制,并可以继续阅读工作表:
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);
});
该错误意味着bstr
为NaN,因此可能没有收到任何内容。如果返回了某些内容,请使用console.log(oReq.responseText)
进行检查。另外,对arraybuffer类型使用oReq.response
而不是oReq.responseText
。当我尝试此操作时,result.data只返回null try console.log(result)。它可能位于result.content中,具体取决于S3的响应。当我尝试这个方法时,效果非常好。