gpt4 book ai didi

java - 使用 XSSFWorkbook 和 AbstractExcelView

转载 作者:行者123 更新时间:2023-11-29 08:52:03 27 4
gpt4 key购买 nike

据我了解,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 文件。感谢您的帮助。

最佳答案

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

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<String, Object> 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<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception;

}

关于java - 使用 XSSFWorkbook 和 AbstractExcelView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22311771/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com