我目前正在使用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()
}
答案 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
}