如何使用Ember.js实现XLSX文件上传并转换为JSON格式
Node.js实现XLSX上传转JSON/CSV的完整方案
嘿,我看到你正在用Node.js做XLSX文件上传并转JSON/CSV的功能,先给你指出代码里的一个小坑:readXlsxFile返回的本身就是一个二维数组(第一行是表头,后面是数据行),不需要再用JSON.parse()去解析——这一步反而会报错,因为data不是JSON字符串哦。
下面给你整理了从文件上传到格式转换的完整可行方案:
1. 修正read-excel-file的JSON转换逻辑
先把你的代码改对,正确生成JSON格式的数据:
const readXlsxFile = require('read-excel-file/node'); // 这里的file可以是文件路径,也可以是上传得到的Buffer readXlsxFile(file).then((data) => { // data结构示例:[["姓名", "年龄"], ["张三", 25], ["李四", 30]] const headers = data[0]; // 提取表头 const jsonData = data.slice(1).map(row => { // 把每行数据和表头对应,生成JSON对象 return headers.reduce((obj, header, index) => { obj[header] = row[index]; return obj; }, {}); }); // 现在jsonData就是标准的JSON对象数组,直接用于后端业务逻辑即可 console.log(jsonData); // 这里写你的后续处理代码 });
2. 转换为CSV格式
如果需要转成CSV,推荐用csv-writer工具包来快速生成,结合read-excel-file的结果:
const readXlsxFile = require('read-excel-file/node'); const createCsvWriter = require('csv-writer').createObjectCsvWriter; readXlsxFile(file).then((data) => { const headers = data[0]; const jsonData = data.slice(1).map(row => { return headers.reduce((obj, header, index) => { obj[header] = row[index]; return obj; }, {}); }); // 配置CSV写入器,指定输出路径和表头 const csvWriter = createCsvWriter({ path: './output.csv', header: headers.map(header => ({id: header, title: header})) }); // 写入CSV文件 csvWriter.writeRecords(jsonData) .then(() => console.log('CSV文件已成功生成')); });
3. 结合Express处理用户上传(完整示例)
如果是在Express框架里接收用户上传的XLSX文件,用multer来处理上传最方便:
const express = require('express'); const multer = require('multer'); const readXlsxFile = require('read-excel-file/node'); const app = express(); // 配置multer,把上传的文件存在内存中(也可以配置存到磁盘) const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); // 上传接口,接收名为xlsxFile的文件 app.post('/upload-xlsx', upload.single('xlsxFile'), (req, res) => { if (!req.file) { return res.status(400).send('请选择要上传的XLSX文件'); } // 从上传的Buffer中读取并解析XLSX readXlsxFile(req.file.buffer).then((data) => { const headers = data[0]; const jsonData = data.slice(1).map(row => { return headers.reduce((obj, header, index) => { obj[header] = row[index]; return obj; }, {}); }); // 返回转换后的JSON数据,或者做其他业务处理(比如存数据库) res.json({ success: true, data: jsonData }); }).catch(err => { res.status(500).send('文件解析失败:' + err.message); }); }); app.listen(3000, () => console.log('服务器在3000端口运行,等待上传请求'));
几个关键提醒
- 千万不要对
readXlsxFile返回的data用JSON.parse(),它已经是现成的JS数组了! - 如果你的XLSX有多个工作表,可以用
readXlsxFile(file, { getSheets: true })先获取所有工作表,再指定要读取的工作表:readXlsxFile(file, { sheet: 1 })(索引从0开始)。 - 处理超大XLSX文件时,建议用流式读取,避免内存占用过高,read-excel-file支持流式处理,你可以参考它的文档细节。
内容的提问来源于stack exchange,提问作者FluffyInsomnia
相关产品推荐
相关产品推荐

