0

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

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

问题是我需要解析这个文件以便稍后发送到我的前端。当我尝试使用 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. 如果我无法在不需要填充物理文件的情况下解析数据,我该如何下载电子表格,然后稍后读取和解析数据。

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

4

1 回答 1

0
  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;

于 2021-11-10T02:15:35.530 回答