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文件。在具體的應用中,可以根據實際需要來選擇使用哪個方法。

 

 

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/CMTobby/archive/2007/02/12/1508647.aspx

發佈了29 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章