2016-03-22 92 views
0

我目前正在使用grails開發一個web應用程序。其中一個要求是生成Excel時間表並將其下載。 這是我從grails控制器下載的代碼。Groovy/Grails文檔下載

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

但我的excel文件已損壞。我可以使用開放式辦公室打開它,但無法使用Microsoft Office或Google Drive。看起來xls文件的內容格式不正確。 如果我保存文檔而不是下載,一切正常。

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

我無法弄清楚爲什麼文件內容在以字節數組下載時被破壞。

Grails的版本 - 2.3.7 的Apache POI版本 - 提前3.13

感謝,

法碼

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

發佈您的整個控制器方法。這可能是你發佈之前/之後的事情。 –

+0

http://stackoverflow.com/questions/15387243/apache-poi-working-with-xssfworkbok-servlet-response我有它使用這種方法工作 – Vahid

+1

有幾件事你應該做的。 1.將內容長度添加到標題中,2.關閉流後關閉outputStream'response.outputStream.close()'和3.'return null',以便Grails不嘗試並呈現任何視圖。 –

回答

1

還有,你應該做的幾件事情:

首先,設置內容長度:response.setHeader("Content-Length", "${wb.bytes.length}")

其次,關閉輸出:response.outputStream.close()

最後,請確保您確定您的return null確保Grails不會嘗試呈現視圖。

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

這是否可以使用'XSSFWorkbook'而不是'HSSFWorkbook'? – lealceldeiro