由于产品升级,居然把以前extjs用的grid被替换成table了。。。郁闷。。。
但还要保留导出功能,没办法,只能研究。
开始我以为通过js可以完成这项任务,代码也查到了,但是它的导出结果是直接用excel打开此table,与预想的不一样:预想的是弹出框,询问用户是下载还是直接打开。
后来想了想,觉得js是运行在客户端的,所以要实现这个下载功能应该不太现实。。于是放弃用js,查新的方法:
最终,我的解决方法是,在action中通过一系列的处理,最终返回一个页面,而这个页面中,body里只有一个table,然后把这个文件的传输格式改变,最终达到目的。
先把用js直接在excel中把table打开的代码贴上来,也许日后会用上:
function tableToExcel() {
window.clipboardData.setData("Text",document.all('table1').outerHTML);
try
{
var ExApp = new ActiveXObject("Excel.Application")
var ExWBk = ExApp.workbooks.add()
var ExWSh = ExWBk.worksheets(1)
ExApp.DisplayAlerts = false
ExApp.visible = true
}
catch(e)
{
alert("您的电脑没有安装Microsoft Excel软件!")
return false
}
ExWBk.worksheets(1).Paste;
}
</script>
用这个时要注意两点,在有的浏览器版本上,直接运行这段代码会报automation服务器不认识对象这个错误(大概是这个,昨天晚上在家里时出现的)
解决方法:把ie的安全项中用自定义:对"未识别的activeX控件"改为启用(大概是这个吧,具体名字也忘了)
比较简单吧。。下面说说用jsp导出:
这个其实更简单,只需要在生成table的页面前,加上
<%
response.setContentType("application/msexcel;charset=GBK");
response.setHeader("Content-disposition", "attachment; filename=excelname.xls");
%>
就好了。。。
要注意两点:1.生成的excel中可能没有边框,所以要在jsp的table中,加上border="1"
2.对于中文,会有乱码。
我尝试了几种方式,最终发现把所有编码都改为gbk就可以了(其他页面都用的Utf-8)
<%@ page contentType="text/html; charset=GBK"%>
response.setContentType("application/msexcel;charset=GBK");
response.setHeader("Content-disposition", "attachment; filename=excelname.xls");
注意:下面这句话也要加上:
<meta content="text/html;charset=GBK" http-equiv="Content-Type">
之所以像上面这样做(有些麻烦),是因为最终生成的table不是一个实体类的集合,而是一个dto对象的集合。所以如果用后台再去取,再转化,有些麻烦。
Action层导出:
如果直接是某个实体类对象的集合,用下面这种方法来生成excel也是可以的。
public void exportForm(){