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

How can I parse an Excel file using SheetJS from an external link (Amazon S3)

本文关键字:文件 Excel AmazonS3 何使用 SheetJS 从外部 链接      更新时间:2024-05-18

我正在尝试解析一个已经有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();

当我尝试读取位于:let workbook = XLSX.read(bstr, {type:"binary"}); 的文件时,我得到的当前错误是:Error: Unsupported file NaN

我不确定阅读外部链接的最简单方法。有什么想法吗?如果有帮助的话,我正在使用流星。

这是一个久经考验的答案

您的代码有两个问题:

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

  2. 您应该在您的AmazonS3实例上启用跨来源资源共享。只需按照这里的官方教程操作即可。

这是一个工作代码笔:

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

你在使用nodeJS吗

注意:上面的代码只是使用了web浏览器的(chrome)XMLHttpRequest,我注意到您使用的是

XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest

你在使用类似nodejs的东西吗?(对不起,我不熟悉流星)

更具体地说,您正在使用driverdan/node-XMLHttpRequest吗?

我对它和你的代码进行了实验,结果得到了完全相同的错误消息。我认为这是因为XMLHttpRequestoReq.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将包含您的Excel文件,您可以使用SheetJS轻松解析该文件。

然而,请确保您已允许亚马逊S3上的Cross Origin,否则您将收到一个表单错误:

"请求的资源上不存在‘Access Control Allow Origin’标头。因此不允许访问Origin‘blah-blah’。"

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

但是,您可以在服务器上创建一个服务,该服务将为您加载工作表并将其传递回客户端。

这是一个直截了当的教程。

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

我最终使用了其中几个答案的组合。我想把它贴在这里,以防它对其他人有帮助。

我开始使用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);
});