You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Node.js下载并解析网络爬虫获取的.xlsx格式文件

问题解答

问题1:无需保存到本地的实现方案

可以实现不落地到磁盘直接解析文件内容。node-xlsx的parse方法原生支持传入Buffer类型的文件数据,只需要把https请求返回的流拼接为完整Buffer,直接传入解析即可,完全省去磁盘IO步骤。
实现代码如下:

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

function download(url, callback) {
  https.get(url, function (res) {
    const chunks = [];
    // 收集所有响应数据块
    res.on('data', chunk => chunks.push(chunk));
    // 响应数据接收完成后直接解析
    res.on('end', () => {
      const fileBuffer = Buffer.concat(chunks);
      const parseResult = xlsx.parse(fileBuffer);
      callback(null, parseResult[0]);
    });
    res.on('error', err => {
      console.log("响应流读取错误", err);
      callback(err);
    });
  }).on("error", function (err) {
    console.log("下载请求错误", err);
    callback(err);
  });
}

module.exports.download = download;

问题2:必须生成本地文件的修复方案

你原有代码的核心问题是:res.pipe是异步流式操作,调用pipe后立刻执行xlsx.parse读取文件时,文件还没有完成写入,所以得到的是空文件。只需要把文件解析逻辑挪到文件流的finish事件回调中,等文件完全写入磁盘后再读取解析即可。
修复后代码如下:

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("文件流写入错误", err);
      callback(err);
    });

    // 等待文件完全写入完成后再执行解析
    fileStream.on("finish", function () {
      fileStream.close();
      const parseResult = xlsx.parse('result.xlsx');
      callback(null, parseResult[0], filename);
    });
  });

  req.on("error", function (err) {
    console.log("下载请求错误", err);
    callback(err);
  });
}

module.exports.download = download;

内容的提问来源于stack exchange,提问作者Gianlucca Claudino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:15:05