使用XSSFWorkbook和AbstractExcelView

时间:2014-03-10 21:33:00

标签: java spring apache-poi

据我所知,AbstractExcelView类函数buildExcelDocument不支持XSSFWorkbook(https://jira.spring.io/browse/SPR-6898)。

我试图通过实现buildExcelDocument函数来解决这个问题,如下所示:

Workbook workbook = null;
protected void buildExcelDocument(Map model, 
    HSSFWorkbook wbook, 
    HttpServletRequest request, 
    HttpServletResponse response) throws Exception {
       if(request.getRequestURL().toString().contains("xlsx")){
          workbook = new XSSFWorkbook();
          workbook.createSheet();
          excelVersion = "xlsx"; //Used to determine response
       }else{
          workbook = wbook;
       }
       buildBothExcelDocument(model,workbook,request,response);
}

这里,我的buildBothExcelDocument函数将使用Apache SS用户模型来生成和创建excel版本,HSSFWorkbook和XSSFWorkbook。创建工作簿后,我创建一个标题,提示用户保存或打开excel文件:

if(excelVersion.equals("xlsx")){
   response.setHeader("Pragma", "public");
   response.setHeader("Cache-Control", "max-age=0");
   response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
   response.setHeader("Content-Disposition", "attachment; filename=test.xlsx");
}else{
   response.setHeader("Pragma", "public");
   response.setHeader("Cache-Control", "max-age=0");
   response.setContentType("application/vnd.ms-excel");
   response.setHeader("Content-Disposition", "attachment; filename=\"test.xls\"");
}

使用HSSFWorkbook时,所有上述代码均有效。工作簿的数据可以正确创建,可以下载,并可以使用Microsoft Excel 2003或Microsoft Excel 2007正确打开。

当我尝试创建.xlsx文件时,我在打开时收到错误“Excel无法打开文件'test.xlsx',因为文件格式或文件扩展名无效。验证文件是否已损坏并且文件扩展名与文件格式匹配“。这让我相信Spring的某个地方损坏了我的文件。我的问题是:

1 - 我的回复内容类型和标题是否正确? (来源:What is correct content-type for excel files?

2 - 有没有办法使用Spring和AbstractExcelView创建xlsx excel文件?

3 - Spring是否支持XSSFWorkbook?

一些补充说明:

Apache POI版本 - v3.9

我在创建标题时尝试了以下操作:

    response.setHeader("Content-Disposition", "attachment; filename=\"test.xlsx\"");

    response.setHeader("Content-Disposition", "attachment; filename='test.xlsx'");

所有产生相同的失败结果。

我使用以下链接来帮助转换旧的HSSF代码以使用SS用户模型http://poi.apache.org/spreadsheet/converting.html。我在没有Spring干扰的情况下测试了这个转换过程,并且能够成功创建xls和xlsx文件。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我知道POI的.Net实现有一种写入流的方法。如果您将工作簿界面编写为Stream,并将流作为带有参数内容和标题的字节数组返回,它应该可以工作 - 我在.Net MVC控制器中有一个类似的问题没有正确地提供响应。

答案 1 :(得分:0)

请确保您已正确提供内容类型,

("的应用/ vnd.openxmlformats-officedocument.spreadsheetml.sheet &#34);以 .xlsx 格式生成excel,该格式与MS Office 2007 onwords兼容

(" application / vnd.ms-excel "); - >以 .xls 格式生成excel