读取XLSX转List<Map>时列顺序错乱,如何保持原表列顺序?
问题
读取XLSX格式的Excel文件时,将每个工作表数据存储为List<Map<String, String>>(每个Map对应一行数据,列名为键、单元格值为值),但Map中的列顺序与原Excel从左到右的顺序不一致,需要保持原列顺序以便后续写入Excel。
示例Excel表:
column 1 column2 value1 value2 value3 value4
列顺序错乱的Map列表:
0 = "column2" -> value2 "column1" -> value1 1 = "column2" -> value4 "column1" -> value3
当前代码片段:
public static List<Map<String, String>> readExcelSheet(Sheet sheet) { Iterator<Row> rows = sheet.iterator(); if (!rows.hasNext()) { return Collections.emptyList(); } Row header = rows.next(); List<String> keys = new ArrayList<>(); for (Cell cell : header) { String value = cell.getStringCellValue(); if (!value.isEmpty()) { keys.add(value); } else { break; } } List<Map<String, String>> result = new ArrayList<>(); while (rows.hasNext()) { Row row = rows.next(); Map<String, String> rowMap = new HashMap<>(); for (int i = 0; i < keys.size(); ++i) { Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); String value; value = cell.toString(); rowMap.put(keys.get(i), value); } // Only add rows which aren't empty if (!rowMap.values().stream().allMatch(String::isEmpty)) { result.add(rowMap); } } return result; }
解决方案
方法1:用LinkedHashMap替代HashMap
HashMap是无序的,而LinkedHashMap会严格按照键值对的插入顺序保存,刚好匹配原Excel的列顺序。只需要修改一行代码:
// 替换HashMap为LinkedHashMap Map<String, String> rowMap = new LinkedHashMap<>();
修改后,每个Map中的键顺序会和你读取列名的顺序(原Excel从左到右)完全一致,后续遍历或写入时自然保持顺序。
方法2:保留列名列表,写入时按列表顺序处理
如果不想修改Map实现,可以在后续写入Excel时,直接使用读取阶段保存的keys列表(原列名顺序)来遍历取值,而非遍历Map的键。这样无论Map内部顺序如何,写入都会遵循原列顺序:
// 示例写入逻辑(keys为读取时保存的列名列表,result为读取到的数据列表) for (Map<String, String> rowMap : result) { Row newRow = sheet.createRow(...); // 创建新行 for (int i = 0; i < keys.size(); i++) { String colName = keys.get(i); String cellValue = rowMap.get(colName); // 将cellValue写入newRow的第i个单元格 Cell cell = newRow.createCell(i); cell.setCellValue(cellValue); } }
推荐方案
优先选择方法1,因为它让Map本身维护了列顺序,后续操作无需依赖外部列名列表,逻辑更简洁直观。
内容的提问来源于stack exchange,提问作者elads11
相关产品推荐
相关产品推荐

