response.flushBuffer()给我一个错误,同时在客户端以编程方式打开excel文件

我必须从我的jqdrid导出数据到Excel文件。 我能够在下面的javaascript代码中以string格式准备数据

"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(“;”))); 方法我正在通过填充所有cellItem,Style,值等准备工作簿

在这里,事情没有问题。

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

“Internet Explorer无法显示该网页”

有url的地方,它是

http://:5080 / myApp / exportToXLS?data = 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 \ t提交\ t01-01-1900 \ tYes \ t \ t; 2 \ tRamu Kaka \ tShanta Ben \ tN Modi \ tSome clerk \ tCustomer \ tECP \ tFunding \ t80 0.00 \ tTBill \ tMinus \ t1,111 \吨\吨\ t01-01-1900 \ t01-01-1900 \吨\吨\ tSubmitted \ t01-01-1900 \ tYes \吨\吨; …..

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

在创buildWorkbook的时候,我也尝试过了

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

但这也是没用的。

你能帮我找出我犯了什么错误吗?

你的内容处置在最后根据这个链接包含一个分号(;)我想你应该改变:

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

它应该是

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

也取决于IE的实例的年龄,您可能需要更改内容types

古代的浏览器也需要以下(现在不需要,但是对于一个傻瓜式的解决scheme来说可能是值得的):

 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). 

这可能不再需要,但值得一试。 如果头是一个已知的MIMEtypes,可能会导致浏览器尝试执行它。

我能看到的一件事是你发送了错误的Content-Length。 你正在做的是发送“数据”参数的字符长度,这绝对不是Excel文件二进制大小的长度,这是Content-Length实际上应该是什么。 确保你计算并发送。

exportToXL方法的返回types应该是void,因为你不打算使用spring view / model。 你正在编写二进制输出。