Javascript 如何从外部链接(Amazon S3)使用SheetJS解析Excel文件

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(

我正在尝试解析一个excel文件,我已经有了它的URL。我在尝试访问该文件以使其可读时不断遇到不同的错误。现在,这是我的代码:

  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的响应。当我尝试这个方法时,效果非常好。