Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XSSFWorkbook和AbstractExcelView_Java_Spring_Apache Poi - Fatal编程技术网

Java 使用XSSFWorkbook和AbstractExcelView

Java 使用XSSFWorkbook和AbstractExcelView,java,spring,apache-poi,Java,Spring,Apache Poi,据我所知,AbstractExcelView类函数buildExcelDocument不支持XSSFWorkbook() 我试图通过实现buildExcelDocument功能来解决这个问题,如下所示: Workbook workbook = null; protected void buildExcelDocument(Map model, HSSFWorkbook wbook, HttpServletRequest request, HttpServletRes

据我所知,AbstractExcelView类函数buildExcelDocument不支持XSSFWorkbook()

我试图通过实现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函数将使用ApacheSS用户模型生成和创建excel版本、HSSFWorkbook和XSSForkbook。创建工作簿后,我会创建一个标题,提示用户保存或打开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\"");
}
使用HSSF工作簿时,上述所有代码均有效。使用Microsoft Excel 2003或Microsoft Excel 2007正确创建、下载和打开工作簿的数据

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

1-我的响应内容类型和标题是否正确?(来源:)

2-是否有任何方法可以使用Spring和AbstractExcelView创建xlsx excel文件

3-Spring是否支持XSSF工作簿

一些补充说明:

ApachePOI版本-v3.9

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

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

所有这些都会产生相同的失败结果


我使用以下链接帮助将我的旧HSSF代码转换为使用SS usermodel。我在没有Spring干扰的情况下测试了这个转换过程,并且能够成功地创建xls和xlsx文件。谢谢你的帮助。

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

请确保您正确地提供了内容类型

(“应用程序/vnd.openxmlformats of cedocument.spreadsheetml.sheet”;以与MS Office 2007 OnWord兼容的.xlsx格式生成excel


(“应用程序/vnd.ms excel”;->以.xls格式生成excel

您似乎试图将
XSSFWorkbook
分配给
HSSFWorkbook
对象,该对象永远不会工作,只需要
工作簿
。否则,如果将输出直接写入文件,Excel可以读取吗?i、 这是一个生成问题,还是一个服务问题?我可能只是想接近这一点,但我不知道我在哪里将XSSF工作簿分配给HSSF工作簿。我创建了一个名为工作簿的工作簿,并根据buildExcelDocument函数中的情况创建一个新的XSSF工作簿,并将其分配给工作簿或将工作簿设置为作为参数传入的HSSFWorkbook。然后,函数buildBothExcelDocument使用所有usermodel功能,这样它就可以处理传入的工作簿参数。很有可能我没有忽略什么。
    response.setHeader("Content-Disposition", "attachment; filename='test.xlsx'");