2016-06-07 25 views
2

Hier im Grunde versuche ich, Zip-Datei mit Excel-Tabellen von Server zu Client senden.Generieren In-Memory-Zip-Datei mit Excel-Seiten auf Servlet-Seite

Ansatz 1: Mein Servlets Code

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ZipOutputStream zos = new ZipOutputStream(bos); 

for(Map.Entry<String, List<Data>> entry : DatasMap.entrySet()) 
{ 
    String fileName = entry.getKey(); 
    List<Data> excelData = entry.getValue(); 

    // The below code constructs the workbook and returns it 
    SXSSFWorkbook workBook = getWorkBook(fileName, excelData); 
    ZipEntry zipEntry = new ZipEntry(fileName); 
    zos.putNextEntry(zipEntry); 
    workBook.write(zos); 

    zos.closeEntry(); // getting error at this line 
} 

Fehler:

SEVERE: Servlet.service() for servlet [MyApp-server] in context with path [/myapp-server] threw exception 
java.io.IOException: Stream closed 
    at java.util.zip.ZipOutputStream.ensureOpen(ZipOutputStream.java:82) 
    at java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:231) 

Ansatz 2:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ZipOutputStream zos = new ZipOutputStream(bos); 
ServletOutputStream out = response.getOutputStream(); 

for(Map.Entry<String, List<Data>> entry : DatasMap.entrySet()) 
{ 
    String fileName = entry.getKey(); 
    List<Data> excelData = entry.getValue(); 

    // The below code constructs the workbook and returns it 
    SXSSFWorkbook workBook = getWorkBook(fileName, excelData); 
    ZipEntry zipEntry = new ZipEntry(fileName); 
    zos.putNextEntry(zipEntry); 
    workBook.write(bos); 
    bos.writeTo(zos) 

    zos.closeEntry(); // this line works perfectly in this case 
} 
zos.close(); 
byte[] bytes = bos.toByteArray(); 

//setting content-type and zip file name 
response.setContentType("application/zip"); 
response.setHeader("Content-Disposition", "attachment; filename=Templates.zip"); 
out.write(bytes); 
out.flush(); 

Ansatz 2 funktioniert gut, aber wenn ich versuche zu Zip-Datei beim Client öffnen ide, bekomme ich Fehler sagen error extracting

enter image description here

Ich bin nicht sicher, ob excel sheet beschädigt ist oder ein anderer Server Seitenstrom Problem. Wenn irgendein Körper einige hilfreiche Gedanken/Ideen hat, bitte teile mit mir.

Antwort

2

Ihr zweiter Versuch schlägt fehl, da Sie gezippten Inhalt und entpackten Inhalt mischen, indem Sie die Arbeitsmappe direkt auf dem zugrunde liegenden ByteArrayOutputStream schreiben. Daher ist die generierte Zip-Datei vermasselt.

Der erste Versuch schlägt fehl, weil workBook.write schließt die ZipOutputStream und Sie erhalten die Stream closed Ausnahme, wenn Sie den zweiten Eintrag schreiben.

Aber Sie können dieses Schließen des Streams verhindern. Erstellen Sie einen Helfer OutputStream Klasse, die nicht geschlossen werden kann:

public class NonCloseableOutputStream extends java.io.FilterOutputStream { 
    public NonCloseableOutputStream(OutputStream out) { 
     super(out); 
    } 

    @Override public void close() throws IOException { 
     flush(); 
    } 
} 

und übergeben Sie eine Instanz dieser Klasse an der Arbeitsmappe:

// The below code constructs the workbook and returns it 
SXSSFWorkbook workBook = getWorkBook(fileName, excelData); 
ZipEntry zipEntry = new ZipEntry(fileName); 
zos.putNextEntry(zipEntry); 
workBook.write(new NonCloseableOutputStream(zos)); 
zos.closeEntry(); 
+0

Ihre Lösung Woks wie ein Zauber .. dank @wero. – Uppicharla