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

读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:25:30