通过java中的poi遍历行的列

时间:2015-06-07 04:03:29

标签: java apache-poi

我的c:驱动器(本地计算机)中有一个名为abc.xls的excel文件,现在在第一张表格中的excel文件中有一个如下所示的表格,下面的表格可以位于任何范围内这张表,所以我开发了下面的java程序,它将逐行扫描整个工作表,然后在列的基础上扫描整个工作表,然后找到单元格 TradeRef就在那里

 TradeRef   TMS  Deal     Date        
    12      45   DRT    23/97/2014      
    23      36   QWE    21/07/2015  

现在我的下面程序中的问题是它捕获了TradeRef所在的单元格,然后它迭代了列,然后以类似的方式捕获下一行并迭代列

但我要应用的逻辑是,当它捕获TradeRef单元格并迭代列并到达表格的最后一列(上表中为Date)时,它应该进一步扫描下面的20列相同的行,如果在接下来的20列中没有任何值的单元格,那么它应该移动到下一行,如果在20列中,它应该是任何单元格都可以有值,那么在这种情况下它应该读取该单元格值

所以就像

 TradeRef   TMS  Deal     Date          <----- scan next 20 columns is there is no value in next 20 cells then move to next row else include that cell value also------->
    12      45   DRT    23/97/2014        
    23      36   QWE    21/07/2015  

所以请告知如何实现扫描下面行中接下来20列的上述逻辑是我早期的实现

public class AAA {
    public static void main(String[] args) throws IOException {


        FileInputStream file = null ;
         try {

                 file = new FileInputStream(new File("C:\\abc.xls"));
                HSSFWorkbook workbook = new HSSFWorkbook(file);
                HSSFSheet firstSheet = workbook.getSheetAt(0);
                Iterator<Row> iterator = firstSheet.iterator();

                Cell c = findFirstRow(firstSheet);
             }




             catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally{
                file.close();
            }

    }

    public static Cell findFirstRow(HSSFSheet firstSheet) {
          for (Row row : firstSheet) {
            for (Cell cell : row) {
                  cell.setCellType(cell.CELL_TYPE_STRING);
              if ("TradeRef".equals(cell.getStringCellValue())) {
                int row1 = cell.getRowIndex() + 1;
                int col = cell.getColumnIndex();
                if (firstSheet.getRow(row1) == null)
                  throw new RuntimeException("Row " + row1 + 1 + " is empty!");
                Cell startOfFirstDataRow = firstSheet.getRow(row1).getCell(col);
                if (startOfFirstDataRow == null) {
                  CellReference ref = new CellReference(row1, col);
                  throw new RuntimeException("Data not found at " + ref.formatAsString());
                }
                return startOfFirstDataRow;
              }
            }
          }
          throw new RuntimeException("TradingRef header cell not found!");
        }


}

所以请告知我如何实现扫描下20列的上述逻辑

1 个答案:

答案 0 :(得分:0)

首先,您应该使用org.apache.poi.ss.usermodel API,它适用于所有Excel文件,而HSSF*类仅适用于.xls个文件。

org.apache.poi.ss.usermodel.Sheet类有一个getFirstRow()方法,您可以使用该方法开始搜索。接下来,您要查找包含给定字符串的单元格序列,例如:

// This is an array containing the headers
final String[] headers = { "TradeRef", "TMS", "Deal", "Date" };

// now we take row from above to be the Row object where we seek our headers
int last = row.getLastCellNum();
for (int c = row.getFirstCellNum(); c < last; c++) {
    int h = 0;
    // check if the cell at (c + h) has the required value
    for (; h < headers.length && c + h < last; h++) {
        if (!headers[h].equals(row.getCell(c + h).getStringCellValue())) {
            break; // if the cell value differs from our header
        }
    }
    if (h == headers.length) // this means the break was never invoked 
        return c; // found it
}
return -1; // not found