response.flushBuffer()在客户端以编程方式打开excel文件时给出错误

时间:2015-01-02 11:55:29

标签: java jquery excel spring-mvc apache-poi

我必须将数据从jqdrid导出到excel文件。我能够在我的javaascript代码中以字符串格式准备数据,如下所示

"1\tRamu Kaka\tShanta Ben\tN Modi\tSome clerk\tCustomer\tECP\tFunding\t80.00\tTBill\tMinus\t1,111\t\t\t01-01-1900\t01-01-1900\t\t\tSubmitted\t01-01-1900\tYes\t\t;2\tRamu Kaka\tShanta Ben\tN Modi\tSome clerk\tCustomer\tECP\tFunding\t80.00\tTBill\tMinus\t1,111\t\t\t01-01-1900\t01-01-1900\t\t\tSubmitted\t01-01-1900\tYes\t\t;....."

并且能够在我的MVC控制器中获得相同的内容,如下所示。

@RequestMapping(value = "/exportToXLS", method = RequestMethod.GET)
public ModelAndView exportToXL(@RequestParam("data") String data,
        HttpServletRequest request, HttpServletResponse response,
        Model model) throws Exception {

    response.setHeader("Cache-Control", "public");
    response.setHeader("Pragma", "public");
    response.setHeader("Expires", "0");
    response.setHeader("Content-Length", Integer.toString(data.length()));
    String dateString = dtFormat.format(new Date());
    response.setHeader("Content-Disposition","attachment;    filename=\"FileName-" +dateString+ ".xls\";");
    response.setContentType("application/vnd.ms-excel");

    Workbook workbook =  myExcelUtility.exportTasks(Arrays.asList(data.split(";")));
    workbook.write(response.getOutputStream());     

    response.flushBuffer();//<--- here

    return null;
}

在我的 myExcelUtility.exportTasks(Arrays.asList(data.split(&#34;;&#34;))); 方法中我通过填充所有的cellItem,Style来准备Workbook,价值观等。

到目前为止一切都很好。

但是当我做response.flushBuffer();时,我的应用程序的页面被导航到某个URL并说

&#34; Internet Explorer无法显示网页&#34;

URL的URL是

http://:5080 / myApp / exportToXLS?data = 1 \ tRamu Kaka \ tShanta Ben \ tN Modi \ t一些职员\ tCustomer \ tECP \ tFunding \ t80.00 \ tTBill \ tMinus \ t1,111 \ t \ t \ t01-01-1900 \ t01-01-1900 \ t \ t \ t提交\ t01-01-1900 \ tYes \ t \ t; 2 \ tRamu Kaka \ tShanta Ben \ tN Modi \ t一些职员\ tCustomer \ tECP \ tFunding \ t80.00 \ tTBill \ tMinus \ t1,111 \吨\吨\ t01-01-1900 \ t01-01-1900 \吨\吨\ tSubmitted \ t01-01-1900 \ tYes \吨\吨; .. ...

我的服务器控制台中没有错误日志。

创建工作簿时没有任何问题,因为我也尝试过使用

Workbook workbook =  new HSSFWorkbook();
workbook.write(response.getOutputStream());     
response.flushBuffer();

但这也没用。

请你帮我找出我犯错的地方和地点。

2 个答案:

答案 0 :(得分:2)

您的内容处置最后包含分号(;) 根据{{​​3}},我认为你应该改变:

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

应该是

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

此外,根据IE实例的年龄,您可能需要更改内容类型

  

古代浏览器还需要以下内容(现在不需要,但是   对于一个傻瓜式的解决方案可能值得这样做:

Content-Type header should be before Content-Disposition.
Content-Type header should refer to an unknown MIME type (at least until the older browsers go away).

这可能不再需要了,但值得尝试。如果标头是已知的mime类型,则可能导致浏览器尝试执行它。

答案 1 :(得分:0)

我可以看到的一件事是您发送了错误的内容长度。 你正在做的是发送&#34;数据的字符长度&#34;参数,绝对不是excel文件二进制大小的长度,这是Content-Length实际上应该是什么。确保你计算并发送它。

exportToXL方法的返回类型应该是无效的,因为您不会使用弹簧视图/模型。您自己编写二进制输出。