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。 你正在编写二进制输出。