-2

我是编程新手。我有一个程序可以迭代 excel 文件并将值放入哈希映射中 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 ++;
        }
    }
}
4

3 回答 3

1

关于您的代码的几点注意事项 -

  1. 当你说

    records.put(recordNumber, docMap);
    

    您只需将 Account Object 的引用放在地图中。由于在所有迭代中,您都放置了相同的引用,因此 Map 中的所有值都将指向相同的 Account 对象。是的,当您使用 setter 方法时,所有值都将被覆盖,但以前的值将丢失。因此,在所有迭代结束时,您将拥有仅包含最后一条记录的所有地图值。因此,正如其他人在上面建议的那样,每次迭代一行时,您都需要创建一个单独的 Account 对象。

    Account docMap = new Account();
    
  2. 从您的代码中,我看到您正在尝试将 excel 表中的详细信息保存到您的 Account 对象中,然后将带有记录号的帐户对象存储到 Map.In case 3 和 4 为什么您使用 getter 方法而不是 setter。将 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());
          }
    
  3. 我没有看到您在任何地方定义的记录地图。所以你需要用适当的泛型定义一个。

    Map<Integer,Account> records = new HashMap<Integer, Account>();
    
  4. 您的 recordNumber 也为您提供记录顺序。所以你需要在每次迭代中增加它。

    recordNumber ++;
    
于 2013-05-19T05:15:01.927 回答
1

看来您正在使用 docMap 对象的单个实例。您需要在 while 循环中添加新的 docMap。

于 2013-05-19T01:13:01.377 回答
0

在获取行的位置创建一个新的 docMap 实例。

假设 docMap 是一个 Account 对象,应该是这样的:

while (rows.hasNext()){
    row=(XSSFRow) rows.next();
    Account docMap = new Account();
    int rowNum = row.getRowNum();
    ...
    records.put(recordNumber, docMap);
    recordNumber ++;
}

否则,您每次都只是将相同的 Account 对象放入您的地图中,同时将其更新到 excel 文件的最后一行。

于 2013-05-19T01:24:31.490 回答