如何从外部链接(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 NaN
: let workbook = XLSX.read(bstr, {type:"binary"});
我不确定最简单的方法来阅读外部链接。 有任何想法吗? 如果有帮助,我使用meteor。
这是一个可靠的答案。
你的代码有两个问题:
-
对于二进制文件,应该
let arraybuffer = oReq.response;
,let arraybuffer = oReq.responseText;
-
您应该在您的Amazon S3实例上启用“跨源资源共享”。 只要按照这里的官方教程。
这是一个工作的codepen:
http://codepen.io/KevinWang15/pen/GZXJKj
你在使用nodeJS吗?
注意:上面的代码只是使用Web浏览器的(铬)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包来获取文件。 文档在这里
使用添加包
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); });