我必须将数据从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();
但这也没用。
请你帮我找出我犯错的地方和地点。
答案 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方法的返回类型应该是无效的,因为您不会使用弹簧视图/模型。您自己编写二进制输出。