Excel存储在List <map <string,string >>中

时间:2019-01-11 19:05:02

标签: excel hashmap apache-poi

我正在尝试阅读Excel工作表并将其保存在Java数据结构列表>列表中 基本上我在Excel工作表中有一张桌子

|Name|FirstName|emp_ID|Age|
|aaaa|bbbbbbbbb|111111|40 |
|cccc|fffffffff|222222|25 |

密钥将在哪里

|Name|FirstName|emp_ID|Age|

我的地图列表应如下所示

{Name=aaaa, FirstName=bbbbbbbbb, emp_ID=111111, Age=40}
{Name=cccc, FirstName=fffffffff, emp_ID=222222, Age=25}

但是我的列表存储了第二张地图两次

{Name=cccc, FirstName=fffffffff, emp_ID=222222, Age=25}
{Name=cccc, FirstName=fffffffff, emp_ID=222222, Age=25}

请问如何解决此问题的任何想法或任何更好的建议
预先谢谢你

这是我写的代码

        workbook = WorkbookFactory.create(inStream);
    workSheet = workbook.getSheetAt(0);

    DataFormatter df = new DataFormatter();
    Map<String, String> myMap = new LinkedHashMap<>();
    List<Map<String, String>> list = new ArrayList<>();
    row = workSheet.getRow(0);

    ArrayList<String> headersName = new ArrayList<String>();

    for (int j = 0; j <= row.getPhysicalNumberOfCells(); j++) {
        row.getCell(j);
        if ((df.formatCellValue(row.getCell(j)).isEmpty())) {
            continue;
        } else {
            headersName.add(df.formatCellValue(row.getCell(j)));
        }
    }

    System.out.println(headersName);
    OUTER: for (Row myrow : workSheet) {
        for (int i = 0; i < myrow.getLastCellNum(); i++) {
            if (myrow.getRowNum() == 0) {
                continue OUTER;
            }   
            String value = df.formatCellValue(myrow.getCell(i));
            myMap.put(headersName.get(i), value);
        }
        list.add(myMap);
    }

    System.out.println(list.size());
    for (Map<String, String> map : list) {
        System.out.println(map);
    }

我的列表的打印 {Name = cccc,FirstName = fffffffff,emp_ID = 222222,Age = 25} {Name = cccc,FirstName = fffffffff,emp_ID = 222222,Age = 25}

1 个答案:

答案 0 :(得分:0)

问题出在myMap.put(headersName.get(i), value)。在该行中,如果键已存在于地图中,则它将覆盖它。但是后来,list.add(myMap)传递了对同一地图的引用,而不是其新版本。因此,在第二次迭代中,当该行覆盖该值时,它会在列表中已存在的第一张地图上覆盖它。请参见下面的同一问题的基本示例。

import java.util.*;

public class Example {
     public static void main(String []args) {
        Map<String, String> myMap = new LinkedHashMap<>();
        List<Map<String, String>> list = new ArrayList<>();
        myMap.put("abc", "123");
        list.add(myMap);
        System.out.println(list.get(0));
        myMap.put("abc", "234");
        System.out.println(myMap);
        System.out.println(list.get(0));
     }
}

要解决此问题,请查看deep copies,以便仅更改一项不会全部更改。