使用XSSFWorkbook和AbstractExcelView

19 浏览
0 Comments

使用XSSFWorkbook和AbstractExcelView

据我所知,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 usermodel生成和创建两个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-我的响应contentType和头正确吗? (来源: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 文件。感谢帮助。

admin 更改状态以发布 2023年5月25日
0
0 Comments

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

0
0 Comments

您可以创建自定义的AbstractExcelView并从该类扩展您的视图。请参见下面的示例代码。

import java.io.ByteArrayOutputStream;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.servlet.view.AbstractView;
public abstract class CustomAbstractExcelView extends AbstractView {
    @Override
    protected boolean generatesDownloadContent() {
        return true;
    }
    @Override
    protected final void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        final ByteArrayOutputStream baos = createTemporaryOutputStream();
        final Workbook workbook = new XSSFWorkbook();
        this.buildExcelDocument(model, workbook, request, response);
        workbook.write(baos);
        this.writeToResponse(response, baos);
    }
    protected abstract void buildExcelDocument(Map model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception;
}

0