Node.js Express中XML转JSON后转Xlsx功能失效求助
Node.js Express JSON 转 Xlsx 功能故障排查与修复
你的JSON转Xlsx功能无法运行,核心问题集中在包引用错误、函数调用不匹配、异步逻辑混乱、API参数顺序错误以及路由方法不兼容这几点,下面逐一拆解并给出修复方案:
核心问题梳理
- 包引用与对象不匹配:引入
json2xlsx包,但代码全程使用xlsx对象,二者完全不兼容,实际应使用SheetJS的xlsx包。 - 函数调用名称错误:定义的生成Excel函数是
generateExcelFromJSON,但回调里调用的是json2xlsx(),函数根本未执行。 - 异步逻辑与跳转时机错误:异步函数未用
await等待执行完成,且res.redirect写在文件移动回调外,导致逻辑未完成就跳转。 - Xlsx API 参数顺序错误:
xlsx.utils.book_append_sheet的参数顺序应为(工作簿, 工作表, 表名),你写反了工作簿和工作表的顺序。 - 路由方法不匹配:文件上传需用
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
相关产品推荐
相关产品推荐

