Java 将excel列中的字符串数据提取到hashmap时出现问题

Java 将excel列中的字符串数据提取到hashmap时出现问题,java,excel,apache-poi,Java,Excel,Apache Poi,我正在尝试从excel中提取一些数据到Java中的Hashmap。为此,我使用ApachePOI库,版本为Java8。数据格式如下所示: Excel_Data.xlsx: Title | Label A | Label B | Label C Signal 1 | value A1 | value B1 | value C1 Signal 2 | value A2 | value B2 | value C2 Signal 3 | value A3

我正在尝试从excel中提取一些数据到Java中的Hashmap。为此,我使用ApachePOI库,版本为Java8。数据格式如下所示:

Excel_Data.xlsx: 

    Title    | Label A  | Label B  | Label C 

    Signal 1 | value A1 | value B1 | value C1
    Signal 2 | value A2 | value B2 | value C2
    Signal 3 | value A3 | value B3 | value C3
这里写的所有文本都是字符串格式,文件中没有数字类型

我想要的是:

我想以键和值对的形式将数据存储到Hashmap,因此我的输出应该是:

Expected Approach:

Key      ->    Value

Signal 1 -> [value A1, value B1, value C1 ...] 
Signal 2 -> [value A2, value B2, value C2 ...] 
Signal 3 -> [value A3, value B3, value C3 ...]
我之所以要实现这种方法,是因为我想按照信号的顺序将这些数据打印到另一个excel文件中

Expected_output.xlsx:

Signal 1 | value A1
         | value B1
         | value C1
Signal 2 | value A2
         | value B2
         | value C2
Signal 3 | value A3
         | value B3
         | value C3  
我尝试的是:

我试图在网上找到这个解决方案,但由于它的特殊性,我没有找到任何解决方案。我还尝试在hashmap中找到将键和值都作为字符串从excel中提取出来的解决方案,但也没有得到多少帮助

我提出了一种方法,决定将字符串的键和值存储到ArrayList,如下代码所示:

