2010-05-27 37 views
15

Para hacer algunos análisis estadísticos, necesito extraer valores en una columna de una hoja de Excel. He estado usando el paquete de puntos de interés de Apache para leer desde archivos de Excel, y funciona bien cuando hay que iterar sobre las filas. Sin embargo, no pude encontrar nada sobre cómo obtener columnas ni en la API (link text) ni a través de la búsqueda en Google.para obtener columnas de archivos de Excel usando Apache POI?

Como necesito obtener valores máximos y mínimos de diferentes columnas y generar números aleatorios usando estos valores, sin recoger columnas individuales, la única otra opción es iterar sobre filas y columnas para obtener los valores y comparar uno por uno, que no suena tan eficiente en el tiempo.

¿Alguna idea sobre cómo abordar este problema?

Gracias,

Respuesta

17

archivos de Excel son fila basado en lugar de columna en función, por lo que la única manera de obtener todos los valores de una columna es mirar cada fila a su vez. No hay una forma más rápida de llegar a las columnas, porque las celdas de una columna no se almacenan juntas.

Su código probablemente quiere ser algo como:

List<Double> values = new ArrayList<Double>(); 
for(Row r : sheet) { 
    Cell c = r.getCell(columnNumber); 
    if(c != null) { 
     if(c.getCellType() == Cell.CELL_TYPE_NUMERIC) { 
     valuesadd(c.getNumericCellValue()); 
     } else if(c.getCellType() == Cell.CELL_TYPE_FORMULA && c.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC) { 
     valuesadd(c.getNumericCellValue()); 
     } 
    } 
} 

Que luego te dará todos los valores de las celdas numéricas de esa columna.

0

Sé que es una vieja pregunta, pero tuve el mismo problema presentado y tuve que resolverlo de manera diferente.

Mi código no se pudo adaptar fácilmente y habría adquirido una complejidad innecesaria. Así que decidí cambiar la hoja de Excel no por inversing columnas y filas como se explica aquí: (http://www.howtogeek.com/howto/12366/)

También puede inverso por VBA como se muestra aquí:

Convert row with columns of data into column with multiple rows in Excel 2007

espero que ayude a alguien

0

Solo quería agregar, en caso de que tenga encabezados en su archivo y no esté seguro sobre el índice de la columna, pero quiera seleccionar columnas bajo encabezados específicos (nombres de columna) para, por ejemplo, puede intentar algo como esto

for(Row r : datatypeSheet) 
      { 
       Iterator<Cell> headerIterator = r.cellIterator(); 
       Cell header = null; 
       // table header row 
       if(r.getRowNum() == 0) 
       { 
        // getting specific column's index 

        while(headerIterator.hasNext()) 
        { 
         header = headerIterator.next(); 
         if(header.getStringCellValue().equalsIgnoreCase("column1Index")) 
         { 
          column1Index = header.getColumnIndex(); 
         } 
        } 
       } 
       else 
       { 
        Cell column1Cells = r.getCell(column1); 

        if(column1Cells != null) 
        { 
         if(column1Cells.getCellType() == Cell.CELL_TYPE_NUMERIC) 
         { 
// adding to a list 
          column1Data.add(column1Cells.getNumericCellValue()); 
         } 
         else if(column1Cells.getCellType() == Cell.CELL_TYPE_FORMULA && column1Cells.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC) 
         { 
// adding to a list 
          column1Data.add(column1Cells.getNumericCellValue()); 
         } 
        } 

       }  
      } 
Cuestiones relacionadas