Mit POI Zeile in Excel löschen

Status
Nicht offen für weitere Antworten.

Jules

Mitglied
Hallo zusammen,

ich habe eine Frage zum Thema POI.
Und zwar lösche ich in einem Excelsheet mit der Methode removeRow eine Zeile und rücke alle darunterliegenden Zeilen mit shiftRow eins höher.
Also wenn ich nun 10 Zeilen habe und Zeile 5 gelöscht wird, werden Zeile 6 bis 10 auf Position 5 bis 9 hochgerückt. Nun habe ich das Problem, dass Zeile 10 zwar leer ist, aber trotzdem noch als vorhandene Zeile (mit leeren Spalten) erkannt wird. Der rowIterator zählt auch die leere, so eben gelöschte Zeile mit.
Warum tut er das und wie kann ich die letzte Zeile entgültig löschen?

Hier das löschen und verschieben der Zeilen
Code:
HSSFRow row = mySheet.getRow(rowNumber); 

//Zeile löschen
mySheet.removeRow(row);	
        
//Zeilen unter der gelöschten Zeile eins hochgerücken, von totalCountsOfRows eins abziehen, da index bei 0 beginnt
mySheet.shiftRows(rowNumber, totalCountOfRows-1, -1);

Und hier das iterieren über die Excel-Tabelle
Code:
	public static Vector readExcelFile() throws Exception
       {
	  Vector cellVectorHolder = new Vector();
		   	
	  HSSFWorkbook myWorkBook = prepareExcelSheet();
    	
          HSSFSheet mySheet = myWorkBook.getSheetAt(0);
  
          Iterator rowIter = mySheet.rowIterator(); 
          while(rowIter.hasNext()){
        	  HSSFRow myRow = (HSSFRow) rowIter.next();
        	  Iterator cellIter = myRow.cellIterator();
        	  Vector cellStoreVector=new Vector();
        	  while(cellIter.hasNext()){
        		  HSSFCell myCell = (HSSFCell) cellIter.next();
        		  cellStoreVector.addElement(myCell);
        	  }
       		  cellVectorHolder.addElement(cellStoreVector); 
          }
    	  return cellVectorHolder;
    }

Kann jemand helfen? :bahnhof:
 
remove-Aufruf?

Java:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("c:/temp/test.xls"));
        HSSFWorkbook workbook = new HSSFWorkbook(fs);
        HSSFSheet s = workbook.getSheetAt(0);
        System.out.println(s.getLastRowNum() + ", " + s.getRow(5));
        s.shiftRows(2, 5, -1);
        System.out.println(s.getLastRowNum() + ", " + s.getRow(5));
        s.removeRow(s.getRow(5));
        System.out.println(s.getLastRowNum() + ", " + s.getRow(5));

        FileOutputStream out = new FileOutputStream(new File("c:/temp/test2.xls"));
        workbook.write(out);
        out.close();
    }

}
Ausgabe:
Code:
5, org.apache.poi.hssf.usermodel.HSSFRow@360be0
4, org.apache.poi.hssf.usermodel.HSSFRow@360be0
4, null

im Anhang die Test-Datei, als txt getarnt,
was genau geht nun nicht? falls die Java-Ausgabe anders ist: andere POI-Version?
 

Anhänge

Hallo SlaterB,

danke für deine Antwort.
Das Problem liegt mehr oder weniger im Iterator.
Wenn ich, wie in deinem Beispiel 5 befüllte Zeilen in einem ExcelSheet habe und die 5te Zeile lösche ist dort zwar kein Inhalt mehr drin, aber wenn ich mit dem rowIterator() den Inhalt der des ExcelSheets in einen Vector einlese und mir anschließend die Größe des Vektors ausgeben lasse, ist diese immer noch bei 5 und nicht 4 Zeilen... der Iterator zählt jede zuvor gelöschte Zeile mit... Merkwürdig ist jedoch, dass der cellIterator() merkt, dass sich in den Zellen dieser Zeile kein Inhalt mehr befindet und nicht weiter iteriert. Der rowIterator iteriert jedoch munter weiter über die gelöschten Zeilen.
 
ich sehe keinen Unterschied zwischen Iterator und getRow()

die Row ist noch da solange nicht removeRow() aufgerufen wird, ja,
warum weiß ich auch nicht, außer vielleicht aus Sparsamkeit, um später nicht eine neue Row anlegen zu müssen

dennoch ist removeRow möglich, auch für den Iterator:
Java:
public class Test
{


    public static void main(String[] args)
        throws Exception
    {
        POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("c:/temp/test.xls"));
        HSSFWorkbook workbook = new HSSFWorkbook(fs);
        HSSFSheet s = workbook.getSheetAt(0);
        System.out.println("0: " + s.getRow(0));
        System.out.println("1: " + s.getRow(1));
        System.out.println("2: " + s.getRow(2));
        System.out.println("3: " + s.getRow(3));
        System.out.println("4: " + s.getRow(4));
        System.out.println("5: " + s.getRow(5));
        System.out.println("last: " + s.getLastRowNum() + ", " + s.getRow(5));
        s.shiftRows(2, 5, -1);
        System.out.println("last: " + s.getLastRowNum() + ", " + s.getRow(5));
        Iterator iter = s.rowIterator();
        while (iter.hasNext())
        {
            System.out.println(iter.next());
        }
        s.removeRow(s.getRow(5));
        System.out.println("last: " + s.getLastRowNum() + ", " + s.getRow(5));
        iter = s.rowIterator();
        while (iter.hasNext())
        {
            System.out.println(iter.next());
        }
        FileOutputStream out = new FileOutputStream(new File("c:/temp/test2.xls"));
        workbook.write(out);
        out.close();
    }

}

Code:
0: org.apache.poi.hssf.usermodel.HSSFRow@360be0
1: null
2: org.apache.poi.hssf.usermodel.HSSFRow@45a877
3: org.apache.poi.hssf.usermodel.HSSFRow@1372a1a
4: org.apache.poi.hssf.usermodel.HSSFRow@ad3ba4
5: org.apache.poi.hssf.usermodel.HSSFRow@126b249
last: 5, org.apache.poi.hssf.usermodel.HSSFRow@126b249
last: 4, org.apache.poi.hssf.usermodel.HSSFRow@126b249
org.apache.poi.hssf.usermodel.HSSFRow@360be0
org.apache.poi.hssf.usermodel.HSSFRow@182f0db
org.apache.poi.hssf.usermodel.HSSFRow@45a877
org.apache.poi.hssf.usermodel.HSSFRow@1372a1a
org.apache.poi.hssf.usermodel.HSSFRow@ad3ba4
org.apache.poi.hssf.usermodel.HSSFRow@126b249
last: 4, null
org.apache.poi.hssf.usermodel.HSSFRow@360be0
org.apache.poi.hssf.usermodel.HSSFRow@182f0db
org.apache.poi.hssf.usermodel.HSSFRow@45a877
org.apache.poi.hssf.usermodel.HSSFRow@1372a1a
org.apache.poi.hssf.usermodel.HSSFRow@ad3ba4
 
Ok, ich sehe meinen Fehler.
Ich muss nach dem shiftRow() noch mal explizit einen removeRow() machen. Bisher habe ich z.B. Zeile 3 gelöscht, dann Zeile 4-5 auf Position 3-4 verschoben und habe angenommen, dass somit Zeile 5 automatisch verschwindet.

Danke für deine Hilfe!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben