我是编程新手。我有一个程序迭代excel文件并将值放入hashmap HashMapbut对象在哈希映射中总是有最后一条记录。我会发布我的代码,也许你可以告诉我我的错误,或者更好地发布代码应该如何完成。请帮忙,真的卡在这里。
我的Excel文件:
doc seq acc status notes
1111 2 account test value1
22222 3 account test2 value2
我的对象......
public class Account{
int docNumber;
int docSequence;
String docAccCode;
String docStatus;
String docNotes;
//getters and setters bellow
......
}
我的迭代方法......
public void readFile() throws IOException{
InputStream ExcelFileToRead = new FileInputStream(inputFile);
XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead);
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row = null;
XSSFCell cell = null;
int recordNumber = 0;
Iterator rows = sheet.rowIterator();
while (rows.hasNext()){
row=(XSSFRow) rows.next();
int rowNum = row.getRowNum();
int cellNum = 0;
if(rowNum != 0){
Iterator cells = row.cellIterator();
while (cells.hasNext()){
cell=(XSSFCell) cells.next();
switch(cellNum){
case 0:
docMap.setDocNumber((int)cell.getNumericCellValue());
break;
case 1:
docMap.setDocSequence((int)cell.getNumericCellValue());
break;
case 2:
docMap.setDocAccCode(cell.getStringCellValue());
break;
case 3:
docMap.getDocStatus(cell.getStringCellValue());
break;
case 4:
docMap.getDocNotes(cell.getStringCellValue());
}
cellNum ++;
}
// docMap overwrites it's self and has last record only.
records.put(recordNumber, docMap);
recordNumber ++;
}
}
}
答案 0 :(得分:1)
您似乎正在使用docMap对象的单个实例。您需要在while循环中使用新的docMap。
答案 1 :(得分:1)
关于代码的几点注意事项 -
当你说
时records.put(recordNumber, docMap);
您只需将帐户对象的引用放在地图中即可。因为在所有迭代中,您放置相同的引用,Map中的所有值都将指向同一个Account对象。是的,当您使用setter方法时,将覆盖所有值,但之前的值将丢失。因此,在所有迭代结束时,您将拥有仅包含最后一条记录的所有地图值。因此,正如其他人在上面建议的那样,每次迭代一行时都需要创建一个单独的Account对象。
Account docMap = new Account();
从您的代码中我看到您正在尝试将Excel工作表中的详细信息保存到您的帐户对象中,然后将带有记录编号的帐户对象存储到Map中。在案例3和4中,为什么使用了getter方法而不是二传手。将getter方法更改为setter方法,例如case 0,1,2。
switch(cellNum){
case 0:
docMap.setDocNumber((int)cell.getNumericCellValue());
break;
case 1:
docMap.setDocSequence((int)cell.getNumericCellValue());
break;
case 2:
docMap.setDocAccCode(cell.getStringCellValue());
break;
case 3:
docMap.setDocStatus(cell.getStringCellValue());
break;
case 4:
docMap.setDocNotes(cell.getStringCellValue());
}
我没有在任何地方看到您的记录地图。因此,您需要使用适当的泛型来定义一个。
Map<Integer,Account> records = new HashMap<Integer, Account>();
此外,您的recordNumber会为您提供记录顺序。所以你需要在每次迭代中将它递增到行。
recordNumber ++;
答案 2 :(得分:0)
在获取行的位置创建docMap的新实例。
假设docMap是一个帐户对象,应该是这样的:
while (rows.hasNext()){
row=(XSSFRow) rows.next();
Account docMap = new Account();
int rowNum = row.getRowNum();
...
records.put(recordNumber, docMap);
recordNumber ++;
}
否则,您只是将每个相同的Account对象放入地图,同时将其更新到excel文件的最后一行。