如何从外部链接(Amazon S3)使用SheetJSparsingExcel文件

我想parsing一个我已经有了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当我尝试读取文件时Error: Unsupported file NaNlet workbook = XLSX.read(bstr, {type:"binary"});

我不确定最简单的方法来阅读外部链接。 有任何想法吗? 如果有帮助,我使用meteor。

这是一个可靠的答案。

你的代码有两个问题:

  1. 对于二进制文件,应该let arraybuffer = oReq.response;let arraybuffer = oReq.responseText;

  2. 您应该在您的Amazon S3实例上启用“跨源资源共享”。 只要按照这里的官方教程。

这是一个工作的codepen:

http://codepen.io/KevinWang15/pen/GZXJKj

你在使用nodeJS吗?

注意:上面的代码只是使用Web浏览器的(铬)XMLHttpRequest,我注意到你正在使用

 XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest 

你在用nodejs吗? (对不起,我不熟悉meteor)

更具体地说,你使用的是driverdan/node-XMLHttpRequest

我对它和你的代码进行了尝试,并导致了完全相同的错误信息。 我认为这是因为这个XMLHttpRequest仍然与oReq.responseoReq.responseText有兼容性问题

如果您使用nodeJS,我推荐另一个库: ykzts/node-xmlhttprequest

安装它

 npm i w3c-xmlhttprequest 

改变你的XMLHttpRequest

 let XMLHttpRequest = require('w3c-xmlhttprequest').XMLHttpRequest; 

并立即解决问题!

一个更好的主意可能是使用meteor的HTTP包来获取文件。 文档在这里

使用添加包

 meteor add http 

然后使用:

 let result = HTTP.get(input_file,function (error,result){ //process result here }); 

result.data将包含您可以使用SheetJS轻松parsing的Excel文件。

但是,请确保您允许在Amazon S3上使用Cross Origin,否则会收到以下表单的错误消息:

“No'Access-Control-Allow-Origin'标题出现在被请求的资源上,因此不允许'blah blah'访问。

XMLHttpRequest受同源策略限制,这意味着您只能直接从您自己的域中访问内容。

但是你可以在你的服务器上创build一个服务器来为你加载工作表并把它传回客户端。

这是一个简单的教程。

但请注意,加载第三方文件的一般方法可能是一个严重的安全问题。 所以,如果你的工作表的URL是恒定的,你可能只考虑通过PHP脚本加载这个特定的链接,而不允许任何其他的URL。

我最终使用了几个这些答案的组合。 我想在这里发布,以防万一它帮助其他人。

我开始使用Achal提到的Meteor HTTP包。

 meteor add http 

我还从meteor社区添加了一个额外的包,允许添加响应types。

 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); });