一种简单方法实现页面导出(Excel)功能 选择自 xieyun1977 的 Blog

要实现页面中的table导出成Excel格式,如果用jxl的API,未免太麻烦了些,这里我介绍一下我们项目中使用的简单的导出。
    首先,介绍一下原理,Excel可以打开html文件这个大家应该都知道吧?(这个你都不知道?呵呵 )同样道理,一个只有table元素的html文件也可以在Excel中打开的,因此,我们可以利用页面中的Form的提交,把页面中的table内容提交给一个jsp或servlet,然后由jsp或servlet把提交上来的table内容转变成文件流的形式,以文件下载形式传递给客户端,由此完成导出Excel功能。
    以下是查询jsp页面部分代码:
<script>
function saveResult()
{
 var idx=document.all.userid.selectedIndex;
 if (eval(document.resultFrame.resTbl)==null)
 {
  alert("请先查询后再保存!");
  return false;
 }
 var file="日告警查询_"+document.all.datetime.value
  +"_"+document.all.userid.options[idx].text;
 document.all.name.value=file+".xls";
 
 document.all.txt.value="<style>body,table {font-family: /"宋体/";font-size: 9pt}</style>"+document.resultFrame.resTbl.innerHTML;
 warnForm.action="/downloadResult.do";
 warnForm.target="saveFrm";
 warnForm.submit();
 document.all.name.value=file;
}
</script>
<html:form action="/warnDayQuery.do" target="resultFrame" >
  <input type="hidden" name="name" value=""/>
  <input type="hidden" name="txt" value=""/>
</html:form>
...
<!--
      仅仅提供保存功能的iframe
//-->
<iframe name="saveFrm" src="" frameborder="0" scrolling="no" width="0" height="0">
</iframe> 
...
<!--
     查询结果
//-->
<iframe name="resultFrame" src="" frameborder="0" scrolling="yes" width="100%" height="500">
</iframe>

    下面是查询结果的jsp部分代码:
//关键就是这个id号,可以代表要导出的table
<span id="resTbl">
 <logic:notPresent name="dayResult" scope="session">
         查询失败!
  </logic:notPresent>
<table width="100%" height="10%" border="1" align="center" cellpadding="1" cellspacing="0"  bgcolor="#EEECF2" bordercolor="#A3B2CC">
 <logic:present name="dayResult" scope="session">
  ...
  
   下面是作为中转的下载jsp服务代码:
<%@ page
        language="java"
        contentType="text/html; charset=GBK"
        import="java.io.*,java.net.URL,java.util.*"
%>
<%
String file =null;
StringBuffer sb=null;
for (Enumeration e = request.getParameterNames(); e.hasMoreElements(); ) {
      String name = (String) e.nextElement();
      //System.out.println(" >>Name:  "+  name);
      //System.out.println(" >>>Parameter:   "+  request.getParameter(name));
      if(name.equals("name"))
       file=request.getParameter(name);
      if(name.equals("txt"))
       sb=new StringBuffer(request.getParameter(name));
  }

try {
 file = new String(file.getBytes("ISO-8859-1"), "gb2312");
}
catch (UnsupportedEncodingException e) {
 out.println("文件名解析失败!");
 return;
}

String extName = file.substring(file.lastIndexOf("."));
String contentType;
if (extName == null || extName.equals("")) contentType = "";
else if (extName.equalsIgnoreCase(".chm")) contentType = "application/msword";
else if (extName.equalsIgnoreCase(".doc")) contentType = "application/msword";
else if (extName.equalsIgnoreCase(".xls")) contentType = "application/vnd.ms-excel";
else if (extName.equalsIgnoreCase(".ppt")) contentType = "application/vnd.ms-powerpoint";
else if (extName.equalsIgnoreCase(".txt")) contentType = "text/plain";
else contentType = "application/octet-stream";

