`
wgcode
  • 浏览: 578535 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Jsp中导出Excel报表

    博客分类:
  • Java
阅读更多
在开发MIS系统的过程中,客户经常会提出这样的要求:将查询结果导出为Excel文件保存下来。经常是写一次就忘一次,因此决定今天将以前的代码和遇到的问题进行一下总结,下面进入正题。
背景:本例的代码来源于我给学校开发的一个奖学金管理系统,使用者在前台设置一组查询条件之后,点击“导出”按钮即可得到Excel文件了。
目的:得到一个Excel文件,包括姓名、学号、奖项类别、所在院系、年级、学生类别、银行卡号、金额等内容项
文件:export.jsp(前台页面,指定搜索条件)、exporting.jsp(后台页面,export.jsp的action)、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();    //清除BUFFER缓冲区
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);//连接数据库并返回一个VECTOR以向量的形式存放所有的记录
           String path=context.getRealPath(targetFile);   //指定输出路径
          
 try{
                  Vector inner=null;
                  String value="";//存放在cell中的文本值
                  int num=0;//存放在cell中的数字值
Label label=null;//用于写入文本内容到工作表中去
  jxl.write.Number nmb=null;//用于写入数值到工作表中去



                OutputStream os=new FileOutputStream(path);        //创建输出流
                WritableWorkbook workbook=Workbook.createWorkbook(os);//创建工作薄
                WritableSheet worksheet=workbook.createSheet("record",0);//创建第一个工作表,name:工作表名称
               
          
                //开始写入第一行,即标题栏
                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文件。
如下几点需要说明:
1.response.reset();//清空response的buffer
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文件。在具体的应用中,可以根据实际需要来选择使用哪个方法。
分享到:
评论

相关推荐

    ireport利用jsp导出excel&pdf;报表源代码

    本人验证过的jsp代码,ireport导出pdf excel报表

    导出jsp页面为excel文档

    此文档简介了如何在java中快速生成报表,并以excel的方式打开和保存

    WEB页面导出为EXCEL表格的方法

    这个文档讲述的是利用javascript导出jsp的报表功能,导出文件为excel

    报表导出组件(导出页面内容)

    在web开发中经常需要将jsp或html页面中表格数据导出为pdf、doc、xls等格式。然而在实现这一功能用到了一些开源的组件,每实现这一功能时都需要编写大量重复性代码。由此,对该部分进行了封装,做到通用性,在有需求...

    jsp通过POI将数据从数据库导出至EXCEL

    jsp通过POI将数据从数据库导出至EXCEL,可与CSDN中资源 【jsp中使用poi导入导出Excel http://download.csdn.net/detail/guan_xiu/5978843】对比学习; 前者是使用最原始的方法jsp+jdbc+poi; 后者加入了struts处理...

    SpringMVC+jspereport,实现报表分页查看、文件(pdf、excel、word)导出,以及html展示和调用浏览器打印功能实现打印

    SpringMVC+jspereport,实现报表分页查看、文件(pdf、excel、word)导出,以及html展示和调用浏览器打印功能实现打印,报文都是采用ireport5.6.0设计

    ChinaExcel报表控件-报表软件

    ◆多种输出:支持导出Excel、PDF、图片、HTML等多种格式的文件; ◆三层结果:通过中间层,让用户不用接触数据库,管理员定义数据视图、映射等功能; ◆演示工程:支持以下开发工具的工程源代码的导出: C/S...

    锐浪报表Grid++Report5.3

    7、报表数据导出格式丰富,格式包括:Excel、RTF、PDF、图像、HTML、文本,CSV 等。 8、支持数十种一维条码,支持PDF417与QRCode这两种最常用的二维条码,条码打印精度高且易读取。 9、提供脚本编程功能,直接在报表...

    charts导出

    本资源是一个完整的项目,导入myeclipse或者eclipse可以直接访问index.jsp页面,右键点击报表可下载报表文件。

    Grid++Report5.6报表开发工具

    7、报表数据导出格式丰富,格式包括:Excel、RTF、PDF、图像、HTML、文本,CSV 等。 8、支持数十种一维条码,支持PDF417与QRCode这两种最常用的二维条码,条码打印精度高且易读取。 9、提供脚本编程功能,直接在报表...

    Grid++Report5.5报表工具

    7、报表数据导出格式丰富,格式包括:Excel、RTF、PDF、图像、HTML、文本,CSV 等。 8、支持数十种一维条码,支持PDF417与QRCode这两种最常用的二维条码,条码打印精度高且易读取。 9、提供脚本编程功能,直接在报表...

    jsp+mysql的化工通用软件介绍

    自己完成类似水晶报表的图标功能,可导出excel报表,可自动设计网上设计报表格式,克服水晶报表的缺点。样品条目,格式,计算公式全可以自动网上设计,不需要一起的编程,全自动化,源码1000块钱可以卖出。

    Grid++Report5报表工具 版本5.5.0.8

    7、报表数据导出格式丰富,格式包括:Excel、RTF、PDF、图像、HTML、文本,CSV 等。 8、支持数十种一维条码,支持PDF417与QRCode这两种最常用的二维条码,条码打印精度高且易读取。 9、提供脚本编程功能,直接在报表...

    Grid++Report6 报表开发者安装包

    7、报表数据导出格式丰富,格式包括:Excel、RTF、PDF、图像、HTML、文本,CSV 等。 8、支持数十种一维条码,支持PDF417与QRCode这两种最常用的二维条码,条码打印精度高且易读取。 9、提供脚本编程功能,直接在报表...

    348ssm-mysql-jsp 商品信息分类管理系统.zip(可运行源码+数据库文件+文档)

    本系统使用JSP语言中的SSM框架和MySQL数据库开发,为各位员工、管理人员提供了商品信息查询、进货数据修改、员工信息管理等多种功能,让员工和管理人员们不需要再通过打电话和发消息就可以进行各种信息的查看,在极...

    ChinaExcel试用延期程序

    ◆多种输出:支持导出Excel、PDF、图片、HTML等多种格式的文件; ◆三层结果:通过中间层,让用户不用接触数据库,管理员定义数据视图、映射等功能; ◆演示工程:支持以下开发工具的工程源代码的导出: C/S...

    基于SSM实现的人事和工资管理系统源码+数据库+项目使用说明文档.zip

    工资结算,工资发放,工资按月份查询,以及其余条件查询,导出工资Excel报表 【备注】 主要针对计算机相关专业的正在做毕设的学生和需要项目实战的Java学习者。 也可作为课程设计、期末大作业。包含:项目源码、...

    Grid++Report6.0

    1、在导出Excel时,能用代码设置页边距等参数 2、在运行时对外观属性的改变可以反映到Excel导出。 ★图表: 1、重新设计图表接口,让图表可视化设计与编程控制更清晰简单。 2、支持更多图表类型,如百分比柱状图、...

    Java商品信息分类管理系统SSM(Spring+SpringMVC+MyBatis).zip

    本系统使用JSP语言中的SSM框架和MySQL数据库开发,为各位员工、管理人员提供了商品信息查询、进货数据修改、员工信息管理等多种功能,让员工和管理人员们不需要再通过打电话和发消息就可以进行各种信息的查看,在极...

Global site tag (gtag.js) - Google Analytics