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

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");
  },
};

问题分析与修复方案

核心问题点:

  1. 依赖API混淆:安装的是json-as-xlsx包,但代码里使用的是xlsx.utils这类SheetJS(xlsx包)的API,两个库用法完全不同,导致调用报错。
  2. 文件路径错误:JSON文件实际存在./public/data/result.json,但读取时写的是./data/result.json,找不到文件。
  3. 函数调用错误:download方法里调用xlsx()无效,应该调用定义好的generateExcelFromJSON()。
  4. 逻辑错误:download方法的逻辑是接收上传的JSON文件并存为XLSX,和需求不符——需求是把已转换好的JSON转成XLSX,无需再上传JSON文件。
  5. 异步处理缺失:异步操作未等待完成就执行跳转,可能导致文件未生成就触发后续流程。

修复后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:45:37