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

Node.js Express中XML转JSON后转Xlsx功能失效求助

Node.js Express JSON 转 Xlsx 功能故障排查与修复

你的JSON转Xlsx功能无法运行,核心问题集中在包引用错误、函数调用不匹配、异步逻辑混乱、API参数顺序错误以及路由方法不兼容这几点,下面逐一拆解并给出修复方案:

核心问题梳理

  1. 包引用与对象不匹配:引入json2xlsx包,但代码全程使用xlsx对象,二者完全不兼容,实际应使用SheetJS的xlsx包。
  2. 函数调用名称错误:定义的生成Excel函数是generateExcelFromJSON,但回调里调用的是json2xlsx(),函数根本未执行。
  3. 异步逻辑与跳转时机错误:异步函数未用await等待执行完成,且res.redirect写在文件移动回调外,导致逻辑未完成就跳转。
  4. Xlsx API 参数顺序错误:xlsx.utils.book_append_sheet的参数顺序应为(工作簿, 工作表, 表名),你写反了工作簿和工作表的顺序。
  5. 路由方法不匹配:文件上传需用POST请求,但你将/single定义为GET,req.files在GET请求中不存在。

修复后的完整代码

第一步:安装正确依赖

先卸载错误包,安装SheetJS的xlsx:

npm uninstall json2xlsx && npm install xlsx

ControllerJson2Xlsx.js

const fs = require("fs");
const xlsx = require("xlsx"); // 修正包引用
const path = require("path");

// 确保目标目录存在
const targetDir = "./public/data";
if (!fs.existsSync(targetDir)) fs.mkdirSync(targetDir, { recursive: true });

async function generateExcelFromJSON() {
  try {
    let rawData = fs.readFileSync(`${targetDir}/result.json`, {
      encoding: "utf8",
      flag: "r",
    });
    let data = JSON.parse(rawData);

    // 注意:xml2js转换的JSON多为嵌套结构,需提取数组数据
    // 示例:如果你的JSON根节点是dataset,子节点data是数组,需修改为:
    // data = data.dataset.data;
    
    let worksheet = xlsx.utils.json_to_sheet(data);
    let workbook = xlsx.utils.book_new();
    // 修正参数顺序:工作簿在前,工作表在后
    xlsx.utils.book_append_sheet(workbook, worksheet, "数据列表");

    // xlsx.writeFile是同步方法,无需await
    xlsx.writeFile(workbook, `${targetDir}/data.xlsx`);
    console.log("Excel文件生成成功");
  } catch (error) {
    console.error("生成Excel失败:", error);
    throw error; // 抛出错误让上层处理
  }
}

module.exports = {
  async download(req, res) {
    try {
      let jsonFile = req.files?.fileJSON;
      if (!jsonFile) {
        return res.status(400).send("请上传JSON文件");
      }

      // 用Promise封装mv方法,适配异步逻辑
      await new Promise((resolve, reject) => {
        jsonFile.mv(`${targetDir}/result.json`, (err) => {
          err ? reject(err) : resolve();
        });
      });

      await generateExcelFromJSON(); // 等待Excel生成完成
      res.redirect("/xlsx"); // 生成完成后再跳转
    } catch (error) {
      console.error("下载处理失败:", error);
      return res.status(500).send(error.message);
    }
  },
};

route.js(修正路由方法)

const express = require('express')
const ControllerJson2Xlsx = require('./controllers/ControllerJson2Xlsx')
const ControllerXML2Json = require('./controllers/ControllerXML2Json')

const route = express.Router()

route.get('/', (req, res) => res.render('index'))

route.get('/json', (req, res) => res.render('json'))
route.post('/convert', ControllerXML2Json.convert);

// 将GET改为POST,适配文件上传逻辑
route.post("/single", ControllerJson2Xlsx.download);

module.exports = route 

额外注意事项

  • 如果你的JSON是xml2js转换的嵌套结构,必须先提取出需要转换的数组数据,否则json_to_sheet无法生成正确的表格。
  • 确保前端表单的enctype设置为multipart/form-data,否则后端无法获取上传的文件。

内容的提问来源于stack exchange,提问作者Ahlam Mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:54:31