jsp导出Excel

在开发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();

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文件。

如下几点需要说明:

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文件。在具体的应用中,可以根据实际需要来选择使用哪个方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值