# POI-HSSF Excel Datei modifizieren



## dergrüne (20. Jan 2008)

Servus,

ich arbeite ein wenig mit dem HSSF Package von Apache. Nun kann ich ohne Probleme eine XSL Datei erstellen und auch eine XLS Datei einlesen.

Damit könnte man ja theoretisch eine Excel Datei modifizieren, indem ich halt vorher einlese und dann eine neue Excel Datei mit gleichem Namen erstelle. In der die alten und die neuen Daten reingeschrieben werden.

Das ist allerdings sehr umständlich und irgendwie scheint das auch mit dem HSSF Package zu gehen, leider bekomme ich 
es nicht hin.

Hat jemand einen Tip wie ich eine bestehende Excel Datei so öffne, dass ich ohne Probleme da weiter reinschreiben kann?

Am besten ein Code Beispiel.

mfg
Der Grüne


----------



## SlaterB (20. Jan 2008)

wie liest du denn bisher Dateien oder schreibst neue?
das musst du einfach nur verbinden:
HSSFWorkbook einlesen, ändern und in einen anderen Stream schreiben,

> Das ist allerdings sehr umständlich 
+
> leider bekomme ich es nicht hin. 

beschreibe doch ganz konkret was nicht läuft

> und irgendwie scheint das auch mit dem HSSF Package zu gehen

davon reden wir ja, wie sonst?


----------

erinnere mich evtl. Montag noch mal mit einem Posting in diesem Thead,
dann kann ich etwas Code posten, wird aber nur allgemeines Einlesen + Schreiben sein
PM geht auch, erkenne ich aber potentiell erst einen Tag später in den Mails


----------



## dergrüne (20. Jan 2008)

Danke, aber ich will ja in die selbe Datei lesen.

Sprich es gibt eine test.xls wo auch manuell Daten reingeschrieben werden können, also ganz normal über Excel. Dann kommt aber alle 10min. oder so ein CSV Import, der neue Daten in die Excel Datei importiert. 

D.h. wenn die Datei nicht geöffnet ist, sollen die neuen Importierten Daten einfach angehängt werden und die händischen Änderungen natürlich nicht verloren gehen. 

Nun kann man zwar eine Datei mit nem OS so öffnen, dass diese nicht autom. neu angelegt wird, aber irgendwie funktioniert dann das reinschreiben nicht. 

Und gleichzeitig aus der selben Datei einlesen und reinschreiben funktioniert ja auch nicht wirklich, müsste mir dann vorher eine Sicherung der alten Datei anlegen und dann aus der lesen.

Oder seh ich da irgendwas falsch?

mfg


----------



## SlaterB (20. Jan 2008)

nur mit Wiederholung der gleichen Aussagen ist niemanden geholfen,

> aber irgendwie funktioniert dann das reinschreiben nicht. 

doch,
du willst nicht verraten warum nicht?
was heißt 'eine Datei mit nem OS so öffnen, dass diese nicht autom. neu angelegt wird'?

> Und gleichzeitig aus der selben Datei einlesen und reinschreiben funktioniert ja auch nicht wirklich

doch, 
du willst nicht verraten warum nicht?

wobei ich jetzt nichtmal den Unterschied zum obigen 'aber irgendwie funktioniert dann das reinschreiben nicht' sehe..


----

ein Beispiel kann ich aber wie gesagt erst Montag posten


----------



## dergrüne (23. Jan 2008)

SlaterB hat gesagt.:
			
		

> nur mit Wiederholung der gleichen Aussagen ist niemanden geholfen,
> 
> > aber irgendwie funktioniert dann das reinschreiben nicht.
> 
> ...



Wenn ich die xls Datei so mit einem Outputstream öffne, wird sie nicht direkt überschrieben, sondern man kann eine Datei dann modifzieren.

new Csv2Xls("756016_200709251112.csv", new FileOutputStream("data.xls", true));	

Wenn ich die Datei so aufrufen würde:
new Csv2Xls("756016_200709251112.csv", new FileOutputStream("data.xls"));	

Würde die xls-Datei direkt neu angelegt werden und die alten Daten aus der XLS Datei wären futsch, das will ich ja nicht.



			
				SlaterB hat gesagt.:
			
		

> > Und gleichzeitig aus der selben Datei einlesen und reinschreiben funktioniert ja auch nicht wirklich
> 
> doch,
> du willst nicht verraten warum nicht?
> ...



Ich meine eine Datei gleichzeitig mit einem Inputstream zum lesen und einem Outputstream zum schreiben bearbeiten geht nicht. Wenn müsste ich die Datei zuerst mit einem inputstream einlesen -> puffern -> alte mit den neuen Daten per OS wieder rausschreiben. Was aber umständlich ist. Das würde ich halt gern vermeiden. Vorallem, weil dann auch evtl. Filter oder sonstiges flöten gehen, die man evtl. manuel über Excel in der xls Datei angelegt hat.

mfg


----------



## SlaterB (24. Jan 2008)

nun, dann schwebst du vielleicht in höheren Sphären als ich,
selbst Excel selber wird doch wohl Dateien komplett einlesen wenn sie bearbeitet werden,

was soll das append bringen? schreibst du nur ans Ende der Datei?
selbst wenn, ist Excel nicht ein höheres Format mit irgendeiner internen Struktur? 
kann mir gar nicht vorstellen, dass man da einfach ans Ende was anfügen kann,
das funktioniert doch nur bei Txt, wo nach dem letzten Buchstaben genau nix mehr folgt,

ich kenne jedenfalls nur

POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(_templateFile));
        this.workbook = new HSSFWorkbook(fs);

// workbook an beliebiger Stelle bearbeiten

FileOutputStream out = new FileOutputStream(this.targetFile);
        this.workbook.write(out);
        out.close();

was ist daran bitte aufwendig?
na jedenfalls kann ich dir leider nicht weiterhelfen, wenn du das anders angehst


----------

