Java 将excel列中的字符串数据提取到hashmap时出现问题
我正在尝试从excel中提取一些数据到Java中的Hashmap。为此,我使用ApachePOI库,版本为Java8。数据格式如下所示: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_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;
}