Hi, that sound like a bug, there were some discussions before about save-behavior and ways to save changes back to the same file, however I think we should not write back to the original file in some obscure automated way like you describe, can you create a bug-report with the sample code so one of us takes a closer look?
For now the workaround sounds valid. Dominik. On Thu, Jan 12, 2017 at 10:12 AM, Burkhard Losch <[email protected]> wrote: > 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: [email protected] | 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.
