Dear All, we use XSSFWorkbook, create it with a file name (not with an InputStream), and make modifications on the workbook.
If we close the workbook, sometimes the changes are written, sometimes not. It looks like, if we call the write function with any outputstream, the later call to close will overwrite the initial file. But if I don't call write, the initial file remains unchanged. I think, there are two issues: - the documentation says, close only would close the open stream, but in fact the source code looks like that changes should be saved back to the file. - the changes are only written by calling close, if a call to write happened before. So, if I want to save the original XLSX file, I need to save it twice. The workaround is, not to use the constructor which takes a File or a String, but to use the constructor with InputStream, close the stream, make the changes on the workbook and then write it back to the inputstream's location with the write function. The workbook.close() function is then not required to be called anymore. Does someone have experience with the correct usage of the API according to this? May be I miss some function call, which controls to write the file back on close. The actual use case is : use a XLSX workbook as a template open the file, write some content, write it back to a new file without changing the original template. I use now the workaround to first copy the template to my destination file, open that one with the InputStream constructor, close the stream at the end, and write the workbook back with write() to the copied template file. Background: For our ETL-scripting language KiScript we provide an API for POI, which is successfully in use. This is, how the KiScript code looks like using the workaround, it's similar to the JAVA api, module de.kisters.kiscript.poi.ssf.SSF File f = new File("c:\temp\myTemplate.xlsx") File target = new File("myDestination.xlsx") f.copy(target.getAbsolutePath()) SSFWorkbook wb = SSFWorkbook.createXSSFWorkbook(target.InputStream()) SSFSheet sh = wb.getSheetAt(0) // write a table to the workbook's sheet. sh.writeSheetVertically(Session.getList(), 2, 0, false) target.close() wb.write() wb.writeToFile(target) wb.close() Regards Burkhard -------------------------------------------------------------------------------------------------------------------------------------------- Burkhard Losch - KISTERS AG - Pascalstraße 8+10 - 52076 Aachen - Germany Handelsregister Aachen, HRB-Nr. 7838 | Vorstand: Klaus Kisters, Hanns Kisters | Aufsichtsratsvorsitzender: Dr. Thomas Klevers Phone: +49 2408 9385 -112 | Mobile: +49 176 19671041 | Fax: +49 2408 9385 -555 | E-Mail: burkhard.lo...@kisters.de | WWW: http://www.kisters.de -------------------------------------------------------------------------------------------------------------------------------------------- Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist nicht gestattet. This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorised copying, disclosure or distribution of the material in this e-mail is strictly forbidden.