使用jsp导出到excel汇总

设置excel的导出格式

因为ms word和excel的文档都支持html文本格式,因此可以先用word或excel做好模版,另存为Web页,然后将该html改成jsp,将数据部分动态填入即可,不用很辛苦的调整格式
 
word页面只要在jsp头设置如下指令:
<%@page contentType="application/msword;charset=GBK" %>
 
excel如下:
<%@page contentType="application/vnd.ms-excel;charset=GBK" %>

使用这种方式客户端必须安装有office软件,用户访问时将在ie中直接用word或excel打开该页面。

此方法优势是模板设计、调整方便,无需在服务器端使用复杂的POI或jxl技术,也无需在客户端使用ActiveX控件技术,更安全、方便,轻松实现较好的打印效果。

///*******************************************************************************************

试试看从网页中把表格直接生成excel,虽然不是直接从sql到excel,不过反而更加方便而且人性化。。

网上倒是找到了不少的资料,发现一段javascript的功能实现代码,很不错:
var elTable = document.getElementById("tb");
var oRangeRef = document.body.createTextRange();
oRangeRef.moveToElementText( elTable );
oRangeRef.execCommand( "Copy" );

var appExcel = new ActiveXObject( "Excel.Application" );
appExcel.Visible = true;
appExcel.Workbooks.Add().Worksheets.Item(1).Paste();
appExcel = null;

实现功能就是把id为tb的表格内的数据都生成为excel,我试试了可行,但是放到服务器来运行就是script error的提示,然后网上到处求问,也找了百度空间的几位高手朋友问了下,可是还是不得其法。。不过还是很感谢他们的热心帮助

没办法,我只能用别的方法来实现了,其实满喜欢上面的这个javascript的功能的,比较人性化。。可惜我黔驴技穷,无法用上它,哎!~

既然我帮客户用jsp写的程序,那么我就还是用jsp来实现这个功能吧。。

于是找到了这么一个方法:
原文出自:http://www.jsp.mlc.edu.tw/viewitem.jsp?itemid=0000000065

***************************************************************************************************
一、将网页资料以excel报表以线上浏览方式呈现
xls651.jsp原始码如下


<%@ page contentType="application/msexcel" %>
<!-- 以上这行设定本网页为excel格式的网页 -->
<%
   response.setHeader("Content-disposition","inline; filename=test1.xls");
   //以上这行设定传送到前端浏览器时的档名为test1.xls
   //就是靠这一行,让前端浏览器以为接收到一个excel档
%>
<html>
<head>
<title>Excel档案呈现方式</title>
</head>
<body>
  <table border="1" width="100%">
    <tr>
      <td>姓名</td><td>身份证字号</td><td>生日</td>
    </tr>
    <tr>
      <td>李玟</td><td>N111111111</td><td>1900/11/12</td>
    </tr>
    <tr>
      <td>梁静如</td><td>N222222222</td><td>1923/10/1</td>
    </tr>
    <tr>
      <td>张惠妹</td><td>N333333333</td><td>1934/12/18</td>
    </tr>
  </table>
</body>
</html>

