如何使用SheetJS从外部链接解析Excel文件(AmazonS3)
How can I parse an Excel file using SheetJS from an external link (Amazon S3)
我正在尝试解析一个已经有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
我不确定阅读外部链接的最简单方法。有什么想法吗?如果有帮助的话,我正在使用流星。
这是一个久经考验的答案
您的代码有两个问题:
-
对于二进制文件,它应该是
let arraybuffer = oReq.response;
,而不是let arraybuffer = oReq.responseText;
-
您应该在您的AmazonS3实例上启用跨来源资源共享。只需按照这里的官方教程操作即可。
这是一个工作代码笔:
http://codepen.io/KevinWang15/pen/GZXJKj
你在使用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的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);
});
- 将HTML表格导出到excel时,无法将数据加载到excel文件中
- 将JQuery Handontable保存到服务器上的excel文件中
- 生成的excel文件url
- CSV、PDF、Excel文件在dataTables的导出扩展中作为blob下载
- 使用JavaScript调用Excel文件
- 将JSON数据格式化为excel文件
- 将Excel/CSV文件中的数据导入angularjs-json对象中
- 如何使用 javascript 创建和编辑 excel 文件
- Javascript JSON 到 Excel 文件下载
- 使用node.js读取Excel文件
- 通过javascript用java处理excel文件
- 从javascript打开excel文件并传递参数
- 将HTML表导出到Excel,而不是使用C#下载文件
- Apache poi XSSF创建Excel文件-Create返回格式或文件扩展名无效的空文件
- 如何使用SheetJS从外部链接解析Excel文件(AmazonS3)
- 如何使用html中的javascript代码解析Excel文件
- 导出时如何重命名excel文件
- 如何在java web应用程序中捕获关闭打开的excel文件的事件
- 创建/下载一个带有chrome扩展名的excel文件
- 我想将任何xml文件导出到excel文件(xls或制表符分隔)