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; }
关键修改点
- 返回类型调整:将
Future<List<Map<String, dynamic>>>改为Future<Map<String, Map<String, dynamic>>>,匹配目标JSON的对象结构; - 存储结构替换:把列表类型的
jsonData改为Map类型,用于存储序号键与学生对象的映射; - 序号键生成:遍历数据行时使用
index + 1生成从1开始的序号,转为字符串后作为Map的键; - 保留字段映射逻辑:原有的表头与单元格值的映射逻辑保持不变,确保学生对象的字段完整。
内容的提问来源于stack exchange,提问作者Omri Developer
相关产品推荐
相关产品推荐

