получить столбцы из файлов Excel, используя Apache POI? - PullRequest
15 голосов
/ 27 мая 2010

Чтобы провести статистический анализ, мне нужно извлечь значения в столбце листа Excel. Я использовал пакет Apache POI для чтения из файлов Excel, и он прекрасно работает, когда нужно перебирать строки. Однако я не смог найти ничего о получении столбцов ни в API ( текст ссылки ), ни через поиск в Google.

Поскольку мне нужно получить максимальные и минимальные значения разных столбцов и сгенерировать случайные числа, используя эти значения, поэтому без выбора отдельных столбцов единственным другим вариантом является итерация по строкам и столбцам для получения значений и сравнение по одному , что звучит не так уж и эффективно.

Есть идеи, как решить эту проблему?

Спасибо

Ответы [ 3 ]

18 голосов
/ 31 марта 2011

Файлы Excel основаны на строках, а не на столбцах, поэтому единственный способ получить все значения в столбце - это просматривать каждую строку по очереди. Нет более быстрого способа добраться до столбцов, потому что ячейки в столбце не хранятся вместе.

Ваш код, вероятно, хочет выглядеть примерно так:

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

Это даст вам все числовые значения в этом столбце.

0 голосов
/ 06 февраля 2018

Просто хотел добавить, если в вашем файле есть заголовки и вы не уверены в индексе столбца, но хотите выбрать столбцы под определенными заголовками (именами столбцов), например, вы можете попробовать что-то вроде этого

    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 голосов
/ 06 ноября 2013

Я знаю, что это старый вопрос, но у меня была та же самая проблема, что и была представлена, и мне пришлось решать ее по-другому

Мой код не мог быть легко адаптирован и приобрел бы много ненужной сложности. Поэтому я решил вместо этого изменить таблицу Excel, перевернув столбцы и строки, как описано здесь: (http://www.howtogeek.com/howto/12366/)

Вы также можете инвертировать его по VBA, как показано здесь:

Преобразование строки с столбцами данных в столбец с несколькими строками в Excel 2007

Надеюсь, это кому-нибудь поможет

...