jsp导出Excel

    技术2022-05-11  54

    在开发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文件。在具体的应用中,可以根据实际需要来选择使用哪个方法。

     

     

     

    最新回复(0)