Groovy / Grails文档下载

时间:2016-03-22 13:57:23

标签: excel grails apache-poi

我目前正在使用grails处理Web应用程序。其中一个要求是生成excel时间表并下载后续文件。 这是我从grails控制器下载的代码。

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

但是我的excel文件已损坏。我可以使用开放式办公室打开它,但使用微软办公室或谷歌驱动器不起作用。看起来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()
}

1 个答案:

答案 0 :(得分: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
}