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

Flutter中如何将Excel解析为带指定键结构的JSON?

问题

需要将Excel文件解析为特定结构的JSON:以序号(如"1""2")为键,对应值为包含"Student Name"、"Phone Number"、"Status"的学生对象。现有Flutter函数仅能生成列表形式的JSON,缺少所需的键结构,如何修改实现该目标?

期望的JSON结构

{
   "1": {
        "Student Name": "Student Name",
        "Phone Number": "00000000",
        "Status": "OK"
    },
    "2": {
        "Student Name": "Student Name",
        "Phone Number": "000000000",
        "Status": "OK"
    }
}

现有解析函数

Future<List<Map<String, dynamic>>> parseExcelToJSON(String filePath) async {
  
  var bytes = await File(filePath).readAsBytes();
  var excel = Excel.decodeBytes(bytes);

  // Assuming the first sheet is the one you want to parse
  var sheet = excel.tables[excel.tables.keys.first]; // Before user choose sheet

  var rows = sheet!.rows; // Before user choose sheet
  // var rows = sheet.rows;  // user choose sheet
  var headerRow = rows.first;
  var dataRows = rows.sublist(1); // Exclude the header row

  var jsonData = <Map<String, dynamic>>[];

  for (var row in dataRows) {
    var rowData = <String, dynamic>{};
    for (var i = 0; i < row.length; i++) {
      var header = headerRow[i]!.value.toString();
      
      var value = row[i]?.value.toString() ?? '';

      rowData[header] = value;
    }
    jsonData.add(rowData);
  }

  return jsonData;
}

目标JSON说明

  • JSON为对象结构,每个键是学生ID(如"1""2"),对应值为学生信息对象;
  • 学生对象包含"Student Name"、"Phone Number"、"Status"三个键值对。

修改后的实现

调整返回类型和存储结构,将列表改为以序号为键的Map即可,具体代码如下:

Future<Map<String, Map<String, dynamic>>> parseExcelToJSON(String filePath) async {
  
  var bytes = await File(filePath).readAsBytes();
  var excel = Excel.decodeBytes(bytes);

  // Assuming the first sheet is the one you want to parse
  var sheet = excel.tables[excel.tables.keys.first]; // Before user choose sheet

  var rows = sheet!.rows; // Before user choose sheet
  // var rows = sheet.rows;  // user choose sheet
  var headerRow = rows.first;
  var dataRows = rows.sublist(1); // Exclude the header row

  // 替换列表为以序号为键的Map结构
  var jsonData = <String, Map<String, dynamic>>{};

  for (var index = 0; index < dataRows.length; index++) {
    var row = dataRows[index];
    var rowData = <String, dynamic>{};
    for (var i = 0; i < row.length; i++) {
      var header = headerRow[i]!.value.toString();
      
      var value = row[i]?.value.toString() ?? '';

      rowData[header] = value;
    }
    // 生成从1开始的序号作为键
    jsonData[(index + 1).toString()] = rowData;
  }

  return jsonData;
}

关键修改点

  1. 返回类型调整:将Future<List<Map<String, dynamic>>>改为Future<Map<String, Map<String, dynamic>>>,匹配目标JSON的对象结构;
  2. 存储结构替换:把列表类型的jsonData改为Map类型,用于存储序号键与学生对象的映射;
  3. 序号键生成:遍历数据行时使用index + 1生成从1开始的序号,转为字符串后作为Map的键;
  4. 保留字段映射逻辑:原有的表头与单元格值的映射逻辑保持不变,确保学生对象的字段完整。

内容的提问来源于stack exchange,提问作者Omri Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:22:44