3

When i create and download file using AbstractExcelView in spring application, it will download as .html file.But when i change its extension as .xls manually ,it shows expected result. My code for AbstractExcelView is :

public class ExcelRevenueReportView extends 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());

    }

}

}

The context configuration file :dispatcher-servlet.xml is

<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>
4

2 回答 2

3

当涉及到 HTTP 和 Web 应用程序(spring 与否)时,有很多选择。

一些想法:

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 - 您还可以通过强制给定文件名来设置扩展名。

您可以通过与第一个建议相同的方式完成它:通过设置特定的 content-disposition 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");
于 2012-06-11T18:20:33.490 回答
1

尝试这个:

response.setHeader("Content-Disposition", "attachment; filename=\"yourFile.xls\"");
于 2013-06-10T07:25:00.510 回答