如何将嵌套JSON展平并转换为CSV?多考试场景需求
多组嵌套JSON数据展平并通过ExcelJS导出为Excel/CSV方案
数据展平逻辑
针对多组考试数据(如dataExam1、dataExam2),先将每组数据中的marks嵌套数组展平为带考试标识的独立字段,再将同一学生的多组考试数据合并到同一行,确保最终导出的表格每一行对应一个学生的完整成绩记录。
代码实现
1. 展平单组考试数据
将单组考试的marks数组转换为带考试前缀的字段,避免多组数据字段冲突:
function flattenExamData(examData, examPrefix) { return examData.map(item => { const flattened = { ...item }; delete flattened.marks; // 移除原始嵌套结构 // 遍历科目成绩,生成带前缀的列字段 item.marks.forEach(mark => { flattened[`${examPrefix}_${mark.subject}_grade`] = mark.grade; flattened[`${examPrefix}_${mark.subject}_result`] = mark.result; }); return flattened; }); }
2. 合并多组展平后的数据
按学生唯一标识(示例用id)合并多组数据,确保同一学生的成绩在同一行:
function mergeFlattenedData(...flattenedDatasets) { const mergedMap = new Map(); flattenedDatasets.forEach(dataset => { dataset.forEach(item => { const key = item.id; // 可根据实际替换为学生姓名或其他唯一标识 mergedMap.set(key, { ...(mergedMap.get(key) || {}), ...item }); }); }); return Array.from(mergedMap.values()); }
3. ExcelJS导出逻辑
导出为Excel文件
const ExcelJS = require('exceljs'); async function exportToExcel(mergedData, outputPath) { const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('考试成绩汇总'); // 提取所有表头字段(自动去重) const headers = [...new Set(mergedData.flatMap(item => Object.keys(item)))]; // 添加表头并设置加粗样式 const headerRow = worksheet.addRow(headers); headerRow.font = { bold: true }; // 填充数据行 mergedData.forEach(item => { const rowValues = headers.map(header => item[header] || ''); worksheet.addRow(rowValues); }); await workbook.xlsx.writeFile(outputPath); console.log(`Excel文件已导出至: ${outputPath}`); }
导出为CSV文件
async function exportToCSV(mergedData, outputPath) { const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('考试成绩汇总'); const headers = [...new Set(mergedData.flatMap(item => Object.keys(item)))]; worksheet.addRow(headers); mergedData.forEach(item => { const rowValues = headers.map(header => item[header] || ''); worksheet.addRow(rowValues); }); await workbook.csv.writeFile(outputPath, { separator: ',' }); console.log(`CSV文件已导出至: ${outputPath}`); }
4. 完整调用示例
// 假设已有dataExam1、dataExam2两组原始数据 (async () => { // 展平两组考试数据 const flattenedExam1 = flattenExamData(dataExam1, '第一次考试'); const flattenedExam2 = flattenExamData(dataExam2, '第二次考试'); // 合并数据 const mergedData = mergeFlattenedData(flattenedExam1, flattenedExam2); // 导出Excel和CSV await exportToExcel(mergedData, './考试成绩汇总.xlsx'); await exportToCSV(mergedData, './考试成绩汇总.csv'); })();
注意事项
- 如果学生的唯一标识不是
id,请修改mergeFlattenedData中的key字段(如item.name) - 可根据需求调整列名格式,比如将
第一次考试_语文_grade改为第一次考试-语文等级 - 确保已安装ExcelJS依赖:执行
npm install exceljs
内容的提问来源于stack exchange,提问作者Raviraj
相关产品推荐
相关产品推荐

