Java 使用AbstractExcelView下载为.html文件

Java 使用AbstractExcelView下载为.html文件,java,spring,export-to-excel,Java,Spring,Export To Excel,当我在spring应用程序中使用AbstractExcelView创建和下载文件时,它将作为.html文件下载。但当我手动将其扩展名更改为.xls时,它会显示预期的结果。我的AbstractExcelView代码是: 公共类ExcelRevenueReportView扩展了AbstractExcelView{ @Override protected void buildExcelDocument(Map model, HSSFWorkbook workbook, HttpServ

当我在spring应用程序中使用AbstractExcelView创建和下载文件时,它将作为.html文件下载。但当我手动将其扩展名更改为.xls时,它会显示预期的结果。我的AbstractExcelView代码是:

公共类ExcelRevenueReportView扩展了AbstractExcelView{

@Override
protected void buildExcelDocument(Map model, HSSFWorkbook workbook,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    Map<String, String> revenueData = (Map<String, String>) model
            .get("revenueData");

    // create a wordsheet
    HSSFSheet sheet = workbook.createSheet("Revenue Report");

    HSSFRow header = sheet.createRow(0);
    header.createCell(0).setCellValue("Month");
    header.createCell(1).setCellValue("Revenue");

    int rowNum = 1;
    for (Map.Entry<String, String> entry : revenueData.entrySet()) {
        // create the row data
        HSSFRow row = sheet.createRow(rowNum++);
        row.createCell(0).setCellValue(entry.getKey());
        row.createCell(1).setCellValue(entry.getValue());

    }

}
@覆盖
受保护的无效文件(地图模型、HSSF工作簿、,
HttpServletRequest请求,HttpServletResponse响应)
抛出异常{
地图收入数据=(地图)模型
.获取(“收入数据”);
//创建一个单词表
HSSFSheet sheet=workbook.createSheet(“收入报告”);
HSSFRow表头=sheet.createRow(0);
header.createCell(0.setCellValue(“月”);
header.createCell(1.setCellValue(“收入”);
int rowNum=1;
对于(Map.Entry:revenueData.entrySet()){
//创建行数据
HSSFRow行=sheet.createRow(rowNum++);
row.createCell(0).setCellValue(entry.getKey());
row.createCell(1).setCellValue(entry.getValue());
}
}
}

上下文配置文件:dispatcher-servlet.xml是

<beans:bean name="/index.html" class="com.my.report.HomeController">    
</beans:bean>

 <beans:bean class="org.springframework.web.servlet.view.XmlViewResolver">
  <beans:property  name="location" value="/WEB-INF/spring-excel-views.xml" />
       <beans:property  name="order" value="0" />
</beans:bean>

对于HTTP和Web应用程序(无论是否为spring),有很多选择

一些想法:

1-强制显示“另存为”对话框,让用户能够根据需要保存文件(可能重命名文件及其扩展名)

这可以通过将HTTP“content type”头设置为“application/octet stream”来实现。这实际上告诉浏览器数据是未知类型的字节流。这使浏览器“理解”它将由另一个应用程序打开/处理。因此,浏览器将允许您保存文件

您只提供了buildExcelDocument视图管理器代码。虽然无法确定此方法之前或之后执行了哪些代码,但设置此HTTP头的一种方法是使用“HttpServletResponse”对象:

另一种(更丑陋的)方法是将其硬编码到XML/HTML视图中:

<meta http-equiv="Content-Type" content="application/octet-stream />
这将设置流作为您声明的文件名和扩展名正确下载

同样,这可以直接放在HTML/XML/JSP/JSF(或任何技术)本身中,但这不是最好的解决方案

我会使用“setHeader”方法,同时使用这两种方法:

// Force save-as dialog:
response.setHeader("Content-Type", "application/octet-stream");

// Set file name and extension
response.setHeader("Content-Disposition", "inline; filename=yourExcelFile.xls");
试试这个:

response.setHeader("Content-Disposition", "attachment; filename=\"yourFile.xls\"");

如前所述,我是在面向Servlet的编程中实现的,但是在spring中的AbstractExcelView中,它已经在类中定义了,不需要设置响应。当我生成spring的AbstractPdfView的pdf fule时,它会顺利进行,并作为pdf文件下载。但是当使用AbstractExcelView时,它不会发生。
// Force save-as dialog:
response.setHeader("Content-Type", "application/octet-stream");

// Set file name and extension
response.setHeader("Content-Disposition", "inline; filename=yourExcelFile.xls");
response.setHeader("Content-Disposition", "attachment; filename=\"yourFile.xls\"");