2012-01-29 15 views
7

Estoy buscando una celda en una hoja de cálculo que tenga la cadena 'Total' y luego use la fila en la que se encuentra esa celda para encontrar el valor total en otra celda, que siempre es la misma celda/columna (la décima celda en un índice basado en 0).PDI de Java: cómo encontrar una celda de Excel con un valor de cadena y obtener su posición (fila) para usar esa posición para buscar otra celda

he el siguiente código, que no tiene errores (sintaxis), pero el método no devuelve findCell valor ROWNUM:

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

     String fileName = "C:\\file-path\\report.xls"; 
     String cellContent = "Total"; 
     int rownr=0, colnr = 10; 

     InputStream input = new FileInputStream(fileName); 

     HSSFWorkbook wb = new HSSFWorkbook(input); 
     HSSFSheet sheet = wb.getSheetAt(0); 

     rownr = findRow(sheet, cellContent); 

     output(sheet, rownr, colnr); 

     finish(); 
    } 

    private static void output(HSSFSheet sheet, int rownr, int colnr) { 
     /* 
     * This method displays the total value of the month 
     */ 

     HSSFRow row = sheet.getRow(rownr); 
     HSSFCell cell = row.getCell(colnr); 

       System.out.println("Your total is: " + cell);   
    } 

    private static int findRow(HSSFSheet sheet, String cellContent){ 
     /* 
     * This is the method to find the row number 
     */ 

     int rowNum = 0; 

     for(Row row : sheet) { 
      for(Cell cell : row) { 

       while(cell.getCellType() == Cell.CELL_TYPE_STRING){ 

        if(cell.getRichStringCellValue().getString() == cellContent);{ 

          rowNum = row.getRowNum(); 
          return rowNum; 
        } 
       } 
      } 
     }    
     return rowNum; 
    } 

    private static void finish() { 

     System.exit(0); 
    } 
} 

Respuesta

17

Esta corrección método es la solución a su problema:

private static int findRow(HSSFSheet sheet, String cellContent) { 
    for (Row row : sheet) { 
     for (Cell cell : row) { 
      if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
       if (cell.getRichStringCellValue().getString().trim().equals(cellContent)) { 
        return row.getRowNum(); 
       } 
      } 
     } 
    }    
    return 0; 
} 

Tenga en cuenta que su colnr sigue siendo un valor fijo.

+0

Muchas gracias @msi. El código sugerido solucionó el problema, funcionó perfectamente. Soy relativamente nuevo en la programación, puedo preguntarle: 1. por qué cambió el enunciado while y 2. por qué el retorno del bucle for = 0. ¡gracias de nuevo! – lv10

+1

Cuando usa el ciclo 'while', está asumiendo que todas las celdas a la izquierda de 'celda total' están llenas de cadena. Por ejemplo, celdas como esta: | | 1 | Total | NO SE PUEDE encontrar con while, porque 'while' se romperá en el valor de 1. Volviendo a 0 en caso de que no se encuentre 'total-cell'. – msi

+1

Para comparar dos cadenas, debe usar el método equals. '==' se usa para comparar tipos primitivos, no objetos. Y getString() devuelve un Objeto. Si desea obtener más información sobre cadenas, lea sobre el grupo de cadenas y el método interno. Aquí es donde puedes encontrar casos cuando comparar usando '==' es correcto. También utilicé el método de recorte solo porque a las entradas del usuario les gusta contener algunos espacios adicionales al final de la cadena. – msi

2

Usted tiene un punto y coma después de su declaración if que significa que su if no lo hará trabajo:

if(cell.getRichStringCellValue().getString() == cellContent);{ 

Incluso si esto no resolverá el problema, creo que su estado de cuenta while puede no ser adecuado para aquí;

while(cell.getCellType() == Cell.CELL_TYPE_STRING) 

Por lo que recuerdo, hay otros tipos de células en POI. Intenta poner un punto de interrupción en estas líneas y compruébalo si tiene CellType correcto.

+0

Muchas gracias. Su sugerencia era correcta, la declaración while tenía algo mal. Lo eliminé y lo cambié por una declaración if como se sugiere más abajo por @msi. – lv10

Cuestiones relacionadas