当我在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());
}
}
}
上下文配置文件: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>
答案 0 :(得分:3)
对于HTTP和Web应用程序(无论是否为春季),有很多选择。
一些想法:
1 - 强制显示“另存为”对话框,让用户可以根据需要保存文件(可能会重命名它们及其扩展名)。
这可以通过将HTTP“content-type”标头设置为“application / octet-stream”来实现。这实际上告诉浏览器数据是未知类型的字节流。这使得浏览器“理解”它将由另一个应用程序打开/处理。因此,浏览器允许您保存文件。
您只提供了buildExcelDocument视图管理器代码。虽然人们无法真正说出之前或之后执行的代码,但设置此HTTP头的一种方法是使用“HttpServletResponse”对象:
response.setHeader("Content-Type", "application/octet-stream");
另一种(丑陋的)方法是将其硬编码到XML / HTML视图中:
<meta http-equiv="Content-Type" content="application/octet-stream />
如果您的系统有一个唯一目的是下载文件的页面,这可能会很好用。如果您从块中构建视图,并且如果只有一个主http页面,则强制元标记会混淆其他视图。
2 - 您也可以通过强制给定文件名来设置扩展名。
您可以像第一个建议一样完成它:通过设置特定的内容处置HTTP标头:
// Set file name and extension
response.setHeader("Content-Disposition", "inline; filename=yourExcelFile.xls");
这将设置正确下载的流作为您声明的文件名和扩展名。
同样,这可以直接放在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");
答案 1 :(得分:1)
试试这个:
response.setHeader("Content-Disposition", "attachment; filename=\"yourFile.xls\"");