【问题标题】:Why is this for loop not iterating thru rows using Apache POI? Java为什么这个 for 循环不使用 Apache POI 遍历行?爪哇
【发布时间】:2015-11-25 21:36:00
【问题描述】:

我有一个 for 循环,里面有另一个循环,第一个循环设置行,第二个循环读取 4 个单元格,循环第一次运行时效果很好,但之后我猜测它不会改变行,因为它只是重复第一个循环的结果,但没有显示单元格值,这里是代码:

for(int k=1; k<=2; k++){
    XSSFRow row1 = worksheet.getRow(e);
    System.out.println("Row: "+e);
    e++;

    for(int i=0;i<Oleo18_1.size();i++){    
        XSSFCell c = row1.getCell((short) d); 
        if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
            Oleo18_1.set(i, false);
        } 
        else {
            Oleo18_1.set(i, true);
            c.setCellType(Cell.CELL_TYPE_STRING);
        }

        if(Oleo18_1.get(i) == true){
            values_18_1.set(i, 9.09090909);
        }

        String a1Val = c.getStringCellValue();
        System.out.println("valor ponderacion"+(d+1)+": "+values_18_1.get(i));
        System.out.println("valor celda "+(d+1)+": "+a1Val);

        d++;  

    }                        
}

【问题讨论】:

  • 您的预期输出是什么?此外,请遵守有关变量和类的 Java 命名约定。
  • @andrewdleach 该程序必须先读取 E6、F6、G6、H6、I6,然后再读取 E7、F7、G7、H7、I7

标签: java excel for-loop apache-poi


【解决方案1】:

因此,使用 Apache POI 迭代单元格的最简单方法是使用来自 Busy Developers Guide 的提示,该提示演示了在 for-each 循环中进行迭代,因为行可以像这样迭代:

遍历行和单元格

有时,您只想遍历工作表中的所有行,或一行中的所有 > 单元格。这可以通过一个简单的 for 循环来实现。

幸运的是,这很容易。 Row 定义了一个 CellIterator 内部类来处理单元格的迭代(通过调用 row.cellIterator() 获得一个),Sheet 提供了一个 rowIterator() 方法来为所有行提供一个迭代器。这些实现了 java.lang.Iterable 接口以允许 foreach 循环。

Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
  for (Cell cell : row) {
    // Do something here
  }
}

其中最重要的部分实际上是“抓取”正确的工作表,正如您在代码 sn-p 的第一行中看到的那样,并迭代所需的部分,而不是指定您想要开始的行。相反,您希望有选择地操作您的数据,如下所示:

private void startParsing() {

     for (int i = 0; i < worksheet.getPhysicalNumberOfRows(); i++) {
             if (i == ROW_E || i == ROW_F) {
                mutateCell(worksheet.getRow(i));
            }
        }
}

private void mutateCell(final Row curRow) {
    for(int i=0;i<Oleo18_1.size();i++){    
    XSSFCell c = curRow.getCell((short) d); 
    if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
        Oleo18_1.set(i, false);
    } 
    else {
        Oleo18_1.set(i, true);
        c.setCellType(Cell.CELL_TYPE_STRING);
    }

    if(Oleo18_1.get(i) == true){
        values_18_1.set(i, 9.09090909);
    }

    String a1Val = c.getStringCellValue();
    System.out.println("valor ponderacion"+(d+1)+": "+values_18_1.get(i));
    System.out.println("valor celda "+(d+1)+": "+a1Val);

    d++;  

     }                        
}

【讨论】:

  • 非常感谢,我很难学习如何使用 poi,这对我帮助很大!
猜你喜欢
  • 2012-04-01
  • 1970-01-01
  • 2020-10-05
  • 2018-04-07
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2022-10-16
  • 2015-08-04
相关资源
最近更新 更多