如何使用 nodejs 下载 .xlsx 文件

How to download an .xlsx file using nodejs

我正在尝试通过网络抓取从网站下载 .xlsx 文件,我已经完成了整个过程,直到我访问网站为下载生成的临时 url。

当我在浏览器中打开文件 url 时,下载自动开始(如图所示)。 excel file download

问题是我需要解析这个文件以便稍后发送到我的前端。当我尝试使用 fs.createWriteStream('result.xlsx') 创建文件并稍后用 res.pipe(fileStream) 填充它时;生成的文件总是空的。

这是我的完整代码:

const https = require("https");
const fs = require("fs");
const path = require("path");
const xlsx = require("node-xlsx");

function download(url, callback) {
  const filename = path.basename(url);

  const req = https.get(url, function (res) {
    const fileStream = fs.createWriteStream("result.xlsx");

    res.pipe(fileStream);

    const obj = xlsx.parse('result.xlsx');
    callback(obj[0]);

    fileStream.on("error", function (err) {
      console.log("Error writting to the stream.");
      console.log(err);
    });

    fileStream.on("close", function () {
      callback(filename);
    });

    fileStream.on("finish", function () {
      fileStream.close();
    });
  });

  req.on("error", function (err) {
    console.log("error downloading the file");
    console.log(err);
  });
}

module.exports.download = download;

我的问题是:

  1. 是否可以在不需要保存到物理文件的情况下将此数据解析为数组?如果是,如何?
  2. 如果我无法在不需要填充物理文件的情况下解析数据,我该如何下载电子表格,然后再读取和解析数据。

注意:我已经使用手动输入的有效文件测试了其余的下载功能,一切正常。唯一不起作用的是电子表格的数据下载和读取部分。

  1. 是否可以在不需要保存到物理文件的情况下将这些数据解析为数组?基本上没有(来自远程服务器的文件)。除了服务器允许你直播。

  2. 你的代码几乎是正确的,只是顺序错了。写完一定要回调,解决空文件问题

    方法如下:

const https = require("https");
const fs = require("fs");
const path = require("path");
const xlsx = require("node-xlsx");

function download(url, callback) {
  const filename = path.basename(url);

  const req = https.get(url, function (res) {
    const fileStream = fs.createWriteStream("result.xlsx");

    res.pipe(fileStream);
    
    fileStream.on("error", function (err) {
      console.log("Error writting to the stream.");
      console.log(err);
    });

    fileStream.on("close", function () {
       const obj = xlsx.parse('result.xlsx');// or whatever you named it
       callback(obj[0]);      
    });

    fileStream.on("finish", function () {
      fileStream.close();
    });
  });

  req.on("error", function (err) {
    console.log("error downloading the file");
    console.log(err);
  });
}

module.exports.download = download;