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

如何将嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:57:38