2017-01-07 18 views
1

У меня проблема с итерацией по строкам и ячейкам в excel с помощью java. У меня есть данные, структурированные в листе таким образом:Как получить значение ячейки без перемещения итератора вперед - Excel, Java POI

enter image description here

Я должен собрать все цифры и передать его в конструктор. Я пробовал так:

Iterator<Row> iterator = firstSheet.iterator(); 
while (iterator.hasNext()){ 
     Row nextRow = iterator.next(); 
     Iterator<Cell> cellIterator = nextRow.cellIterator(); 
     int id = (int) cellIterator.next().getNumericCellValue(); 
     int pr = (int) cellIterator.next().getNumericCellValue(); 
     int[] prId = new int[2]; 

     prId[0] = (int) cellIterator.next().getNumericCellValue(); 

     iterator.next(); // i have to move down one row to get 5 and 6 

     precId[1] = // what should I type here?? cellIterator.next() will cause, that cell with value "5" will be omitted and I will get "6" 
     int co = (int) cellIterator.next().getNumericCellValue(); 
     list.add(new Rule(id, pr, prId, co)); 

    } 

Как с этим бороться? Заранее спасибо :)

EDIT:

я решил получить клетки в другой форме:

for(int rowNum = rowStart+1; rowNum < rowEnd; rowNum++){ 
     Row r = sheet.getRow(rowNum); 
     if(r == null){ 
      continue; 
     } 
     int lastColumn = Math.max(r.getLastCellNum(), 4); 
     for(int cn = 0; cn < lastColumn; cn++){ 
      @SuppressWarnings("deprecation") 
      Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL); 
      if(c == null){ 
       continue; 
      }else{ 
       System.out.println(c); 
      } 
     } 
    } 

Это решение явно лучше, но у меня есть проблема, потому что вместо значения показывают клетки с помощью System.out.println(c) я необходимо передать это значение конструктору, как в примере с итераторами. Но теперь у меня есть доступ к ячейке с использованием цикла, поэтому я не могу получить значение следующей ячейки, используя .next() или sth аналогично - я не могу получить следующую ячейку в одной строке кода, поэтому, как создать тот же объект как и выше (с итератором), но используя этот код?

+0

«Как получить значение ячейки без перемещения вперед» сохранить значение перед перемещением? – Moira

+0

@ 1blustone Я не знаю, как получить это значение. Прочитайте мое объяснение, а не только титил :) – pulpet112

+0

Я сделал, поэтому я сказал, чтобы сохранить его. В чем проблема с продолжением итератора? У вас есть строка, подобная 'Cell stored = cellIterator.next()', а затем использовать ее для 'precId [1]'? или я не понял правильно – Moira

ответ

0

Initialise nextRow переменной и cellIterator снова -

Iterator<Row> iterator = firstSheet.iterator(); 
while (iterator.hasNext()){ 
     Row nextRow = iterator.next(); 
     Iterator<Cell> cellIterator = nextRow.cellIterator(); 
     int id = (int) cellIterator.next().getNumericCellValue(); 
     int pr = (int) cellIterator.next().getNumericCellValue(); 
     int[] prId = new int[2]; 

     prId[0] = (int) cellIterator.next().getNumericCellValue(); 

     nextRow = iterator.next(); // i have to move down one row to get 5 and 6 
     cellIterator = nextRow.cellIterator(); 
     cellIterator.next(); // for first empty cell 
     cellIterator.next(); // for second empty cell 

     precId[1] = (int) cellIterator.next().getNumericCellValue(); 
     int co = (int) cellIterator.next().getNumericCellValue(); 
     list.add(new Rule(id, pr, prId, co)); 

    } 

Пожалуйста, обратите внимание, что вызов iterator.next() снова в цикле может вызвать некоторое RuntimeException, всегда лучше позвонить iterator.hasNext() первым, проверьте возвращаемое значение, а затем вызвать iterator.next()

+0

это должно работать нормально, но это не так. и я не знаю почему. Похоже, что этот итератор все еще опускает это значение ... – pulpet112

+0

наконец-то работает! Я не знаю, почему, но 'cellIterator.next();' следует вызывать только один раз. – pulpet112

+1

@Vikas Sachdeva: Этот код не является хорошей практикой. Чтение [Итерация по ячейкам с контролем отсутствующих/пустых ячеек) (https://poi.apache.org/spreadsheet/quick-guide.html#Iterate+over+cells%2C+with+control+of+missing+%2F + blank + cells): «CellIterator вернет только ячейки, определенные в файле, в основном это те, у которых есть значения или стили, но это зависит от Excel». –

0

Другой способ без использования итератора -

for (int rowNum = rowStart + 1; rowNum < rowEnd; rowNum = rowNum + 2) { 

     Row oddRow = sheet.getRow(rowNum); 
     if (oddRow == null) { 
      continue; 
     } 
     int[] prId = new int[2]; 
     int id = (int) oddRow.getCell(0).getNumericCellValue(); 
     int pr = (int) oddRow.getCell(1).getNumericCellValue(); 
     prId[0] = (int) oddRow.getCell(2).getNumericCellValue(); 

     Row evenRow = sheet.getRow(rowNum); 
     if (evenRow == null) { 
      continue; 
     } 
     prId[1] = (int) evenRow.getCell(2).getNumericCellValue(); 
     int co = (int) evenRow.getCell(3).getNumericCellValue(); 
     list.add(new Rule(id, pr, prId, co));