二、将网页资料以excel报表以下载的方式呈现
这个jsp档和上一个差不多,只有差别在这一行:
线上浏览的方式: response.setHeader("Content-disposition","inline; filename=test1.xls");
下载的方式: response.setHeader("Content-disposition","attachment; filename=test2.xls");
附注: 1.以上纯以静态网页的方式呈现excel档,配合资料库,你便能以动态的报表方式做出excel报表了
2.完全不用安装任何元件,或只能受限於win平台,一个简单的方式解决你的报表需求
3.聪明的你,应该能举一反三,知道如何将网页资料以word的doc格式展现了吧!
(是不是只要把contentType改成"application/msword"以及filename的副档名改成.doc就可以了!/

1. 在 Word或Excel中制作报表的样式。 1

Excel的行高和列宽单位无法用mm或cm表示。

需要计算。在1024*768下,1CM约为38像素。

以此为基准,可计算并控制报表的行列位置。

2. 在Word中设置“表格——标题行重复”。 字串6

在Excel中设置“文件——页面设置——工作表——打印标题”。

3. 另存为网页,改后缀名“htm”为“jsp”。

4. Word报表文件头为: 字串2

<%@page contentType="application/msword;charset=GBK" language="java"%> 

Excel报表文件头为:


<% @page contentType="application/vnd.ms-excel;charset=GBK" language="java"%> 


5. 在文件头部分定义打印参数变量如下(以Excel为例):


<%


//需要打印的记录条数
int PrintRowCount=RowCount; 字串9

//每页打印的记录条数
int PageRowCount=16; 字串1

//最后一页需要打印的空行的数目
int LoopNum=PageRowCount-PrintRowCount%PageRowCount; 字串3

//打印区域的高度,其中2的意思是每页需要重复的标题行的数目
int PrintAreaHeight=(PrintRowCount%PageRowCount==0)?PrintRowCount 2:PrintRowCount LoopNum 2; 字串5

%>

/

 

jsp导出Excel

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> <script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>

在开发MIS系统的过程中,客户经常会提出这样的要求:将查询结果导出为Excel文件保存下来。经常是写一次就忘一次,因此决定今天将以前的代码和遇到的问题进行一下总结,下面进入正题。

背景:本例的代码来源于我给学校开发的一个奖学金管理系统,使用者在前台设置一组查询条件之后,点击“导出”按钮即可得到Excel文件了。

目的:得到一个Excel文件,包括姓名学号奖项类别所在院系年级学生类别银行卡号金额等内容项

文件:export.jsp(前台页面,指定搜索条件)exporting.jsp(后台页面,export.jspaction)ExportExcel.java(javabean文件,负责具体的操作)Dbase.java(javabean文件,负责数据库操作)

代码:

export.jsp此代码略去,主要是指定搜索条件

exporting.jsp

<%@ page contentType="text/html;

charset=gb2312" language="java" import="java.sql.*,DBCon.*" errorPage="" %>

<jsp:useBean id="excel" scope="request" class="DBCon.ExportExcel"/>

<jsp:useBean id="dbase" scope="request" class="DBCon.Dbase"/>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>无标题文档</title>

</head>

<%

 String user=(String)session.getAttribute("c_name");//登陆名

 String sql="";

 String colleage=request.getParameter("colleage");//export.jsp页面获得

 String type=request.getParameter("burseType");//export.jsp页面获得

 String studType=request.getParameter("studType");//export.jsp页面获得

 studType=new String(studType.getBytes("ISO8859_1"),"GBK");

 String grade=request.getParameter("studGrade");//export.jsp页面获得

 String title=request.getParameter("title");//export.jsp页面获得

 title=dbase.toChinese(title);

 //下面将得到sql语句,与本例业务逻辑相关,无需明白

 if(user.equals("ygb"))//研工部用户登陆

sql="select * from master_burse where college like '%"+colleage+"%' and code like '%"+type+"%' and grade like '%"+grade+"%' and type like '%"+studType+"%' and flag1='1'";

else//院系用户登陆

        sql="select * from master_burse where college like '%"+colleage+"%' and code like '%"+type+"%' and grade like '%"+grade+"%' and type like '%"+studType+"%'";

response.reset();

response.setContentType("application/vnd.ms-excel");

excel.export(response.getOutputStream(),sql);

//if(excel.export(sql,title,request,application))

    //out.println("<a href='"+request.getContextPath()+"/"+GetSysTime.getDay()+".xls' target='blank' >"+"下载"+title+"</a>"+"(右键单击另存为)");

//else{             

 %>

 <!-- <script language="JavaScript" type="text/javascript">

 alert("导出失败");

 history.go(-1);

 </script> -->

 <%// } %>

<body>

</body>

</html>

 

ExportExcel.java

package DBCon;

 

import DBCon.*;

import jxl.*;

import jxl.write.*;

import java.sql.*;

import java.util.*;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

 

public class ExportExcel {

      

       private Dbase dbase=null;//用于完成各种对数据库的操作

       private Vector content=null;//用于存放所要查询的记录

       private ResultSet rs=null;

      

       private String name="";//学生姓名

       private String studId="";//学号

       private String burseType="";//奖项类别

       private String grade="";//所在年级

       private String studType="";//学生类型

       private String colleage="";//所在院系

       private String card="";//银行卡号

       private int number=0;//奖金金额

       private String []title={"姓名","学号","奖项类别","所在院系","年级","学生类别","银行卡号","金额"};

       private String targetFile="";

      

       public ExportExcel(){

              dbase=new Dbase();

              content=new Vector();

                              }

   

    public boolean export(String sql,String name,HttpServletRequest request,ServletContext context){

           targetFile+="/"+GetSysTime.getTime()+".xls";

           content=getContent(sql);//以向量的形式存放所有的记录

           String path=context.getRealPath(targetFile);   

           try{

                  Vector inner=null;

                  String value="";//存放在cell中的文本值

                  int num=0;//存放在cell中的数字值

 

               OutputStream os=new FileOutputStream(path);

               WritableWorkbook workbook=Workbook.createWorkbook(os);//创建工作薄

               WritableSheet worksheet=workbook.createSheet("record",0);//创建第一个工作表,name:工作表名称

               Label label=null;//用于写入文本内容到工作表中去

               jxl.write.Number nmb=null;//用于写入数值到工作表中去

          

               //开始写入第一行,即标题栏

               for(int i=0;i<title.length;i++){

                      label=new Label(i,0,title[i]);//参数依次代表列数、行数、内容

                      worksheet.addCell(label);//写入单元格

                                                 }

               //开始写入内容

               for(int i=0;i<content.size();i++){

                      inner=(Vector)content.get(i);//获取一条记录

                      for(int j=0;j<inner.size();j++){

                             //一个一个字段的放入excel中去

                             if(j==inner.size()-1){//插入的数值

                                    Integer num_=(Integer)inner.get(j);

                                    num=num_.intValue();

                                    nmb=new jxl.write.Number(j,i+1,num);

                                    worksheet.addCell(nmb);

                                                     }

                          else{

                                 value=(String)inner.get(j);

                                 label=new Label(j,i+1,value);

                                 worksheet.addCell(label);

                                 }                      

                                                        }

                                                      }                               

                  workbook.write();

            workbook.close();

                          

              }

           catch(Exception e){

                  e.printStackTrace();

                  return false;

                                }                            

           return true;                          

                                              }

   

    public void export(OutputStream os,String sql){

           content=getContent(sql);//以向量的形式存放所有的记录

 

           try{

                  Vector inner=null;

                  String value="";//存放在cell中的文本值

                  int num=0;//存放在cell中的数字值

                 

               WritableWorkbook workbook=Workbook.createWorkbook(os);//创建工作薄

               WritableSheet worksheet=workbook.createSheet("record",0);//创建第一个工作表,name:工作表名称

               //WritableSheet worksheet=workbook.createSheet(name,0);//创建第一个工作表,name:工作表名称

          

               Label label=null;//用于写入文本内容到工作表中去

               jxl.write.Number nmb=null;//用于写入数值到工作表中去

          

               //开始写入第一行,即标题栏

               for(int i=0;i<title.length;i++){

                      label=new Label(i,0,title[i]);//参数依次代表列数、行数、内容

                      worksheet.addCell(label);//写入单元格

                                                 }

               //开始写入内容

               for(int i=0;i<content.size();i++){

                      inner=(Vector)content.get(i);//获取一条记录

                      for(int j=0;j<inner.size();j++){

                             //一个一个字段的放入excel中去

                             if(j==inner.size()-1){//插入的数值

                                    Integer num_=(Integer)inner.get(j);

                                    num=num_.intValue();

                                    nmb=new jxl.write.Number(j,i+1,num);

                                    worksheet.addCell(nmb);

                                                     }

                          else{

                                 value=(String)inner.get(j);

                                 label=new Label(j,i+1,value);

                                 worksheet.addCell(label);

                                 }                      

                                                        }

                                                      }                               

                  workbook.write();

            workbook.close();

                          

              }

           catch(Exception e){

                  e.printStackTrace();

                  //return false;

                                }                            

           //return true;                          

                                              }

                                                                       

    public Vector getContent(String sql){

           rs=dbase.executeQuery(sql);

           Vector outter=new Vector();

           try{

               while(rs.next()){

                      Vector inner=new Vector();//用于存放一条记录

                      name=dbase.getName(rs.getString("studId"));//得到学生姓名

                      studId=rs.getString("studId");//得到学号

                      burseType=dbase.getBurseName(rs.getString("code"));//得到奖学金类型

                      colleage=dbase.getCollName(rs.getString("college"));//得到所在院系

                      grade=rs.getString("grade");

                      studType=rs.getString("type");

                      card=dbase.getCard(rs.getString("studId"));//得到银行卡号

                      number=dbase.getNum(rs.getString("code"));//得到奖学金额度

                      inner.add(name);

                      inner.add(studId);

                      inner.add(burseType);

                      inner.add(colleage);

                      inner.add(grade);

                      inner.add(studType);

                      inner.add(card);

                      inner.add(number);

                      outter.add(inner);

                                   }

               }

            catch(Exception e){

                 e.printStackTrace();

                 //rs.close();

                 return null;

                                }

         return outter;                               

                                              }                           

}

 

Dbase.java此代码略去,主要执行一些通用的数据库操作,如增删改查等等。本例中用到了其executeQuery(String sql)方法,其作用就是返回一个结果集,类型为ResultSet,可以自行改写这个方法,只要返回ResultSet类型即可。

 

OK,在export.jsp页面中点击提交按钮之后IE就会弹出一个提示框,询问你是要保存

还是要打开这个Excel文件。

如下几点需要说明:

1response.reset();//清空responsebuffer

response.setContentType("application/vnd.ms-excel");//设置正确的输出类型

这两句必须要有

2.大家应该注意到ExportExcel.java中还有一个方法

export(String sql,String name,HttpServletRequest request,ServletContext context),它出现在exporting.jsp中蓝色注释部分,它的作用其实与

export(OutputStream os,String sql)差不多,只不过前者是首先在服务器上生成一个excel文件,然后在返回页面上提供一个超链接让用户来点击下载或者打开这个Excel文件,而后者则是在IE中动态生成Excel文件,在服务器上没有生成相应的Excel文件。在具体的应用中,可以根据实际需要来选择使用哪个方法。

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值