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

Node.js中如何读取InputStreamResource?转换为XLSX/JSON求助

解决方案:将InputStreamResource响应转换为XLSX或JSON

从你的代码来看,你是用Node.js的https.request调用API,返回的流对应Java端的InputStreamResource。下面分两种场景给出具体实现:

一、转换为XLSX文件

根据API返回的内容类型,分两种处理方式:

1. API返回Excel二进制流(直接保存)

如果接口本身返回的就是XLSX格式的二进制流,直接将响应流写入文件即可:

const https = require('https');
const fs = require('fs');

const options = { 
  host: 'xxxxxxxxxxxxxxxxx', 
  port: xxxxx, 
  path: '/eeeeee/axxxxxxx?code=' + req.query.code, 
  method: 'GET', 
  headers:{ 
    'user_id': req.headers.user_id, 
    'access_token': req.headers.access_token 
  } 
};

https.request(options, function (res) {
  // 校验响应类型是否为Excel
  if (res.headers['content-type']?.includes('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) {
    const fileStream = fs.createWriteStream('output.xlsx');
    res.pipe(fileStream);
    
    fileStream.on('finish', () => {
      console.log('XLSX文件已成功保存');
    });
    fileStream.on('error', (err) => {
      console.error('保存文件失败:', err);
    });
  } else {
    console.error('响应不是Excel格式,请检查接口返回');
  }
}).on('error', (err) => {
  console.error('请求API失败:', err);
});

2. API返回JSON流(转换为XLSX)

如果接口返回的是JSON数据,需要先解析再用xlsx库生成Excel:
首先安装依赖:

npm install xlsx

然后实现转换逻辑:

const https = require('https');
const fs = require('fs');
const XLSX = require('xlsx');

const options = { 
  host: 'xxxxxxxxxxxxxxxxx', 
  port: xxxxx, 
  path: '/eeeeee/axxxxxxx?code=' + req.query.code, 
  method: 'GET', 
  headers:{ 
    'user_id': req.headers.user_id, 
    'access_token': req.headers.access_token 
  } 
};

https.request(options, function (res) {
  let rawData = '';
  res.on('data', (chunk) => { rawData += chunk; });
  res.on('end', () => {
    try {
      const jsonData = JSON.parse(rawData);
      // 将JSON转为工作表
      const worksheet = XLSX.utils.json_to_sheet(jsonData);
      // 创建工作簿并添加工作表
      const workbook = XLSX.utils.book_new();
      XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
      // 保存为XLSX文件
      XLSX.writeFile(workbook, 'output.xlsx');
      console.log('JSON转XLSX成功');
    } catch (err) {
      console.error('解析JSON或转换Excel失败:', err);
    }
  });
}).on('error', (err) => {
  console.error('请求API失败:', err);
});

二、转换为JSON格式

同样分两种场景处理:

1. API返回Excel二进制流(转换为JSON)

用xlsx库解析Excel流并转JSON:

const https = require('https');
const fs = require('fs');
const XLSX = require('xlsx');

const options = { 
  host: 'xxxxxxxxxxxxxxxxx', 
  port: xxxxx, 
  path: '/eeeeee/axxxxxxx?code=' + req.query.code, 
  method: 'GET', 
  headers:{ 
    'user_id': req.headers.user_id, 
    'access_token': req.headers.access_token 
  } 
};

https.request(options, function (res) {
  const chunks = [];
  res.on('data', (chunk) => chunks.push(chunk));
  res.on('end', () => {
    try {
      const buffer = Buffer.concat(chunks);
      // 解析Excel文件
      const workbook = XLSX.read(buffer, { type: 'buffer' });
      // 获取第一个工作表的数据
      const worksheetName = workbook.SheetNames[0];
      const worksheet = workbook.Sheets[worksheetName];
      // 转换为JSON
      const jsonData = XLSX.utils.sheet_to_json(worksheet);
      console.log('Excel转JSON结果:', jsonData);
      // 可选:保存为JSON文件
      fs.writeFileSync('output.json', JSON.stringify(jsonData, null, 2));
    } catch (err) {
      console.error('解析Excel或转换JSON失败:', err);
    }
  });
}).on('error', (err) => {
  console.error('请求API失败:', err);
});

2. API返回JSON流(直接解析)

直接读取流并解析为JSON对象:

const https = require('https');
const fs = require('fs');
const { StringDecoder } = require('string_decoder');

const options = { 
  host: 'xxxxxxxxxxxxxxxxx', 
  port: xxxxx, 
  path: '/eeeeee/axxxxxxx?code=' + req.query.code, 
  method: 'GET', 
  headers:{ 
    'user_id': req.headers.user_id, 
    'access_token': req.headers.access_token 
  } 
};

https.request(options, function (res) {
  const decoder = new StringDecoder('utf8');
  let rawData = '';
  res.on('data', (chunk) => {
    rawData += decoder.write(chunk);
  });
  res.on('end', () => {
    rawData += decoder.end();
    try {
      const jsonData = JSON.parse(rawData);
      console.log('解析后的JSON数据:', jsonData);
      // 可选:保存为JSON文件
      fs.writeFileSync('output.json', JSON.stringify(jsonData, null, 2));
    } catch (err) {
      console.error('解析JSON失败:', err);
    }
  });
}).on('error', (err) => {
  console.error('请求API失败:', err);
});

小提示

  • 建议先校验响应的Content-Type头,能更精准地处理不同类型的返回
  • 如果处理大文件,优先用流的方式操作,避免内存溢出
  • xlsx库支持Node.js 12及以上版本,安装时注意版本兼容性

内容的提问来源于stack exchange,提问作者Rahul Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:56:22