2016-03-22 12 views
0

Ich arbeite derzeit an einer Web-Anwendung mit Grails. Eine der Anforderungen besteht darin, Excel-Arbeitszeittabellen zu erstellen und sie anschließend herunterzuladen. Dies ist mein Code zum Herunterladen von Grals Controller.Groovy/Grails Dokument herunterladen

response.contentType = "application/vnd.ms-excel" 
response.setHeader("Content-Disposition","attachment;filename=name.xls") 
response.outputStream << wb.bytes 
response.outputStream.flush() 

Aber meine Excel-Datei ist beschädigt. Ich kann es mit Open Office öffnen, funktioniert aber nicht mit Microsoft Office oder Google Drive. Sieht aus wie der Inhalt der XLS-Datei nicht gut formatiert ist. Wenn ich Dokument speichern, anstatt alles herunterzuladen, ist alles in Ordnung.

FileOutputStream fileOut = new FileOutputStream("name.xls") 
wb.write(fileOut) 
fileOut.close() 

ich nicht herausgefunden, warum der Inhalt der Datei beschädigt ist, wenn sie als Byte-Array heruntergeladen.

Grails Version - 2.3.7 Apache poi Version - 3.13

Vielen Dank im Voraus,

Methode Code

def generate(){ 

    TimeSheetExportWrapper timeSheet = new TimeSheetExportWrapper() 
    bindData(timeSheet, params.ts) 

    HSSFWorkbook wb = excelExportService.createExcelTimeSheet(getCurrentTenant(), timeSheet, getCurrentTimezone()) 

    response.contentType = "application/vnd.ms-excel" 
    response.setHeader("Content-Disposition", "attachment;filename=${timeSheet.proposedFileName}") 
    response.outputStream << wb.bytes 
    response.outputStream.flush() 
} 
+0

Veröffentlichen Sie Ihre gesamte Controller-Methode. Es könnte etwas vor/nach dem sein, was du gepostet hast. –

+0

http://stackoverflow.com/questions/15387243/apache-po-a-working-with-xssfworkbok-servlet-response Ich habe es funktioniert mit dieser Methode – Vahid

+1

Es gibt ein paar Dinge, die Sie tun sollten. 1. Fügen Sie die Inhaltslänge zum Header hinzu, 2. schließen Sie den outputStream 'response.outputStream.close()' und 3. 'return null', nachdem Sie den Stream geschlossen haben, damit Grails keine Ansicht rendern kann. –

Antwort

1

Es gibt ein paar Dinge, die Sie tun sollten:

Stellen Sie zunächst die Inhaltslänge ein: response.setHeader("Content-Length", "${wb.bytes.length}")

Zweitens, schließen Sie die Ausgabe: response.outputStream.close()

Und schließlich, stellen Sie sicher, Sie return null um sicherzustellen, Grails versucht nicht, eine Ansicht zu rendern.

def generate(){ 

    TimeSheetExportWrapper timeSheet = new TimeSheetExportWrapper() 
    bindData(timeSheet, params.ts) 

    HSSFWorkbook wb = excelExportService.createExcelTimeSheet(getCurrentTenant(), timeSheet, getCurrentTimezone()) 

    response.contentType = "application/vnd.ms-excel" 
    response.setHeader("Content-Length", "${wb.bytes.length}") 
    response.setHeader("Content-Disposition", "attachment;filename=${timeSheet.proposedFileName}") 
    response.outputStream << wb.bytes 
    response.outputStream.flush() 
    response.outputStream.close() 
    return null 
} 
+0

Funktioniert das auch mit 'XSSFWorkbook' anstelle von' HSSFWorkbook'? – lealceldeiro

Verwandte Themen