`
huanglz19871030
  • 浏览: 248940 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

poi方式将数据导出到execl并提供下载

阅读更多

经过一天半的学习,终于采用poi方式从数据库中导出数据到execl并实现下载。具体代码如下:

package com.szwistar.metenoa.oaagent;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import weaver.conn.RecordSet;
import com.szwistar.common.ServerAgentBase;
import com.szwistar.common.util.util4RecordSet;

/**
 *
 * @function 根据Action传过来的requestId查询明细表里面的数据,并将数据写入到根据requestId生成的excel文件中,并把execl打开或者下载保存。
 * @author huanglizhi
 * @creatTime 2010-5-6
 * @edit 2010-5-7
 *
 */
public class OAAgent_test_Excel extends ServerAgentBase {
 
 /**
  * 得到requestId,调用createExcel方法生成Excel文件
  */
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("text/html;charset=gbk");
  request.setCharacterEncoding("gbk");
  try {
   //获得requestid
   String requestId = "";   
   try {
    //得到requestId并对requestId进行处理
    requestId = request.getParameter("requestId");
    log.info("requestId xxx : " + requestId);
             if(null == requestId || "".equals(requestId)) {
              log.debug("requestId(null or blank): " + requestId);
              requestId = "";
          }
            } catch(Exception e) {
             requestId = "";
             log.error("requestId(exception): " + requestId);
            }
      //根据requestId生成EXCEL文件
      createExcel(requestId, request, response);
  } catch (Exception e) {
   log.error("OAAgent_test_Excel doget failed!  " + e.getMessage());
  }
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("text/html;charset=gbk");
  this.doGet(request, response);
 }
 
 /**
     * 从明细表里查询出EXCEL需要的信息
     * @param requestId
     * @return excelList
     */
 @SuppressWarnings("unchecked")
 protected static ArrayList getExcelList(String requestId) {
  RecordSet res = null;
     ArrayList excelList = null;
     try {
      //从明细表formtable_main_28_dt1里取出需要的字段来
      String sql = "select id,mainId,mx01,mx02,mx03,mx04 from formtable_main_28_dt1 where mainid in (select id from formtable_main_28 where requestId = " + requestId + ")";
      log.info("从明细表里查询出EXCEL需要的信息: " + sql);
      res = new RecordSet();
   res.executeSql(sql);
   //RecordSetToListObj方法返回的ArrayList为ArrayList<AList>结构 
   //其中AList又为 ArrayList<String>结构;第一个list为字段名 ,后续list为字段值
   excelList = util4RecordSet.RecordSetToListObj(res, null);
     } catch (Exception e) {
      log.error("从明细表里查询出EXCEL需要的信息: " + e.getMessage());
     }
     log.info("excelList:" + excelList);
     return excelList;
    }
 
    /**
     * 创建EXCEL文件
     * @param requestId
     */
  @SuppressWarnings("unchecked")
 protected void createExcel(String requestId, HttpServletRequest request, HttpServletResponse response) {
      log.info("enter createExcel......");
      FileOutputStream fout = null;  
         try {  
             fout = new FileOutputStream(new File("/opt/weaver50/ecology/excelFile/中文.xls"));  
         } catch (FileNotFoundException e1) {  
          log.error(e1.getMessage() + ":" + fout);  
         }  
         //创建工作簿
      HSSFWorkbook hsshworkbook = new HSSFWorkbook();
      //由工作簿创建工作表,注意的一点是下标从0开始,就像数组一样
      HSSFSheet hsshsheet = hsshworkbook.createSheet();
      //设置工作表的名称,该方法需要三个参数,第一个是工作表在工作薄中的位置,第二个就是工作表的名称,第三个是字符编码
      hsshworkbook.setSheetName(0,"实验项目列表--中文测试",HSSFWorkbook.ENCODING_UTF_16);
      //对应excel的行
      HSSFRow hssfrow = hsshsheet.createRow(0);
         //创建单元格,设置每个单元格的值(作为表头),对应excel的列
      //很多方法的参数是short而不是int,所以需要做一次类型转换
         HSSFCell hssfcell = hssfrow.createCell((short) 0);
         //字符编码,必须加上,否则中文乱码
         hssfcell.setEncoding(HSSFCell.ENCODING_UTF_16);
         //设定单元格的值,值的类型有:double,int,String,Date,boolean 
         hssfcell.setCellValue("编号");  
         hssfcell = hssfrow.createCell((short) 1);
         hssfcell.setEncoding(HSSFCell.ENCODING_UTF_16);
         hssfcell.setCellValue("报销人");  
         hssfcell = hssfrow.createCell((short) 2);
         hssfcell.setEncoding(HSSFCell.ENCODING_UTF_16);
         hssfcell.setCellValue("报销事项");  
         hssfcell = hssfrow.createCell((short) 3); 
         hssfcell.setEncoding(HSSFCell.ENCODING_UTF_16);
         hssfcell.setCellValue("报销金额");
         hssfcell = hssfrow.createCell((short) 4);
         hssfcell.setEncoding(HSSFCell.ENCODING_UTF_16);
         hssfcell.setCellValue("报销日期");
         hssfcell = hssfrow.createCell((short) 5);
         hssfcell.setEncoding(HSSFCell.ENCODING_UTF_16);
         hssfcell.setCellValue("备注");     
      //处理后的EXCEL内容结果集
      ArrayList excelList = new ArrayList();
      try {       
       log.info("before getExcelList");     
          // 获得处理后的EXCEL内容结果集,excelList存放的是一条条完整的记录  
          excelList = getExcelList(requestId);
          log.info("excelList:" + excelList);         
         // arrayList存放的是每一条记录的所有列
          ArrayList arrayList = null;           
          //如果excelList没有记录 则返回
          if(excelList.size() < 1) {
           log.info("没有查询到记录....");
           return;
          }
          if(null != excelList) {           
           //得到结果集的记录条数
           int count = excelList.size();
           log.info("count:" + count);           
           //excelList得到的是含有表头的数据集,i=1表示除去表头后的第一条记录          
              for(int i = 1; i < count; i++) {
               log.info("enter for");
               arrayList = (ArrayList) excelList.get(i); 
               log.info("after arrayList");
               hssfrow = hsshsheet.createRow(i);  
               log.info("after hssfrow");
               for (int j = 0; j < arrayList.size(); j++) {  
                hssfcell = hssfrow.createCell((short) j); 
                hssfcell.setEncoding(HSSFCell.ENCODING_UTF_16);
                //将每一列的值插入到单元格中
                hssfcell.setCellValue(arrayList.get(j).toString());  
                  }  
              }
          }
          //将工作簿对象hsshworkbook写入到输出流      
             hsshworkbook.write(fout);
             fout.flush();
             fout.close();
       log.info("EXCEL文件已生成......");    
   } catch (IOException e) {
    log.error("createExcel error:" + e.getMessage());
    return;
   }
   log.info("before DownExcelFile");
   //下载已生成的execl文件
   DownExcelFile(response);
      log.info("EXCEL文件下载完成......");
    }
 
  /**
   * 下载execl文件
   */ 
  public void DownExcelFile(HttpServletResponse response) {
    String fileDownPath = "/opt/weaver50/ecology/excelFile/中文.xls";
    File file = new File(fileDownPath);
    if (file.exists()) {
     try {
      log.info("enter try");     
      // 要用servlet 来打开一个 EXCEL 文档,需要将 response 对象中 header 的 contentType 设置成"application/x-msexcel"。
      response.setContentType("application/x-msexcel");
      String fileName = fileDownPath;
      // 保存文件名称
      fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
      // 处理中文文件名
      fileName = new String(fileName.getBytes("GB2312"), "ISO-8859-1");
      //servlet中,要在 header中设置下载方式
      response.setHeader("Content-Disposition","attachment; filename=" + fileName);
      //FileInputStream输入流
      //FileInputStream bis = new FileInputStream(file);
      //缓冲流(BufferedStream)可以一次读写一批数据,,缓冲流(Buffered Stream)大大提高了I/O的性能。
      BufferedInputStream  bis = new BufferedInputStream(new FileInputStream(file));
      //OutputStream输出流
      OutputStream bos = response.getOutputStream();
      byte[] buff = new byte[1024];
      int readCount = 0;
      //每次从文件流中读1024个字节到缓冲里。
      readCount = bis.read(buff);
      while (readCount != -1) {
       //把缓冲里的数据写入浏览器
       bos.write(buff, 0, readCount);
       readCount = bis.read(buff);
      }
      if (bis != null) {
       bis.close();
      }
      if (bos != null) {
       bos.close();
      }
      // 下载完毕,给浏览器发给完毕的头
      response.setStatus(HttpServletResponse.SC_OK);
      response.flushBuffer();
     } catch (Exception e) {
   log.error("DownExcelFile error:" + e.getMessage());
     }
    }
   }
  
}

0
2
分享到:
评论

相关推荐

    POI导出Excel文件

    Servlet方法是将数据导出到Excel的一种服务器端技术,常用于Web应用程序。它允许用户请求一个URL,然后服务器生成Excel文件并将其作为HTTP响应的一部分返回。在实现中,Servlet会创建一个Workbook对象,添加Sheet,...

    java 将数据导出到Excel中

    总结来说,Java通过Apache POI库提供了强大的Excel操作能力,使开发者可以方便地将数据导出到Excel文件中。理解并掌握这一技能对于任何进行Java开发的人来说都是十分有用的。通过实践和不断探索,你可以创建更复杂的...

    POI实现的基于动态模板的EXCEL数据导出

    标题中的“POI实现的基于动态模板的EXCEL数据导出”是指利用Apache POI库来创建一个可以动态填充数据的Excel模板,从而实现大量数据的高效导出。Apache POI是一个开源项目,它允许Java开发者读写Microsoft Office...

    SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel.zip

    在本项目中,"SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel.zip",我们主要关注的是如何利用Java技术栈来处理Excel文件,并与数据库进行交互。以下是相关知识点的...

    POI导出 POI导出 POI导出

    POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI...

    POI实现Excel导入导出并附带加载进度条

    在Java开发中,处理Excel数据是一项常见的任务,尤其是在数据分析、报表生成或批量数据操作的...开发者可以根据提供的测试数据和说明,轻松地将这个功能集成到自己的项目中,从而提升Excel处理部分的效率和用户体验。

    java poi导出图片到excel示例代码

    描述中提到了本文的主要内容,即使用Java POI将图片导出到Excel中,并提供了详细的示例代码,对大家的学习或者工作具有一定的参考学习价值。 标签解释 标签中提到了Java POI、Excel、Java等关键词,表明了本文的...

    poi导出根据模板导出excel和简单列表导出excel源码

    大量数据导出时,一次性加载到内存可能导致内存溢出。为解决这个问题,可以采用流式处理(Streaming User Model)或分批处理。例如,使用SXSSF(Streaming Usermodel API)可以避免一次性加载所有数据,它会在磁盘...

    使用POI导出大数据量到EXCEL

    "使用POI导出大数据量到EXCEL"这个主题涉及到如何高效地利用POI处理大量数据并将其导出到Excel文件中。以下是对这个主题的详细讲解。 1. **Apache POI简介** Apache POI 是一个开源项目,它提供了Java API来创建、...

    java poi导出大量数据到Excel

    ### Java POI 大量数据导出到Excel详解 #### 一、背景介绍 在日常工作中,经常需要处理大量的数据并将其导出为Excel文件,特别是在金融、电商等行业。Java POI库作为一款强大的用于读写Microsoft Office文档的Java ...

    java_poi实现excel导入导出

    在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java POI Java POI 是一个开源的 Java 库,由 Apache 软件基金会维护。它提供了一系列的 API,用于处理 Microsoft Office 文件...

    使用POI筛选字段导出Excel,以及条件查询和指定数据导出

    使用POI筛选字段导出Excel,以及条件查询和指定数据导出

    poi多线程大数据导出excel文件.zip

    本项目“poi多线程大数据导出excel文件”提供了一个解决方案,利用多线程来提高Excel的大数据导出效率。 Apache POI 3.1版本是较早的版本,而项目中使用了更新的4.1版本,这意味着它可能利用了更多优化和新特性。在...

    JAVA实现数据库数据导入导出到Excel(POI)所需jar包

    在Java开发中,有时我们需要将数据库中的数据导出到Excel文件,或者从Excel文件导入数据到数据库。Apache POI是一个流行的API,专为处理Microsoft Office格式的文件,如Excel(.xlsx, .xls)。本教程将详细介绍如何...

    poi excel 模板读取并导出带公式的excel文档

    在实际工作中,经常需要批量处理数据,并将其导出到Excel文件中,特别是在需要复杂计算的情况下,例如工资单、统计数据汇总等场景。利用Apache POI库能够实现这一功能,即可以通过Java程序操作Excel文件,包括读取、...

    SpringMVC POI Excel 生成导出

    7. ExcelExportUtil:ExcelExportUtil 是一个工具类,用于将数据导出到 Excel 文件中。 8. HSSFWorkbook:HSSFWorkbook 是一个 POI 库中的类,用于操作 Excel 文件。 详细解释 在这个例子中,我们可以看到如何使用 ...

    POI百万级大数据量EXCEL导出 - 请叫我猿叔叔的博客 - CSDN博客.htm

    POI百万级大数据量EXCEL导出 - 请叫我猿叔叔的博客 - CSDN博客.htm

    poi导出数据到excel里

    在这个场景中,"poi导出数据到excel里"指的是使用Apache POI库在Java项目中将数据写入Excel文件的过程。这个功能在数据分析、报表生成或者数据导出等场景中非常常见。以下是对Apache POI导出数据到Excel的详细解释:...

    使用poi方式导出excel(分多个sheet导出)

    七、导出Excel文件 最后,将Workbook写入OutputStream或File,完成导出: ```java try (FileOutputStream out = new FileOutputStream("output.xlsx")) { workbook.write(out); } catch (IOException e) { e....

    使用POI,实现excel文件导出,图片url导出文件,图片和excel文件导出压缩包

    本文将深入探讨如何使用POI库来实现Excel文件的导出,以及如何将图片URL转换为图片文件并与其他文件一起打包成压缩包。 首先,让我们了解一下Apache POI。POI是Java开发者的开源API,它允许程序创建、修改和显示...

Global site tag (gtag.js) - Google Analytics