下载时Xlsx文件已损坏

时间:2015-05-06 08:55:04

标签: java unix download apache-camel apache-poi

我使用apache-poi中的XSSF创建了一个xlsx文件,并创建了一个使用apache-camel返回此文件的路由。 文件创建正常,我做了我发现的所有可能的内容设置,下载工作没有任何问题在我的本地机器(Windows)。 将它部署到Unix服务器(在Tomcat7下)并从该服务器访问http路径后,文件被下载但是已损坏,excel不会打开它。我收到以下错误:

  

" Excel在' Filename.xlsx'中找到了不可读的内容。你想恢复这个工作簿的内容吗?如果您信任此工作簿的来源,请单击“是”。"点击是后跟着错误显示:   " Excel无法打开文件' Filename.xlsx'因为文件格式或文件扩展名无效。验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。"

我正在使用从camel调用的处理器来创建Workbook文件,并在处理器中创建所有内容设置,这应该不是问题,我将它们记录在处理器之外并且全部都已设置。一切都按预期工作,但仅限于本地PC。 注意:我有相同版本的Java / apache-camel / poi / tomcat等等..就像服务器一样。

一些代码段:

    XSSFWorkbook xlsx = writeToExcel(list);

    ByteArrayOutputStream bos = getByteFormat(exchange, xlsx);

    exchange.getIn().setHeader("Content-Disposition",
            "attachment; filename=ProductExports.xlsx");
    exchange.getIn().setHeader(Exchange.CONTENT_TYPE,"application/vnd.openxml");
    exchange.getIn().setHeader(Exchange.CONTENT_LENGTH,bos.toByteArray().length);
    exchange.getIn().setHeader("Expires","0");
    exchange.getIn().setBody(bos.toByteArray());

getByteFormat()部分:

    private ByteArrayOutputStream getByteFormat(Exchange exchange,
        XSSFWorkbook xlsx) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try {
        xlsx.write(bos);
    } finally {
        bos.close();
    }
    return bos;
}

我四处寻找,但没有找到任何骆驼痘的例子,人们遇到了同样的问题。 注意:我也尝试使用HSSF格式,并且使用不同的CONTENT_TYPE设置,结果是相同的。

我想问题可能是因为我传递了字节数组而导致Unix系统以不同的方式解释这个问题,或者可能是文件传输分区。损坏的文件比正常创建的文件更大,可能包含一些额外的行,不确定这是否重要。

1 个答案:

答案 0 :(得分:0)

下面的代码在Windows和Unix下运行良好。希望这对你有所帮助。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              OutputStream outStream = null;
              try {
                   response.setContentType("application/vnd.ms-excel");
                   response.setHeader
                     ("Content-Disposition", "attachment; filename=Sample.xlsx");

                   outStream = response.getOutputStream();
                   Workbook wb = new XSSFWorkbook();
                   XSSFSheet sheet = wb.createSheet(sheetName) ;

                //iterating r number of rows
                for (int r=0;r < 5; r++ )
                {
                    XSSFRow row = sheet.createRow(r);

                    //iterating c number of columns
                    for (int c=0;c < 5; c++ )
                    {
                        XSSFCell cell = row.createCell(c);

                        cell.setCellValue("Cell "+r+" "+c);
                    }
                }
                wb.write(outStream);
                outStream.close();
            } 
              catch (Exception e){
               throw new ServletException("Exception in Excel Sample Servlet", e);
              } 
              finally{
               if (outStream != null)
                   outStream.close();
              }
    }