2015-05-06 49 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

相關問題