Node.js实现XML转XLSX并下载:JSON转XLSX代码异常求助
XML转XLSX转换器问题排查与修复
我需要开发一款转换器,实现接收XML文件并将其转换为XLSX文件后支持下载的功能。目前已完成XML转JSON的部分,但后续将JSON转换为XLSX的代码无法正常运行,不清楚问题出在哪里。
ControllerXML2Json.js
const { json } = require('body-parser') const fs = require('fs') const xml2js = require('xml2js') let jsonString async function xml2json() { try { const xml = fs.readFileSync('src/data/dataset.xml') const result = await xml2js.parseStringPromise(xml, { mergeAttrs: true }) jsonString = JSON.stringify(result, null, 4) fs.writeFileSync('./public/data/result.json', jsonString) } catch (error) { console.log(error) } } module.exports = { convert(req, res) { let xmlFile = req.files.fileXML xmlFile.mv('src/data/dataset.xml', async function (err) { if (err) { return res.status(500).send(err) } else { await xml2json() // 等待异步转换完成再跳转 } res.redirect('/json') // 把跳转移到回调内,确保转换完成 }) } }
原ControllerJson2Xlsx.js(问题版本)
const { json } = require("body-parser"); const fs = require("fs"); const xlsx = require("json-as-xlsx"); const path = require('path'); const fileName = "data.xlsx"; async function generateExcelFromJSON(){ try { let content = JSON.parse(fs.readFileSync("./data/result.json", "utf-8")); let newWS = xlsx.utils.book_new(); let newWB = xlsx.utils.json_to_sheet(content); xlsx.utils.book_append_sheet(newWB, newWS, "data"); await xlsx.writeFile("./public/data/data.xlsx", content); } catch (error) { console.log(error); } } module.exports = { download(req, res) { let jsonFile = req.files.fileJSON; jsonFile.mv('./data/data.xlsx', function (err) { if (err) { return res.status(500).send(err); } else { xlsx(); } }); res.redirect("/xlsx"); }, };
问题分析与修复方案
核心问题点:
- 依赖API混淆:安装的是
json-as-xlsx包,但代码里使用的是xlsx.utils这类SheetJS(xlsx包)的API,两个库用法完全不同,导致调用报错。 - 文件路径错误:JSON文件实际存在
./public/data/result.json,但读取时写的是./data/result.json,找不到文件。 - 函数调用错误:
download方法里调用xlsx()无效,应该调用定义好的generateExcelFromJSON()。 - 逻辑错误:
download方法的逻辑是接收上传的JSON文件并存为XLSX,和需求不符——需求是把已转换好的JSON转成XLSX,无需再上传JSON文件。 - 异步处理缺失:异步操作未等待完成就执行跳转,可能导致文件未生成就触发后续流程。
修复后的ControllerJson2Xlsx.js
const fs = require("fs"); // 改用SheetJS的xlsx包(API匹配代码逻辑),先执行npm install xlsx const xlsx = require("xlsx"); const path = require('path'); async function generateExcelFromJSON(){ try { // 修正文件路径,读取正确位置的JSON文件 let content = JSON.parse(fs.readFileSync("./public/data/result.json", "utf-8")); // 处理XML转JSON后的嵌套结构:xml2js转换结果通常是嵌套对象,需提取数组数据 // 假设XML根节点下的数组是dataList,根据实际XML结构调整 const sheetData = Array.isArray(content.root.dataList) ? content.root.dataList : [content.root.dataList]; // SheetJS正确用法:先创建工作簿,再创建工作表并添加到工作簿 let newWB = xlsx.utils.book_new(); let newWS = xlsx.utils.json_to_sheet(sheetData); xlsx.utils.book_append_sheet(newWB, newWS, "data"); xlsx.writeFile(newWB, "./public/data/data.xlsx"); console.log("XLSX文件生成成功"); } catch (error) { console.error("生成XLSX失败:", error); } } module.exports = { async download(req, res) { try { await generateExcelFromJSON(); // 等待XLSX生成完成 // 直接返回下载文件 res.download("./public/data/data.xlsx", "转换结果.xlsx", (err) => { if (err) { res.status(500).send("下载失败:" + err.message); } }); } catch (err) { res.status(500).send("生成XLSX失败:" + err.message); } }, };
额外注意事项:
- 执行
npm install xlsx替换json-as-xlsx,确保API匹配。 - 根据你的XML结构调整
sheetData的提取逻辑,xml2js转换后的JSON通常是嵌套结构(比如{ root: { item: [...] } }),需提取数组数据才能生成正确表格。 - 确保
./public/data目录存在,否则写入文件会报错,可在启动时检查并自动创建目录。
内容的提问来源于stack exchange,提问作者Ahlam Mohamed
相关产品推荐
相关产品推荐