// this function loads data from excel file stored in filestream variable
public void storeData(){
    //this hashmap will be used to hold values of excel file in key:values format
    HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
    String key = null;
    ArrayList<String> value = null;

    try {
        // get workbook instance of xlsx file
        HSSFWorkbook workbook = new HSSFWorkbook(open_excel_data);

        //Get first sheet from the workbook
        HSSFSheet sheet = workbook.getSheetAt(0);

        //Iterate through each rows from first sheet
        Iterator<Row> rowIterator = sheet.iterator();

        while(rowIterator.hasNext()) {
            Row row = rowIterator.next();

            // for each row, iterate through each columns
            Iterator<Cell> cellIterator = row.cellIterator();

            while(cellIterator.hasNext()) 
            {
                Cell cell = cellIterator.next();

                key = cell.getStringCellValue();

                value.add(cell.getStringCellValue()); // I cannot think of what should be here to store labels in correct format to arraylist

                if(key != null && value != null)
                {
                    map.put(key, value);
                    key = null;
                    value = null;
                }
            }

        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
附言

这是一个巨大的文件,有很多信号和标签

它必须使用Java来完成,因为这个功能将是已经构建的软件工具的一部分

如果你有什么想法的话,你甚至可以建议我其他简单的方法来完成这项任务



在代码段中,您永远不会为“value”创建空的ArrayList。对于每一行,您需要创建一个空的ArrayList,否则无法添加值。此外,如果在行上迭代,然后在单元格上迭代,则只有每行的第一个单元格包含键。这样,键和值总是相同的。在第一个单元格条目中设置键后,不能覆盖该键。

在代码段中,决不能为“value”创建空的ArrayList。对于每一行,您需要创建一个空的ArrayList,否则无法添加值。此外,如果在行上迭代,然后在单元格上迭代,则只有每行的第一个单元格包含键。这样,键和值总是相同的。在第一个单元格条目中设置密钥后,您不能覆盖该密钥。

您首先将数组列表设置为null,并且每次在循环中都将其设置为null,并尝试调用add on null。这将导致NPE。这就是您面临的问题吗?此外,您没有跳过第一行,这在您构建的映射中似乎不是必需的。此外,您正在使用每个单元格的值设置键。@NaveedS嘿,我注意到了ArrayList。我把它设为空。但这不是唯一的问题。我仍然需要想出一个算法,它将尝试以上面提到的格式key->value添加数据。我正在尝试下面的答案中给出的解决方案。此外,必须保留第一行值,因为我还需要打印标题和标签以及其余的数据。首先,在循环中,每次都将数组列表设置为null,并尝试调用add on null。这将导致NPE。这就是您面临的问题吗?此外,您没有跳过第一行,这在您构建的映射中似乎不是必需的。此外,您正在使用每个单元格的值设置键。@NaveedS嘿,我注意到了ArrayList。我把它设为空。但这不是唯一的问题。我仍然需要想出一个算法,它将尝试以上面提到的格式key->value添加数据。我正在尝试下面的答案中给定的解决方案。此外,必须保留第一行值,因为我还需要打印标题和标签以及其他数据。我正在尝试您的解决方案。我认为这种方法应该有效,但首先我会快速尝试一下。很抱歉接受这个答案有点晚。我整个周末都不在电脑旁。我只需将columnIndex==1更改为columnIndex==0,因为列索引以0开头。其余的代码对我来说很好,因为它帮助我构建键和值结构,如上面问题的预期输出部分所示。我目前正在尝试您的解决方案。我认为这种方法应该有效,但首先我会快速尝试一下。很抱歉接受这个答案有点晚。我整个周末都不在电脑旁。我只需将columnIndex==1更改为columnIndex==0,因为列索引以0开头。其余的代码对我来说运行良好,因为它帮助我构建键和值结构,如上面的问题OK的预期输出部分所示。感谢您指出ArrayList。我现在就再试一次,好的。感谢您指出ArrayList。我现在就再试一次。谢谢你教我如何跳过第一排。如果需要,我将使用此解决方案。到现在为止,我必须保持第一排的原样。谢谢你教我如何跳过第一排。如果需要,我将使用此解决方案。到现在为止,我必须保持第一排的现状。
while(rowIterator.hasNext()) {

    Row row = rowIterator.next();

    // for each row, iterate through each columns
    Iterator<Cell> cellIterator = row.cellIterator(); 
    key = null;  
    value = new ArrayList<String>();     

    while(cellIterator.hasNext()) {

        Cell cell = cellIterator.next();
        int columnIndex = cell.getColumnIndex();

        if(columnIndex == 1) {
            key = cell.getStringCellValue();
        } else {
            value.add(cell.getStringCellValue());
        }
    }

    if(key != null && value != null) {
        map.put(key, value);
        key = null;
        value = null;
    }
}
// this function loads data from excel file stored in filestream variable
    public HashMap<String, ArrayList<String>> storeData(String fileName) {
        // this hashmap will be used to hold values of excel file in key:values
        // format
        HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
        String key = null;
        ArrayList<String> value = null;
        int keyIndex = 0;
        try {
            // get workbook instance of xlsx file
            FileInputStream file = new FileInputStream(new File(fileName));
            HSSFWorkbook workbook = new HSSFWorkbook(file);

            // Get first sheet from the workbook
            HSSFSheet sheet = workbook.getSheetAt(0);

            // Iterate through each rows from first sheet
            Iterator<Row> rowIterator = sheet.iterator();

            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                key = null;
                value = new ArrayList<String>();
                // for each row, iterate through each columns
                Iterator<Cell> cellIterator = row.cellIterator();

                // To skip first row
                if (row.getRowNum() == 0){
                    continue;
                }

                while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();
                    cell.setCellType(Cell.CELL_TYPE_STRING);
                    if(cell.getColumnIndex() == keyIndex){
                        key = cell.getStringCellValue();
                    } else {
                        value.add(cell.getStringCellValue());
                    }

                }

                if (key != null && value != null && value.size()>0) {
                    map.put(key, value);
                    key = null;
                    value = null;
                }

            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return map;
    }