当前位置: 首页 > 知识库问答 >
问题:

使用XSSFWorkbook和AbstractExcelView

澹台浩广
2023-03-14

我的理解是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);
}
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-我的响应contentType和header是否正确?(来源:excel文件的正确内容类型是什么?)

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文件。谢谢你的帮助。

共有1个答案

吴兴国
2023-03-14

我知道POI的.NET实现有一个写入流的方法。如果您将工作簿接口编写为Stream,并将流作为带有参数内容和头的字节数组返回,那么它应该可以工作--我在.NET MVC控制器中遇到过类似的问题,无法正确地为响应提供服务。

 类似资料: