JSP导出Excel文档

来源:互联网 发布:网络数据 编辑:程序博客网 时间:2024/04/30 11:34

 今天晚上还真是倒霉,下午接了老师的电话要我搞定一个导出Excel文档的问题,结果搞了一个晚上,大约花了3个小时才搞定,真郁闷.于是我想到一个将这个方法完整的写出来,与大家分享.
这是基于JSP的,用了一个第三方包jxl.jar,下面我们基于这个包来完成导出.
首先写一个数据库连接类:
class dbcon{
private ResultSet rs;
private int numColumns;
public dbcon(String sql){
try{
//驱动程序名
String driverName="com.mysql.jdbc.Driver";
//数据库用户名
String userName="youraccount";
//密码
String userPasswd="youpassword";
//数据库名
String dbName="test";
String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection=DriverManager.getConnection(url);
Statement statement = connection.createStatement();
rs = statement.executeQuery(sql);
//获得数据结果集合
ResultSetMetaData rmeta = rs.getMetaData();
numColumns=rmeta.getColumnCount();
}
catch(Exception e){
System.out.println(e);
}
}
public void setRs(ResultSet rs){
this.rs=rs;
}
public ResultSet getRs(){
return rs;
}
public void setNumColumns(int numColumns){
this.numColumns=numColumns;
}
public int getNumColumns(){
return numColumns;
}
}

上面这个类完成取出数据的工作,接着我们要将数据写入到Excel中去:

public class writeExcel{

public writeExcel(OutputStream os,String sql) throws Exception {
dbcon db=new dbcon(sql);
WritableWorkbook wwb = Workbook.createWorkbook(os);
WritableSheet ws = wwb.createSheet("TestSheet1", 0);
int j=0;
Label labelC;

while(db.getRs().next()){
for(int i=0;i<=db.getNumColumns()-1;i++){
labelC = new Label(i, j, db.getRs().getString(i+1));
ws.addCell(labelC);
}
j++;
}
wwb.write();
wwb.close();
}
}
再写个mian方法测试一下:
public static void main(String[] args)throws Exception{
File f=new File("kk.xls");
f.createNewFile();
new writeExcel(new FileOutputStream(f),"select * from test where name like '%z%'");
}

到此为止都没有问题,大家不知道有没有注意到我在main方法里测试的哪个sql语句是一个模糊查询的sql语句,下面的问题与此有关.由于我帮老师做的这个系统是JSP做的,我的导出页面在一个jsp文件里,而在前一个查询页面里动态生成一个sql语句然后传给负责导出的页面,这就存在一个问题,要进行 url参数传递,但是当涉及到模糊查询时,程序就出错,后来经过仔细调试,才发现是"%"捣的鬼,"%"无法传递,到网上查了半天,终于有人提示用字符替代的方法,我试了试,终于成功了,真是累死了.
方法如下,在生成查询的页面,假定sql语句为String exportsql;用replaceall方法exportsql=exportsql.replaceall("%","999999999");在到处页面取出数据后再替换回来就行了.
还要说明的就是这里作为替代的字符也不是什么都可以的,一些特殊字符如&,^,好象也不行.