2017-01-07 4 views
1

Ich habe Probleme mit der Iteration über Zeilen und Zellen in Excel mit Java. Ich habe in Blatt strukturierte Daten auf diese Weise:Wie Zellenwert ohne Iterator vorwärts zu bewegen - Excel, Java POI

enter image description here

ich alle Zahlen sammeln und es an den Konstruktor übergeben. Ich habe versucht, etw wie folgt aus:

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

    } 

Wie damit umgehen? Vielen Dank im Voraus :)

EDIT:

entschied ich mich Zellen in anderer Art und Weise zu erhalten:

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

Diese Lösung ist deutlich besser, aber ich habe Probleme, weil statt Wert zeigen Zellen von System.out.println(c) i müssen diesen Wert wie im Beispiel mit Iteratoren an den Konstruktor übergeben. Aber jetzt habe ich Zugriff auf die Zelle mit Schleife, so kann ich nicht Wert der nächsten Zelle mit .next() oder etw ähnlich - ich kann nicht die nächste Zelle in einer Zeile Code, so wie das gleiche Objekt zu erstellen wie oben (mit Iterator) aber mit diesem Code?

+0

"Wie bekomme ich den Zellenwert, ohne vorwärts zu gehen?" Speichern Sie den Wert, bevor Sie fortfahren? – Moira

+0

@ 1blustone Ich weiß nicht, wie man diesen Wert bekommt. Lesen Sie meine Erklärung, nicht nur ein tile :) – pulpet112

+0

Ich tat, weshalb ich sagte, es zu speichern. Was ist das Problem mit dem Iterator weiter? Haben Sie eine Zeile wie 'Cell stored = cellIterator.next()' und verwenden Sie diese dann für 'precId [1]'? oder habe ich nicht richtig verstanden – Moira

Antwort

0

Initialise nextRow variabel und cellIterator wieder -

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

    } 

Bitte beachten Sie, dass iterator.next() wieder in der Schleife ruft einige Runtimeexception verursachen kann, ist es immer besser ist, iterator.hasNext() zuerst anrufen, prüfen Sie den Wert Rückkehr und rufen dann iterator.next()

+0

das sollte gut funktionieren, aber es tut nicht. und ich weiß nicht warum. Sieht so aus, als würde dieser Iterator diesen Wert immer noch auslassen ... – pulpet112

+0

endlich funktioniert es !! Ich weiß nicht warum, aber 'cellIterator.next();' sollte nur einmal aufgerufen werden – pulpet112

+1

@Vikas Sachdeva: Dieser Code ist keine gute Praxis. Lies [Iteriere über Zellen, mit Kontrolle über fehlende/leere Zellen] (https://poi.apache.org/spreadsheet/quick-guide.html#Iterate+over+cells%2C+mit+Control+of+missing+%2F + blank + cells): "Der CellIterator gibt nur die Zellen zurück, die in der Datei definiert sind. Dies sind hauptsächlich die mit Werten oder Stylings, aber es hängt von Excel ab." –

0

Andere Art und Weise ohne Iterator -

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