2015-05-06 37 views
0

我使用apache-poi中的XSSF创建了一个xlsx文件,并创建了一个使用apache-camel返回这个文件的路径。 该文件创建好,我做了所有可能的内容设置,我发现,下载工作没有任何问题在我的本地机器(Windows)上。 将它部署到Unix服务器(在Tomcat7下)并访问该服务器的http路径后,该文件被下载但已损坏,excel不会打开它。我收到以下错误:“Excel中发现,在‘Filename.xlsx’不可读的内容是否要恢复此工作簿的内容如果您信任该工作簿的来源,单击是?。”Xlsx文件在下载时出现语法错误

在我点击是后续错误显示: “由于文件格式或文件扩展名无效,Excel无法打开'Filename.xlsx'文件。请确认文件没有被破坏,并且文件扩展名与文件。”

我使用骆驼处理器调用的处理器来创建工作簿文件,并在处理器中创建所有的内容设置,这应该不是问题,我将它们记录在处理器之外,并且都设置好了。另外一切工作,因为它应该,但只在本地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; 
} 

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

我想也许问题是由于我传递字节数组而导致的,不知何故,Unix系统正在以不同的方式解释这个问题,或者可能是文件传输分区。损坏的文件具有更大的尺寸,然后正常创建的尺寸可能包含一些额外的行,不知道这是否重要。

+0

你检查一个从Unix服务器是一样的长度的窗口之一,而不是零字节等?您还可以在两个文件(从Windows下载的文件以及从Unix服务器下载的文件)上运行二进制比较,这可能有助于缩小问题的范围。 –

+0

你可以请用“application/vnd.ms-excel”作为ContentType – Subbu

+0

我共同设计了长度(windows:4560 vs 4582 unix)。还比较了记事本++中的文件和损坏的文件包含来自好文件的所有信息,以及一些更多的东西,我猜是由unix /下载浏览器生成的..等等..没有ideea – jarod

回答

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(); 
       } 
    } 
+0

这基本上是一样的东西作为我的代码,而是在Camel Proccessor中完成的逻辑,这是通过一个servlet完成的,这意味着代替交换,我将拥有不幸的是,我不能使用servlet来实现我的实现,也不想使用它,因为我想使用camel来实现这个功能,我想说的是公共部分是类似的(在你设置内容类型和处置的地方),所以我不会看到我的代码应该从这里进行什么修改。无论如何,谢谢你的答案。 – jarod

相关问题