2017-10-26 2 views
1

Ich habe diesen Controller, der ein leeres Blatt erstellen und ich möchte die Excel-Datei an den Navigator zurückgeben. Das Problem ist, die Excel-Datei ist beschädigt.Spring - Download Excel mit POI

Wenn ich die Datei auf meinem Computer erstellen, ist die Datei nicht beschädigt, so dass mein HSSFWorkbook gültig ist. Scheint ein Problem der Kodierung/Einkapselung durch den Frühling Kontext hinzugefügt?

@Controller 
public class ExportController { 

@RequestMapping(value = "/export/test/excel", method = RequestMethod.POST) 
public void downloadExcelTestFile(
     HttpServletRequest request, 
     HttpServletResponse response) throws IOException { 

    HSSFWorkbook wb = new HSSFWorkbook(); 

    wb.createSheet("Sheet1"); 

    //response.reset(); 
    //response.setStatus(HttpServletResponse.SC_OK); 
    response.setContentType("application/vnd.ms-excel"); 
    response.setHeader("Content-Disposition", "attachment; filename=test.xls"); 

    OutputStream out = response.getOutputStream(); 
    wb.write(out); 

    out.flush(); 
    out.close(); 
    wb.close(); 
} 

Der Download gut starten, erhalte ich die Datei test.xls, aber ich kann es nicht öffnen. Gibt es einen Frühling Weg, um einen richtigen Download in einem @Controller zu erreichen?

Ich benutze Frühling 4.2.4

UPDATE 1

ich einen Frühling Art und Weise versucht, aber es funktioniert nicht besser

HSSFWorkbook wb = new HSSFWorkbook(); 

    wb.createSheet("Sheet1"); 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    try { 
     wb.write(bos); 
    } finally { 
     bos.close(); 
    } 

    byte[] bytes = bos.toByteArray(); 

    HttpHeaders headers = new HttpHeaders(); 

    headers.set("Content-Type", "application/vnd.ms-excel;"); 
    headers.set("content-length",Integer.toString(bytes.length)); 
    headers.set("Content-Disposition", "attachment; filename=test.xls"); 

    return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.CREATED); 

UPDATE 3

fand ich ein Grund, aber ich verstehe nicht warum.

Wenn ich meine WAR-Datei erstellen und manuell im selben Tomcat 7.0.70 bereitstellen, funktioniert es. Mein Excel ist nicht beschädigt.

Wenn ich von der Dev-Umgebung in Eclipse herunterladen, funktioniert es nicht. Scheint ein tomcat + eclipse-Problem.

+0

Sie können versuchen, eine org.springframework.core.io.FileSystemResource zurückzugeben, die eine Datei als Eingabe akzeptiert. – mrkernelpanic

Antwort

0

Ok, das war keine Frühlingsausgabe, nicht einmal ein Tomcat-Problem.

Das Problem war von meinem grunt-connect-Proxy, wenn ich meine Front throught localhost: 9000: Dateien, die ich heruntergeladen habe, waren beschädigt. Wenn ich das Projekt in einer Kriegsdatei baue oder die Front von localhost: 8080 (der selbe Port wie der Server) ohne "grunt serve" laufen lasse und so ohne den Proxy funktioniert es.

Ich habe das Problem mit Grunt nicht behoben ... Ich ignoriere es einfach, aber diese Antwort kann Ihre Zeit sparen.