web-dev-qa-db-fra.com

obtenir des colonnes à partir de fichiers Excel avec Apache POI?

Afin de faire une analyse statistique, j'ai besoin d'extraire des valeurs dans une colonne d'une feuille Excel. J'utilise le paquet de POI Apache pour lire à partir de fichiers Excel, et cela fonctionne bien lorsqu'il est nécessaire d'effectuer une itération sur des lignes. Cependant, je ne trouvais rien sur l'obtention de colonnes, ni dans l'API ( link text ) ni par le biais de la recherche Google.

Comme j'ai besoin d'obtenir les valeurs maximales et minimales de différentes colonnes et de générer des nombres aléatoires à l'aide de ces valeurs, donc sans sélectionner des colonnes individuelles, la seule autre option consiste à effectuer une itération sur les lignes et les colonnes pour obtenir les valeurs et les comparer une par une. sonner tout ce temps-efficace.

Des idées sur la façon de résoudre ce problème?

Merci,

15
posdef

Les fichiers Excel étant basés sur des lignes plutôt que sur des colonnes, le seul moyen d'obtenir toutes les valeurs d'une colonne consiste à examiner chaque ligne à tour de rôle. Il n'y a pas de moyen plus rapide d'accéder aux colonnes, car les cellules d'une colonne ne sont pas stockées ensemble.

Votre code veut probablement être quelque chose comme:

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());
      }
   }
}

Cela vous donnera ensuite toutes les valeurs de cellules numériques dans cette colonne.

18
Gagravarr

Je sais que c’est une vieille question, mais j’avais le même problème que celui présenté et j’ai dû le résoudre différemment.

Mon code ne pourrait pas être facilement adapté et aurait gagné beaucoup de complexité inutile. J'ai donc décidé de modifier la feuille Excel à la place en inversant les colonnes et les lignes comme expliqué ici: ( http://www.howtogeek.com/howto/12366/ )

Vous pouvez également l’inverser par VBA comme indiqué ici:

Convertir une ligne avec des colonnes de données en colonne avec plusieurs lignes dans Excel 2007

J'espère que ça aide quelqu'un là-bas

0
sgirardin

Je voulais juste ajouter, si vous avez des en-têtes dans votre fichier et que vous n'êtes pas sûr de l'index des colonnes mais que vous voulez choisir des colonnes sous des en-têtes spécifiques (noms de colonnes), par exemple, vous pouvez essayer quelque chose comme ceci.

    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());
                        }
                    }

                }    
            }
0
qwerty