2016-07-14 15 views
1

Ist es möglich, eine Arbeitsmappe zu speichern und zu speichern, ohne die bearbeitete Datei über die Basisdatei zu kopieren?Arbeitsmappe bearbeiten/schreiben, ohne unter anderem Namen zu speichern

Hier ist mein Code:

File file = new File("base.xlsx"); 
Workbook workbook = WorkbookFactory.create(file); 

Sheet sheet = workbook.getSheet("data"); 
... 
//creating rows and cells, writing stuff 
... 

//saving 
FileOutputStream fos = new FileOutputStream("edited.xlsx"); 
workbook.write(fos); 
workbook.close(); 
fos.close(); 
//now both the base.xlsx and edited.xlsx contain all the new and previous data - and are exactly the same size 

//using only 
workbook.close(); 
//the workbook file size changes (approximately to the same as edited.xlsx) and the timestamp is current 
//BUT the data doesn't get saved 

Die einzige andere Möglichkeit weiß, dass ich einen Inputstream von verwendet (dann aber aus dem Speicher (10 MB XLSX-Datei und 2 GB Heap-Speicher) bekomme ich)

Der verwirrende Teil ist: Warum wird die Datei base.xlsx bearbeitet, wenn ich sie in eine andere Datei schreibe?

Antwort

2

Ab Juli 2016 (Apache POI 3.15 Beta 2), ist dies noch nicht

unterstützt

In POI, nennen wir diese In-Place schreiben. Seit einiger Zeit unterstützen dies auch die zugrunde liegenden Dateiformat-Module (POIFS und OPC). (Sie haben das nicht lange gemacht, weshalb POI so erwachsen geworden ist, wie es beim Sparen funktioniert). Allerdings wurde keines der formatspezifischen Module aktualisiert, um dies zu nutzen. So werden alle Dokumente auf der UserModel Ebene geöffnet (zB Workbook oder HWPFDocument von XLSFSlideShow) unterstützt derzeit nur auf einen neuen Stream auszuschreiben

Wenn Sie daran interessiert sind, die Fehler zu sehen sind #57919 und #59287.

Wenn diese Fragen für Sie und Sie wollen einige Coding-Zeit zu helfen, werfen Sie einen Blick auf die dann beitreten the dev list und Leute können Ihnen Hinweise!

+0

Vielen Dank für Ihre Erklärung! – Beig