<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    與Java相伴的日子
    相識(shí),相知,相戀,到相守......我的日子因你的到來(lái)而充實(shí),我的日子因你的存在而多姿!
    posts - 4,comments - 31,trackbacks - 0
      我做過(guò)的一個(gè)項(xiàng)目,需要實(shí)現(xiàn)在線實(shí)時(shí)生成 Excel文件供客戶端下載的需求,最初考慮的是先在服務(wù)器端生成真實(shí)的文件,然后在客戶端下載該文件。后來(lái)發(fā)現(xiàn)這樣做不但性能不夠好、速度較慢,而且還要占用服務(wù)器空間。所以采取了在服務(wù)器端生成文件輸出流(ServletOutputStream),通過(guò)HttpServletResponse對(duì)象設(shè)置相應(yīng)的響應(yīng)頭,然后將此輸出流傳往客戶端的方法實(shí)現(xiàn)。在實(shí)現(xiàn)過(guò)程中,用到了Apache組織的Jakarta開(kāi)源組件POI,讀者朋友可到其官方網(wǎng)站查閱相關(guān)資料及下載?,F(xiàn)將整個(gè)實(shí)現(xiàn)過(guò)程介紹如下:

    ?????????一、首先,根據(jù)Excel表的特點(diǎn),我編寫了一個(gè)Excel表模型類ExcelModel,代碼如下:

    package?com.qnjian.myprj.excel;

    import?java.util.ArrayList;

    /**
    ?*
    ?*?<p>Title:?ExcelModel</p>
    ?*
    ?*?<p>Description:?Excel表的操作模型</p>
    ?*
    ?*?<p>Copyright:?Copyright?(c)?2005-10-20</p>
    ?*
    ?*?<p>Company:?***?</p>
    ?*
    ?*?
    @author?zzj
    ?*?
    @version?1.0
    ?
    */


    public?class?ExcelModel?{
    ??????
    /**
    ???????*?文件路徑,這里是包含文件名的路徑
    ???????
    */

    ??????
    protected?String?path;
    ??????
    /**
    ???????*?工作表名
    ???????
    */

    ??????
    protected?String?sheetName;
    ??????
    /**
    ???????*?表內(nèi)數(shù)據(jù),保存在二維的ArrayList對(duì)象中
    ???????
    */

    ??????
    protected?ArrayList?data;
    ??????
    /**
    ???????*?數(shù)據(jù)表的標(biāo)題內(nèi)容
    ???????
    */

    ??????
    protected?ArrayList?header;
    ??????
    /**
    ???????*?用于設(shè)置列寬的整型數(shù)組
    ???????*?這個(gè)方法在程序中暫未用到
    ???????*?適用于固定列數(shù)的表格
    ???????
    */

    ??????
    protected?int[]?width;

    ??????
    public?ExcelModel()?{
    ????????????path
    ="report.xls";
    ??????}


    ??????
    public?ExcelModel(String?path)?{
    ???????????
    this.path=path;
    ?????}



    ??????
    public?void?setPath(String?path){
    ???????????
    this.path=path;
    ??????}


    ??????
    public?String?getPath(){
    ????????????
    return?this.path;
    ??????}

    ??????
    ??????
    public?void?setSheetName(String?sheetName){
    ??????????
    this.sheetName=sheetName;
    ??????}

    ??????
    ??????
    public?String?getSheetName(){
    ??????????
    return?this.sheetName;
    ??????}


    ??????
    public?void?setData(ArrayList?data){
    ????????????
    this.data=data;
    ??????}


    ??????
    public?ArrayList?getData(){
    ????????????
    return?this.data;
    ??????}


    ??????
    public?void?setHeader(ArrayList?header){
    ????????????
    this.header=header;
    ??????}


    ??????
    public?ArrayList?getHeader(){
    ????????????
    return?this.header;
    ??????}


    ??????
    public?void?setWidth(int[]?width){
    ????????????
    this.width=width;
    ??????}


    ??????
    public?int[]?getWidth(){
    ????????????
    return?this.width;
    ??????}

    }

    ??????
      二、編寫一個(gè)下載接口ExcelDownLoad,定義基本的方法:

    package?com.qnjian.myprj.excel;

    import?java.io.IOException;
    import?java.util.List;

    import?javax.servlet.http.HttpServletResponse;

    import?org.apache.struts.action.ActionForm;


    public?interface?ExcelDownLoad?{
    ????
    ????
    /**
    ?????*?初始化要生成的Excel的表模型
    ?????*?
    @param?list?List 填充了?Excel表格數(shù)據(jù)的集合
    ?????*?
    @param?form?ActionForm及其子類
    ?????*?
    @param?excel?ExcelModel?Excel表的對(duì)象模型
    ?????*?
    @see?ExcelModel
    ?????*?
    @throws?Exception
    ?????
    */

    ????
    public?ExcelModel?createDownLoadExcel?(List?list,?ActionForm?form,?
    ????????????ExcelModel?excel)
    throws?Exception;
    ????
    ????
    /**
    ?????*?在已文件已存在的情況下,采用讀取文件流的方式實(shí)現(xiàn)左鍵點(diǎn)擊下載功能,
    ?????*?本系統(tǒng)沒(méi)有采取這個(gè)方法,而是直接將數(shù)據(jù)傳往輸出流,效率更高。
    ?????*?
    @param?inPutFileName?讀出的文件名
    ?????*?
    @param?outPutFileName 保存的文件名
    ?????*?
    @param?HttpServletResponse ????
    ?????*?
    @see?HttpServletResponse
    ?????*?
    @throws?IOException
    ?????
    */

    ????
    public?void?downLoad(String?inPutFileName,?String?outPutFileName,
    ????????????HttpServletResponse?response)?
    throws?IOException?;
    ????
    ????
    /**
    ?????*?在已文件不存在的情況下,采用生成輸出流的方式實(shí)現(xiàn)左鍵點(diǎn)擊下載功能。
    ?????*?
    @param?outPutFileName 保存的文件名
    ?????*?
    @param?out?ServletOutputStream對(duì)象????
    ?????*?
    @param?downExcel?填充了數(shù)據(jù)的ExcelModel
    ?????*?
    @param?HttpServletResponse ????
    ?????*?
    @see?HttpServletResponse
    ?????*?
    @throws?Exception
    ?????
    */

    ????
    public?void?downLoad(String?outPutFileName,?ExcelModel?downExcel,
    ????????????HttpServletResponse?response)?
    throws?Exception?;

    }



    ?????????三、編寫一個(gè)實(shí)現(xiàn)了以上接口的公共基類BaseExcelDownLoad,并提供downLoad()方法的公共實(shí)現(xiàn),代碼如下:

    /**
    ?*
    ?*?<p>Title:?BaseExcelDownLoad</p>
    ?*
    ?*?<p>Description:Excel表下載操作基類,生成excel格式的文件流供下載?</p>
    ?*
    ?*?<p>Copyright:?Copyright?(c)?2005-10-27</p>
    ?*
    ?*?<p>Company:?***?</p>
    ?*
    ?*?
    @author?zzj
    ?*?
    @version?1.0
    ?
    */

    package?com.qnjian.myprj.excel;

    import?java.io.FileInputStream;
    import?java.io.IOException;
    import?java.io.InputStream;
    import?java.io.OutputStream;
    import?java.util.List;

    import?javax.servlet.http.HttpServletResponse;
    import?org.apache.struts.action.ActionForm;


    public?abstract?class?BaseExcelDownLoad?implements?ExcelDownLoad{
    ????
    ????
    ?????
    /**
    ?????*?初始化要生成的Excel的表模型
    ?????*?
    @param?list?List 填充了?Excel表格數(shù)據(jù)的集合
    ?????*?
    @param?form?ActionForm及其子類
    ?????*?
    @param?excel?ExcelModel?Excel表的對(duì)象模型
    ?????*?
    @see?ExcelModel
    ?????*?
    @throws?Exception
    ?????
    */

    ????
    public?abstract?ExcelModel?createDownLoadExcel?(List?list,?ActionForm?form,?
    ????????????ExcelModel?excel)
    throws?Exception;
    ????
    ????
    /**
    ?????*?在已文件已存在的情況下,采用讀取文件流的方式實(shí)現(xiàn)左鍵點(diǎn)擊下載功能,
    ?????*?本系統(tǒng)沒(méi)有采取這個(gè)方法,而是直接將數(shù)據(jù)傳往輸出流,效率更高。
    ?????*?
    @param?inPutFileName?讀出的文件名
    ?????*?
    @param?outPutFileName 保存的文件名
    ?????*?
    @param?HttpServletResponse ????
    ?????*?
    @see?HttpServletResponse
    ?????*?
    @throws?IOException
    ?????
    */

    ????
    public?void?downLoad(String?inPutFileName,?String?outPutFileName,
    ????????????HttpServletResponse?response)?
    throws?IOException?{????????
    ????????
    ???????
    //打開(kāi)指定文件的流信息
    ????????InputStream?is?=?new?FileInputStream(inPutFileName);
    ????????
    //寫出流信息
    ?????????int?data?=?-1;
    ?????????OutputStream?outputstream?
    =?response.getOutputStream();
    ?????????
    ????????
    //清空輸出流
    ???????????response.reset();?????????????
    ?????????
    //設(shè)置響應(yīng)頭和下載保存的文件名??????????????
    ?????????response.setHeader("content-disposition","attachment;filename="+outPutFileName);
    ?????????
    //定義輸出類型
    ?????????response.setContentType("APPLICATION/msexcel");
    ?????????
    ????????
    while?(?(data?=?is.read())?!=?-1)outputstream.write(data);
    ????????is.close();
    ????????outputstream.close();
    ????????response.flushBuffer();????

    ????}

    ????
    ????
    /**
    ?????*?在文件不存在的情況下,采用生成輸出流的方式實(shí)現(xiàn)左鍵點(diǎn)擊下載功能。
    ?????*?
    @param?outPutFileName 保存的文件名
    ?????*?
    @param?out?ServletOutputStream對(duì)象????
    ?????*?
    @param?downExcel?填充了數(shù)據(jù)的ExcelModel
    ?????*?
    @param?HttpServletResponse ????
    ?????*?
    @see?HttpServletResponse
    ?????*?
    @throws?Exception
    ?????
    */

    ????
    public?void?downLoad(String?outPutFileName,?ExcelModel?downExcel,
    ????????????HttpServletResponse?response)?
    throws?Exception?{
    ???????
    ????????
    //取得輸出流
    ????????OutputStream?out?=?response.getOutputStream();
    ????????
    //清空輸出流
    ????????response.reset();
    ????????
    ????????
    //設(shè)置響應(yīng)頭和下載保存的文件名??????????????
    ????????response.setHeader("content-disposition","attachment;filename="+outPutFileName);
    ????????
    //定義輸出類型
    ????????response.setContentType("APPLICATION/msexcel");???????
    ??
    ????????
    ????????ExcelOperator?op?
    =?new?ExcelOperator();
    ????????
    //out:傳入的輸出流
    ????????op.WriteExcel(?downExcel,out);
    ????????out.close();
    ????????
    ????????
    //這一行非常關(guān)鍵,否則在實(shí)際中有可能出現(xiàn)莫名其妙的問(wèn)題?。。?/span>
    ???????response.flushBuffer();//強(qiáng)行將響應(yīng)緩存中的內(nèi)容發(fā)送到目的地??????????????????????????????
    ????
    ???
    ?????}


    }


      請(qǐng)注意,BaseExcelDownLoad只是提供了一個(gè)生成下載文件流的公共方法,而Excel表格需要顯示的數(shù)據(jù)內(nèi)容則因具體業(yè)務(wù)與需求的不同而不同,因此,必須根據(jù)具體情況提供一個(gè)該類的繼承類,實(shí)現(xiàn)createDownLoadExcel()方法,以生成所需要輸出內(nèi)容的Excel表格文件流。要說(shuō)明的是,該方法的參數(shù)list ,實(shí)際上是一個(gè)ArrayList集合,我們將從數(shù)據(jù)庫(kù)查詢出來(lái)的記錄集保存在其中,我想這是很容易做到的,實(shí)現(xiàn)的方式也可以各種各樣。我項(xiàng)目中是通過(guò)Hibernate的Query對(duì)象取得查詢結(jié)果集,它正好也是一個(gè)ArrayList。不同的客戶,甚至不同功能模塊內(nèi)需要生成的Excel報(bào)表的內(nèi)容都是不一樣的。下面還是給出我的一個(gè)實(shí)現(xiàn)類作為例子吧。


      四、實(shí)現(xiàn)按照具體的需求生成Excel表格文件流的類舉例:繼承自BaseExcelDownLoad類的AgentInfoExcelDownLoad:

    package?com.qnjian.myprj.excel;

    import?java.math.BigDecimal;
    import?java.util.ArrayList;
    import?java.util.Iterator;
    import?java.util.List;

    import?org.apache.struts.action.ActionForm;

    import?com.netease.bid.cs.model.BidAgent;
    import?com.netease.bid.cs.model.BidUser;
    import?com.netease.bid.cs.util.DateUtil;
    import?com.netease.bidding.cs.servlet.InitCsServlet;
    import?com.netease.bidding.cs.vo.InstructUser;

    public?class?AgentInfoExcelDownLoad?extends?BaseExcelDownLoad?{

    ????
    public?ExcelModel?createDownLoadExcel(List?list,?ActionForm?form,
    ????????????ExcelModel?excel)?
    throws?Exception?{
    ????????
    ????????String?titleStr?
    =?"客戶帳號(hào);公司名稱;所屬地區(qū);帳戶余額;注冊(cè)日期;聯(lián)系方式;聯(lián)系人;";
    ????
    ????????ArrayList?data?
    =?new?ArrayList();????????
    ????????
    ????????Iterator?ir?
    =?list.iterator();
    ????????
    while(ir.hasNext()){
    ????????????
    ????????????ArrayList?rowData?
    =?new?ArrayList();
    ????????????
    ????????????BidAgent?user?
    =?(BidAgent)ir.next();
    ????????
    ????????????rowData.add(user.getName());
    ????????????rowData.add(user.getCorpName());????????????
    ????????
    ????????????
    //取得所在省名稱
    ????????????String?provStr?=?(user.getProvince()==null?)???
    ????????????????????
    ""?:?InitCsServlet.getProvinceStr(
    ????????????????????user.getProvince());
    ????????????
    ????????????
    //取得所在地區(qū)名稱
    ?????????????String?cityStr?=?(user.getCity()==null)??
    ?????????????????????
    ""?:?InitCsServlet.getCityStr(
    ???????????????????user.getCity());
    ????????????
    if(provStr.equals(cityStr)){
    ????????????????cityStr?
    =?"";
    ????????????}

    ????????????rowData.add(provStr
    +"?"+cityStr);
    ????????????
    ????????????????????????BigDecimal?balance?
    =user.getReturnBalance().add(user.getBalance());
    ????????????rowData.add(balance);????????????
    ????????????
    ????????????String?date?
    =?DateUtil.getFormatDate(user.getCreateTime(),"yyyy-MM-dd");
    ????????????rowData.add(date);????????
    ????
    ????????????rowData.add(user.getPhone());
    ????????????rowData.add(user.getLinkMan());

    ????????????data.add(rowData);????????
    ????????????
    ????????}

    ????????
    ????
    ????????String[]?titles?
    =?titleStr.split(";");
    ????????
    ????????
    /*for(int?i=0;i<titles.length;i++){
    ????????????System.out.print(titles[i]+"?");
    ????????}
    */

    ????????
    ????????ArrayList?header?
    =?new?ArrayList();
    ????????
    for?(int?i=0;i<titles.length;i++){
    ????????????header.add(titles[i]);
    ????????}

    ????????
    ????????
    //設(shè)置報(bào)表標(biāo)題
    ????????excel.setHeader(header);
    ????????
    //設(shè)置報(bào)表內(nèi)容
    ????????excel.setData(data);
    ????????
    return?excel;
    ????}


    }


    ????????五、編寫一個(gè)操作類,進(jìn)行生成下載文件流的操作:

    /**
    ?*
    ?*?<p>Title:?Excel表操作</p>
    ?*
    ?*?<p>Description:用于生成Excel格式文件?</p>
    ?*
    ?*?<p>Copyright:?Copyright?(c)?2005-10-20</p>
    ?*
    ?*?<p>Company:?***?</p>
    ?*
    ?*?
    @author?zzj
    ?*?
    @version?1.0
    ?
    */


    package?com.qnjian.myprj.excel;

    import?org.apache.poi.hssf.usermodel.*;
    import?java.io.FileOutputStream;
    import?java.io.BufferedOutputStream;
    import?java.util.ArrayList;
    import?java.math.BigDecimal;
    import?java.io.OutputStream;


    /**
    ?*實(shí)現(xiàn)生成Excel文件的操作
    ?
    */

    public?class?ExcelOperator{
    ????
    ??????
    /**
    ???????*?將數(shù)據(jù)信息寫入到Excel表文件,采取自建輸出流的方式。
    ???????*?
    @param?excel?ExcelModel?Excel表的模型對(duì)象????
    ???????*?
    @throws?Exception
    ???????
    */

    ?????
    public??void?WriteExcel(ExcelModel?excel)throws?Exception{?????????

    ??????
    try{??
    ????????
    ???????String?file?
    =?excel.getPath();
    ???????
    ???????
    //新建一輸出文件流
    ???????FileOutputStream?fOut?=?new?FileOutputStream(file);
    ???????BufferedOutputStream?bf?
    =new?BufferedOutputStream(fOut);
    ????????
    ????????HSSFWorkbook?workbook?
    =this.getInitWorkbook(excel);
    ????????
    ????????
    //?把相應(yīng)的Excel?工作簿存盤
    ????????workbook.write(fOut);
    ????????fOut.flush();
    ????????bf.flush();
    ????????
    //?操作結(jié)束,關(guān)閉文件?
    ????????bf.close();
    ????????fOut.close();
    ???????
    //?System.out.println("Done!");
    ??????}
    catch(Exception?e){
    ????????
    //System.out.print("Failed!");
    ??????????throw?new?Exception(e.getMessage());
    ?????????}

    ??????
    ?????}

    ?????
    ?????
    ?????
    /**
    ??????*?將數(shù)據(jù)信息寫入到Excel表文件?,采取傳入輸出流的方式。
    ??????*?
    @param?excel?Excel表的模型對(duì)象?
    ??????*?
    @param?out??OutputStream?輸出流
    ??????*?
    @throws?Exception
    ??????
    */

    ?????
    public??void?WriteExcel(ExcelModel?excel,OutputStream?out)throws?Exception{
    ?????????
    try{
    ?????????????HSSFWorkbook?workbook?
    =this.getInitWorkbook(excel);
    ?????????????workbook.write(out);??????????
    ????????????????out.close();
    ????????????
    //?System.out.println("Done!");
    ?????????}
    catch(Exception?e){
    ?????????????
    //System.out.println("Failed!");
    ?????????????throw?new?Exception(e.getMessage());
    ?????????}

    ?????????
    ?????????
    ?????}

    ????
    ????
    /**
    ?????*?取得填充了數(shù)據(jù)的工作簿
    ?????*?
    @param?excel?ExcelModel?Excel表的模型對(duì)象
    ?????*?
    @return?HSSFWorkbook?工作簿對(duì)象
    ?????
    */

    ????
    private??HSSFWorkbook?getInitWorkbook(ExcelModel?excel){
    ????????????

    ????????????
    //?創(chuàng)建新的Excel?工作簿
    ????????????HSSFWorkbook?workbook?=?new?HSSFWorkbook();

    ?????????????
    //在Excel工作簿中建一工作表
    ?????????????HSSFSheet?sheet?=?null;
    ?????????????String?sheetName?
    =?excel.getSheetName();
    ?????????????
    ?????????????
    if(sheetName!=null)sheet=workbook.createSheet(sheetName);
    ?????????????
    else?sheet=workbook.createSheet();

    ?????????????
    //設(shè)置表頭字體
    ?????????????HSSFFont?font_h?=?workbook.createFont();
    ?????????????font_h.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

    ?????????????
    //設(shè)置格式
    ?????????????HSSFCellStyle?cellStyle=?workbook.createCellStyle();
    ?????????????cellStyle.setFont(font_h);????????????


    ??????????????
    //在索引0的位置創(chuàng)建行(最頂端的行)
    ???????????????HSSFRow?row?=?sheet.createRow((short)0);

    ???????????????ArrayList?header?
    =?excel.getHeader();
    ???????????????
    if(header!=null){
    ???????????????????
    for(int?i=0;i<header.size();i++){

    ??????????????????
    //在索引0的位置創(chuàng)建單元格(左上端)
    ??????????????????HSSFCell?cell?=?row.createCell((short)i);
    ??????????????????
    //?定義單元格為字符串類型
    ?????????????????cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    ?????????????????
    //設(shè)置解碼方式
    ?????????????????cell.setEncoding((short)1);
    ?????????????????
    //設(shè)置單元格的格式
    ?????????????????cell.setCellStyle(cellStyle);
    ?????????????????
    //?在單元格中寫入表頭信息
    ?????????????????cell.setCellValue((String)header.get(i));

    ???????????????????}

    ???????????????}


    ???????????????ArrayList?cdata?
    =?excel.getData();
    ???????????????
    for?(int?i=0;i<cdata.size();i++){
    ????????????????
    //從第二行開(kāi)始
    ????????????????HSSFRow?row1?=?sheet.createRow(i+1);
    ????????????????ArrayList?rdata?
    =(ArrayList)cdata.get(i);
    ???????????????
    //打印一行數(shù)據(jù)
    ????????????????for?(int?j=0;j<rdata.size();j++){

    ????????????????????HSSFCell?cell?
    =?row1.createCell(?(short)j);
    ????????????????????cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    ????????????????????
    //設(shè)置字符編碼方式
    ????????????????????cell.setEncoding((short)1);
    ????????????????????
    ???????????????????Object?o?
    =?rdata.get(j);
    ????????????????????
    ????????????????????
    //造型,使寫入到表中的數(shù)值型對(duì)象恢復(fù)為數(shù)值型,
    ???????????????????
    //這樣就可以進(jìn)行運(yùn)算了
    ????????????????????if(o?instanceof?BigDecimal){
    ????????????????????????BigDecimal?b
    =(BigDecimal)o;
    ????????????????????????cell.setCellValue(b.doubleValue());
    ????????????????????}

    ????????????????????
    else?if(o?instanceof?Integer){
    ???????????????????????????Integer?it?
    =(Integer)o;
    ???????????????????????????cell.setCellValue(it.intValue());
    ???????????????????????????
    ????????????????????}

    ????????????????????
    else?if(o?instanceof?Long){
    ????????????????????????Long?l?
    =(Long)o;
    ????????????????????????cell.setCellValue(l.intValue());
    ????????????????????????
    ????????????????????}

    ????????????????????
    else?if(o?instanceof?Double){
    ????????????????????????Double?d?
    =(Double)o;
    ????????????????????????cell.setCellValue(d.doubleValue());
    ????????????????????}

    ????????????????????
    else?if(o?instanceof?Float){
    ????????????????????????Float?f?
    =?(Float)o;
    ????????????????????????cell.setCellValue(f.floatValue());
    ????????????????????}

    ????????????????????
    else{
    ????????????????????????cell.setCellValue(o
    +"");
    ????????????????????}
    ?????????????
    ????????????
    ????????????????????
    ????????????????}


    ???????????????}

    ???????????
    return?workbook;
    ????????????
    ????????}


    ??
    /**
    ???*?Just?to?test
    ???*?
    @param?args?String[]
    ???
    */

    ??
    public?static?void?main(String[]?args){

    ????????????????ArrayList?data
    =new?ArrayList();
    ????????????????ArrayList?header?
    =?new?ArrayList();
    ????????????????header.add(
    "學(xué)號(hào)");
    ????????????????header.add(
    "姓名");
    ????????????????header.add(
    "成績(jī)");
    ????????????????
    for?(int?i=0;i<3;i++){

    ?????????????????????ArrayList?data1
    =new?ArrayList();

    ????????????????????????????data1.add((i
    +1)+"");
    ????????????????????????????data1.add(
    "Name"+(i+1));
    ????????????????????????????data1.add(
    ""+(80+i));
    ????????????????????????????data.add(data1);
    ????????????????}

    ????????????????ExcelModel?model?
    =?new?ExcelModel();
    ????????????????model.setPath(
    "E:/test.xls");
    ????????????????model.setHeader(header);
    ????????????????model.setData(data);
    ????????????????ExcelOperator?eo
    =?new?ExcelOperator();
    ???????????????
    try{
    ??????????????????eo.WriteExcel(model);
    ???????????????}
    catch(Exception?e){
    ?????????????????????System.out.println(e.getMessage());
    ???????????????}


    ????????}

    }



    ?????????六、功能流程小結(jié):

    ?????????涉及到不同的項(xiàng)目,采取的框架與結(jié)構(gòu)是可能不同的。我的實(shí)現(xiàn)方法可以應(yīng)用到不同的項(xiàng)目中去,只是作為一個(gè)借鑒,它可能需要針對(duì)不同情況做相應(yīng)調(diào)整與修改。
    ?????????我的項(xiàng)目是采取了Spring+Struts+Hibernate的框架實(shí)現(xiàn)的,顯示層仍然使用HTML、JSP文件,通過(guò)它傳遞客戶端的請(qǐng)求,轉(zhuǎn)到Action類調(diào)用業(yè)務(wù)邏輯對(duì)象實(shí)現(xiàn)相應(yīng)功能。持久層使用了Hibernate,使用Hibernate作為數(shù)據(jù)持久層,在開(kāi)發(fā)與維護(hù)方面都帶來(lái)了較大的便利。至于相關(guān)框架的配置與實(shí)現(xiàn),則不在本文論述的范圍,請(qǐng)讀者朋友參閱相關(guān)資料。我的項(xiàng)目中,使用了一個(gè)Service類(類似Manager的功能,編寫接口與實(shí)現(xiàn)類,在Spring配置文件中加入,利用Spring的依賴注入技術(shù)在運(yùn)行中取得對(duì)應(yīng)的Bean實(shí)例......)來(lái)集成業(yè)務(wù)邏輯功能,通過(guò)它調(diào)用涉及到的數(shù)據(jù)訪問(wèn)類(DAO類),具體Dao類又利用Hibernate提供的對(duì)象進(jìn)行數(shù)據(jù)庫(kù)的查詢或其他操作。這些東西,我就不再詳述了,相信對(duì)這些技術(shù)使用得比我嫻熟者大有人在。功能的最終實(shí)現(xiàn),請(qǐng)看我在某個(gè)Action中的幾行代碼:

    ?ExcelModel?excel?=?new?ExcelModel();
    ?????????????????????????excel.setSheetName(
    "BidCost");???????????????????????????
    ?????????????????????????????????
    ????????????????????????????
    //寫入到Excel格式輸出流供下載
    ???????????????????????????try{???????????????????????????
    ?????????????????????????
    ????????????????????????????????
    //調(diào)用自編的下載類,實(shí)現(xiàn)Excel文件的下載
    ???????????????????????????????ExcelDownLoad?downLoad?=?new?BidCostExcelDownLoad();
    ???????????????????????????????ExcelModel?downExcel
    =?downLoad.createDownLoadExcel(bidReportList,bcf,excel);
    ???????????????????????????????
    //不生成文件,直接生成文件輸出流供下載
    ???????????????????????????????downLoad.downLoad("BidCost.xls",downExcel,response);
    ???????????????????????????????
    ???????????????????????????????log.info(
    "create?Excel?outputStream?successful!");???????????????????????????????
    ???????????????????????????
    ???????????????????????????}
    catch(Exception?e){
    ???????????????????????????????msg.add(ActionMessages.GLOBAL_MESSAGE,?
    new?ActionMessage(
    ???????????????????????????????????????
    "bidding.cs.fileUpDown.fileDownError"));//文件下載失敗!
    ??????????????????????????????????saveErrors(request,?msg);????????????????????????????????
    ??????????????????????????????
    ?????????????????????????????????log.info(
    "create?Excel?outputStream??failed!");
    ??????????????????????????????log.info(e.getMessage());
    ??????????????????????????????
    //e.printStackTrace();
    ??????????????????????????????
    ??????????????????????????????
    return?mapping.getInputForward();?????????????????????????????

    ???????????????????????????}
    ???????????????????????


    ?????????請(qǐng)看客戶端的顯示頁(yè)面:

             

     
     ?。暶鳎捍宋臑樵瓌?chuàng),轉(zhuǎn)載請(qǐng)注明出處及鏈接網(wǎng)址!)Last modified on 2006年4月15日 13:37:17

    ?

    posted on 2005-12-30 10:08 南一郎 閱讀(12281) 評(píng)論(16)  編輯  收藏

    FeedBack:
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2006-09-14 16:46 | junglesong的博客
    覺(jué)得這樣過(guò)于復(fù)雜了,沒(méi)有必要.  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2007-04-23 14:13 | Koala
    我看到這個(gè)文章的時(shí)間比較晚了,問(wèn)個(gè)問(wèn)題,可以回答下嗎?
    BaseExcelDownLoad 里面的download方法getOutputStream()方法,獲得輸出流,XXjsp的生成的類XX_jsp.java首先也要獲得輸出流。就會(huì)出現(xiàn)
    java.lang.IllegalStateException: getOutputStream() has already been called for this response
    是怎么解決這個(gè)問(wèn)題的  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2007-04-23 14:16 | Koala
    有辦法可以給我發(fā)個(gè)解決方案嗎?
    woleve@163.com  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2007-11-12 17:07 | pirate
    請(qǐng)問(wèn)可以下載到你的源碼嗎?  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2008-01-06 12:18 | smeg
    雖然我也在學(xué)java,但是才剛開(kāi)始學(xué)。你說(shuō)的我都不大懂。



    ~~~~~~~~~~~有空再過(guò)來(lái)  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2008-01-30 14:54 | javaing
    學(xué)習(xí)了,我現(xiàn)在是用的JSP和servlet開(kāi)發(fā)的,要求是當(dāng)單擊頁(yè)面上的一個(gè)按鈕把頁(yè)面表格的數(shù)據(jù)以Excel格式導(dǎo)出,不知道你的方法能不能解決  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2008-06-02 15:38 | run
    感謝樓主的分享,我的問(wèn)題已經(jīng)解決。不過(guò)有一個(gè)問(wèn)題想問(wèn)一下樓主,你的第一個(gè)download方法是不是實(shí)現(xiàn)按照寫好的一個(gè)Excle模板生成數(shù)據(jù)啊?(這個(gè)Excle模板是只有header頭名稱和一些可以利用excle自身函數(shù)可以計(jì)算的定義)?如果不是,請(qǐng)問(wèn)這個(gè)怎么實(shí)現(xiàn)?  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2008-06-13 15:34 | 櫻花季節(jié)
    BaseExcelDownLoad 里面的download方法getOutputStream()方法,獲得輸出流,XXjsp的生成的類XX_jsp.java首先也要獲得輸出流。就會(huì)出現(xiàn)
    java.lang.IllegalStateException: getOutputStream() has already been called for this response

    我跟
    Koala一樣也遇到這個(gè)問(wèn)題,可以解答一下嗎?
      回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2008-06-16 10:26 | Author
    可能是因?yàn)槲沂鞘褂肧ervlet或Action類來(lái)處理,你們是直接用JSP.出現(xiàn)的原因,可能是重復(fù)獲取輸出流。用JSp的話,可能要適當(dāng)改變一下。共用一個(gè)outputStream.  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2008-06-16 10:28 | Author
    Excel Model只是自己寫的一個(gè)類,因?yàn)槲夷壳靶枰闹皇菢?biāo)題和Excel表里的數(shù)據(jù)內(nèi)容,所以暫時(shí)只有這些屬性。你也可以有自己的更好的實(shí)現(xiàn)。  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載[未登錄](méi)
    2009-09-25 13:04 | tomcat
    不錯(cuò)--好文  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載[未登錄](méi)
    2010-11-29 11:44 | 晨曦
    response.flushBuffer();//強(qiáng)行將響應(yīng)緩存中的內(nèi)容發(fā)送到目的地 我恰恰是這句代碼報(bào)了異常。  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2013-09-22 15:53 | sss
    @junglesong的博客
      回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載
    2014-02-26 20:59 | 程浩
    你好,請(qǐng)問(wèn)使用這個(gè)代碼導(dǎo)出的excel,單元格格式設(shè)置的String 沒(méi)有生效,是為什么?  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載[未登錄](méi)
    2015-02-27 14:01 | carrie
    很好,改改controller就可以了,幫了大忙了,多謝  回復(fù)  更多評(píng)論
      
    # re: 在線實(shí)時(shí)生成Excel文件流供下載[未登錄](méi)
    2016-05-26 14:17 | 啊啊
    啊啊啊  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 中国china体内裑精亚洲日本| 最近免费中文字幕4| 亚洲AV无码国产精品色午友在线 | 亚洲av无码av制服另类专区| 国产人成网在线播放VA免费| 国产成人精品久久亚洲高清不卡 | 亚洲免费日韩无码系列| 国产亚洲精品无码拍拍拍色欲| 2022国内精品免费福利视频| 久久久久亚洲?V成人无码| 久久久WWW免费人成精品| 亚洲日韩av无码| 中文字幕久精品免费视频| 亚洲AV日韩AV永久无码免下载 | 亚洲无码精品浪潮| 国产乱子伦精品免费视频| 中文亚洲AV片不卡在线观看| 99久久成人国产精品免费| 亚洲gv猛男gv无码男同短文| 香港a毛片免费观看 | 日韩视频免费一区二区三区| 噜噜综合亚洲AV中文无码| 亚洲AV无码不卡在线观看下载| 一道本不卡免费视频| 亚洲高清国产AV拍精品青青草原| 久久九九AV免费精品| 亚洲人成网站在线观看播放青青| 成人免费无码视频在线网站| 亚洲熟女综合色一区二区三区 | 日本视频一区在线观看免费| 国产精品亚洲精品青青青| 日韩免费a级在线观看| 欧洲乱码伦视频免费国产| 中文字幕人成人乱码亚洲电影| 久久狠狠躁免费观看| 亚洲乱人伦精品图片| 国产女高清在线看免费观看| 国产高清视频免费在线观看 | 18pao国产成视频永久免费| 亚洲中文字幕AV在天堂| 免费a级毛片永久免费|