// "inline" or "attachment" (default)
/*String mode = request.getParameter("mode");
recommendedName =  request.getParameter("recommendedName");
if (mode == null || mode.length() == 0) mode = "attachment";
*/
  String recommendedName =  new String(file.getBytes(),"iso_8859_1");
  response.setContentType(contentType);
  response.setHeader("Content-Disposition", "attachment; filename=" + recommendedName + "/"");
  
  response.resetBuffer();
  ServletOutputStream sos = response.getOutputStream();
  /*
  String s = null;
  while ((s=br.readLine())!=null) {
      sos.print(s);
  }
  */
  sos.write(sb.toString().getBytes("ISO-8859-1"));
  sos.flush();
  sos.close();
%>

你也可以做成servlet形式,怎么样,这样的Excel导出是不是很简单阿?


还不是很完善,可以自己加以封装 // JavaScript Document var BoxWidth = 700// 资料表显示宽度 ( 不含卷轴 ) var ShowLine = 15// 资料表显示列数 var RsHeight = 21// 资料列高度 var LockCols = 1// 要锁定的栏位数 ( 由左至右 ) function WriteTable(){// 写入表格 var iBoxWidth=BoxWidth var NewHTML="<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td><div style=\"width:100%;overflow-x:scroll\"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>" for(i=0;i<DataTitles.length;i++){ if(i<LockCols){ var cTitle=DataTitles[i].split("#") iBoxWidth-=cTitle[1] var DynTip=((i+1)==LockCols)?"解除锁定":"锁定此栏位" NewHTML+="<td><div class=\"title\" style=\"width:"+cTitle[1]+"px;height:"+RsHeight+"px\" title=\""+DynTip+"\" onclick=\"ResetTable("+i+")\">"+cTitle[0]+"</div></td>" } } NewHTML+="</tr><tr><td colspan=\""+LockCols+"\"><div id=\"DataFrame1\" style=\"position:relative;width:100%;overflow:hidden\"><div id=\"DataGroup1\" style=\"position:relative\"></div></div></td></tr></table></div></td><td valign=\"top\"><div style=\"width:"+iBoxWidth+"px;overflow-x:scroll\"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>" for(i=0;i<DataTitles.length;i++){ if(i>=LockCols){ var cTitle=DataTitles[i].split("#") NewHTML+="<td><div class=\"title\" style=\"width:"+cTitle[1]+"px;height:"+RsHeight+"px\" title=\"锁定此栏位\" onclick=\"ResetTable("+i+")\">"+cTitle[0]+"</div></td>" } } NewHTML+="</tr><tr><td colspan=\""+(DataTitles.length-LockCols)+"\"><div id=\"DataFrame2\" style=\"position:relative;width:100%;overflow:hidden\"><div id=\"DataGroup2\" style=\"position:relative\"></div></div></td></tr></table></div></td><td valign=\"top\"><div id=\"DataFrame3\" style=\"position:relative;background:#000;overflow-y:scroll\" onscroll=\"SYNC_Roll()\"><div id=\"DataGroup3\" style=\"position:relative;width:1px;visibility:hidden\"></div></div></td></tr></table>" DataTable.innerHTML=NewHTML ApplyData() } function ApplyData(){// 写入资料 var NewHTML="<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" for(i=0;i<DataFields.length;i++){ NewHTML+="<tr>" for(j=0;j<DataTitles.length;j++){ if(j<LockCols){ var cTitle=DataTitles[j].split("#") NewHTML+="<td><div class=\"cdata\" style=\"width:"+cTitle[1]+"px;height:"+RsHeight+"px;text-align:"+cTitle[2]+"\">"+DataFields[i][j]+"</div></td>" } } NewHTML+="</tr>" } NewHTML+="</table>" DataGroup1.innerHTML=NewHTML var NewHTML="<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" for(i=0;i<DataFields.length;i++){ NewHTML+="<tr>" for(j=0;j<DataTitles.length;j++){ if(j>=LockCols){ var cTitle=DataTitles[j].split("#") NewHTML+="<td><div class=\"cdata\" style=\"width:"+cTitle[1]+"px;height:"+RsHeight+"px;text-align:"+cTitle[2]+"\">"+DataFields[i][j]+"</div></td>" } } NewHTML+="</tr>" } NewHTML+="</table>" DataGroup2.innerHTML=NewHTML DataFrame1.style.pixelHeight=RsHeight*ShowLine DataFrame2.style.pixelHeight=RsHeight*ShowLine DataFrame3.style.pixelHeight=RsHeight*ShowLine+RsHeight DataGroup3.style.pixelHeight=RsHeight*(DataFields.length+1) } function ResetTable(n){ var iBoxWidth=0 for(i=0;i<DataTitles.length;i++){ if(i<(n+1)){ var cTitle=DataTitles[i].split("#") iBoxWidth+=parseInt(cTitle[1]) } } if(iBoxWidth>BoxWidth){ var Sure=confirm("\n锁定栏位的宽度大於资料表显示的宽  \n\n度,这可能会造成版面显示不正常。\n\n\n您确定要继续吗?") }else{ Sure=true } if(Sure){ LockCols=(LockCols==n+1)?0:n+1 WriteTable() } } function SYNC_Roll(){ DataGroup1.style.posTop=-DataFrame3.scrollTop DataGroup2.style.posTop=-DataFrame3.scrollTop } window.onload=WriteTable
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值