Summary: | Xlsx corrupted on IBM server | ||
---|---|---|---|
Product: | POI | Reporter: | Alex <vsz43919> |
Component: | XSSF | Assignee: | POI Developers List <dev> |
Status: | RESOLVED INVALID | ||
Severity: | critical | ||
Priority: | P2 | ||
Version: | 3.17-FINAL | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | All | ||
Attachments: | File corrupted |
Please try with POI 4.1.0 first, usually we don't even try to find out, what the problem in old versions of POI were. The corrupt file is a truncated zip (... .xlsx is a .zip) - without knowing the your webapp, my guess would be, you are closing the stream to the browser to early. What you could try is to save the worksheet locally on the server. If this file is corrupt, it might be POIs problem (use 4.1.0!) ... if not, your servlet logic is faulty. In Back end: ByteArrayOutputStream fileOut = new ByteArrayOutputStream(); workbook.write(fileOut); fileOut.flush(); byte[] ba = fileOut.toByteArray(); String encoded = DatatypeConverter.printBase64Binary(ba); fileOut.close(); workbook.close(); res.setJSonObject(encoded); return res; I see two issues here: - you haven't reacted to what I've requested, i.e. saving to a file (instead of the ByteArrayOutputStream). This is just temporarily for testing, to assist in finding the problem. you can use the ByteArrayOutputStream.writeTo() method to forward to the FileOutputStream - how do you handle a base64 encoded JSON String? when saving the file on client/browser side, this might lead to further errors. Is it really necessary to handle this in an AJAX call ... or can't you simply return a byte stream of content-type "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet " and leave the handling to the browser? On Development server my code works. The problem is on IBM testing server where i have a corrupted xlsx. On IBM server I can only deploy the war on weblogic On development server i also use weblogic . In Front End function base64ToArrayBuffer(base64) { var binaryString = window.atob(base64); var binaryLen = binaryString.length; var bytes = new Uint8Array(binaryLen); for (var i = 0; i < binaryLen; i++) { var ascii = binaryString.charCodeAt(i); bytes[i] = ascii; } return bytes; } or can't you simply return a
> byte stream of content-type
> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
> " and leave the handling to the browser?
Sorry for my second message. I also tried to return a byte stream but i have the same problem. I made many attempts :( Thanks you so much and sorry for my english
Ok, let us ignore the AJAX client for now - we need to stay on the server first. You can write to a temp folder on the testing server. For now I assume the file is invalid on the server. The difference can be the loaded classes. Please check the following for classpath issues: https://stackoverflow.com/questions/4925901/classcastexception-while-parsing-xml-with-weblogic Also try to set the classloader order to parent last: https://stackoverflow.com/questions/31583968/how-to-specify-order-of-jar-class-loading-in-weblogic IIRC you can activate a jar browser in the management console of weblogic to check for duplicated jars - please check that too. I don't think this is really caused by Apache POI itself. If you still have this problem, please create a more isolated test-case which allows to see where the problem is actually happening. As there was no response for some time we are closing this as INVALID for now. Please work on a more narrowed down test-case if you want us to continue investigation. |
Created attachment 36526 [details] File corrupted On ibm server, the xlsx is corrupted. From back end string base 64 to Fe where is decode and downloaded in jsp