Excel Grails:如何在客户端发送关闭的工作簿?

Excel Grails:如何在客户端发送关闭的工作簿?,excel,grails,Excel,Grails,目前,我有一个将excel文件发送到客户端的工作代码。唯一的问题是,一旦客户端接收到文件,它就会自动打开。我正在使用org.apache作为我的工作簿。这是我的密码 private void generateErrorReport(ServletResponse response, Map message, MultipartFile file, String ext){ InputStream is = file.getInputStream(); Outpu

目前,我有一个将excel文件发送到客户端的工作代码。唯一的问题是,一旦客户端接收到文件,它就会自动打开。我正在使用org.apache作为我的工作簿。这是我的密码

 private void generateErrorReport(ServletResponse response, Map message, MultipartFile file, String ext){
        InputStream is = file.getInputStream();
        OutputStream os = response.outputStream;

        int index = file.originalFilename.lastIndexOf(".");
        String fileName = file.originalFilename.substring(0,index) + "_error." + ext

        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "Attachment;Filename=${fileName}");
        try {

            PoiTransformer transformer = PoiTransformer.createTransformer(is, os);
            org.apache.poi.ss.usermodel.Workbook workbook = transformer.getWorkbook()
            Sheet sheet = workbook.getSheetAt(workbook.getActiveSheetIndex())
            int lastColNum = sheet.getRow(0).getLastCellNum()

            Cell cell;

            cell = sheet.getRow(0).getCell(lastColNum);
            if(cell==null){
                cell = sheet.getRow(0).createCell(lastColNum);
            }
            cell.setCellType(1)
            cell.setCellValue("Message")
            cell.setCellStyle(getStyle(workbook, 2))

            for(int it=1; it<sheet.getLastRowNum(); it++) {
                if (message.get(new Long(it))!=null && message.get(new Long(it))!=[]) {
                    cell = sheet.getRow(it).getCell(lastColNum);
                    if(cell==null){
                        cell = sheet.getRow(it).createCell(lastColNum);
                    }
                    cell.setCellType(1)
                    cell.setCellValue(message.get(new Long(it)).join(', '))
                    cell.setCellStyle(getStyle(workbook, 1))
                }
            }

            sheet.autoSizeColumn(lastColNum);
            transformer.write();
        } catch (IOException ex) {
            println ex;
        } finally {
            closeStream(is);
            closeStream(os);
        }

    }
private void generateErrorReport(ServletResponse响应、映射消息、多部分文件、字符串ext){
InputStream=file.getInputStream();
OutputStream os=response.OutputStream;
int index=file.originalFilename.lastIndexOf(“.”);
字符串文件名=file.originalFilename.substring(0,索引)+“\u错误。”+ext
setContentType(“application/vnd.openxmlformats of icedocument.spreadsheetml.sheet”);
setHeader(“内容处置”、“附件;文件名=${Filename}”);
试一试{
PoiTransformer=PoiTransformer.createTransformer(is,os);
org.apache.poi.ss.usermodel.Workbook工作簿=transformer.getWorkbook()
工作表=工作簿.getSheetAt(工作簿.getActiveSheetIndex())
int lastColNum=sheet.getRow(0).getLastCellNum()
细胞;
cell=sheet.getRow(0).getCell(lastColNum);
if(单元格==null){
cell=sheet.getRow(0).createCell(lastColNum);
}
cell.setCellType(1)
cell.setCellValue(“消息”)
setCellStyle(getStyle(工作簿,2))
对于(int it=1;it根据此RFC(),浏览器应打开“保存文件”对话框,让用户选择保存文件的位置

我的建议是打开dev工具(F12,Cmd Alt I)切换到network,查看在请求excel文件时向客户端发送了哪些头文件

您可以考虑的其他事项:

  • 将mime类型(
    response.setContentType
    )设置为
    application/vnd.ms excel
  • 设置mime类型
    application/octet-stream
    。这样,您就告诉浏览器数据是二进制的,仅此而已

我尝试将mimetype设置为application/vnd.ms-excel,也设置为application/octet stream,但没有成功:(您使用的浏览器是什么?希望不是IE6:-)您是否更改了检查浏览器中的标题(使用开发者工具)?