zoukankan      html  css  js  c++  java
  • Java通过POI技术操作Excel(3)----数据导出

    在之前的博客中,总结了Excel模板生成和Excel数据录入,然后剩最后一个模块,数据库中数据读取,在之前的基础上我们来看这一模块,应该已经非常容易了,接下来简单的介绍一下:

    这里我们仍然以jsp+servlet为例,对SqlServer2005数据库进行操作,如下都是基本步骤:

    1、连接数据库;2、根据sql语句获取数据库中值;3、将值进行导出操作;

    首先,我们来记性数据库的连接,这个相信接触过java的人都不会陌生,我就不赘述了

      1 public class DataBase {
      2     private String className="com.microsoft.sqlserver.jdbc.SQLServerDriver";
      3     private String url="jdbc:sqlserver://127.0.0.1:1433;databasename=test";
      4     private String name="sa";
      5     private String pwd="sa";
      6     private Connection conn;
      7     private PreparedStatement pstm;
      8     private ResultSet rs;
      9     private String OneCall=null;
     10 //对数据库数据进行修改:增、删、改
     11     public boolean update(String sql,Object...args){
     12         try {
     13             pstm=conn.prepareStatement(sql);
     14             for(int i=0;i<args.length;i++){
     15                 pstm.setObject(i+1, args[i]);
     16             }
     17             int n=pstm.executeUpdate();
     18             if(n>0){
     19                 return true;
     20             }
     21         } catch (SQLException e) {
     22             e.printStackTrace();
     23         }
     24         return false;    
     25     }
     26 //查询某一个数据
     27     public String queryOne(String sql,Object...args){
     28         try {
     29             pstm=conn.prepareStatement(sql);
     30             for(int i=0;i<args.length;i++){
     31                 pstm.setObject(i+1, args[i]);
     32             }
     33             rs=pstm.executeQuery();
     34             if(rs.next()){
     35                 OneCall=rs.getString(1);
     36             }
     37         } catch (SQLException e) {
     38             e.printStackTrace();
     39         }
     40         return OneCall;
     41     }
     42 //查询多行数据
     43     public List<List<String>> query(String sql,Object...args){
     44         List<List<String>> list =new ArrayList<List<String>>();
     45         try {
     46             
     47             pstm=conn.prepareStatement(sql);
     48             for(int i=0;i<args.length;i++){
     49                 pstm.setObject(i+1, args[i]);
     50             };
     51             rs=pstm.executeQuery();
     52             while(rs.next()){
     53                 List<String> row=new ArrayList<String>();
     54                 for(int i=1;i<=rs.getMetaData().getColumnCount();i++){
     55                     row.add(rs.getString(i));
     56                 }
     57                 list.add(row);
     58             }
     59             
     60         } catch (SQLException e) {
     61             e.printStackTrace();
     62         }
     63         return list;    
     64     }
     65 //关闭数据库
     66     public void close(){
     67             try {
     68                 if(rs!=null){rs.close();}
     69                 if(pstm!=null){pstm.close();};
     70                 if(conn!=null){conn.close();};
     71             } catch (SQLException e) {
     72                 e.printStackTrace();
     73             }
     74     }
     75 //打开数据库
     76     public void open(){
     77         try {
     78             Class.forName(className);
     79             conn=DriverManager.getConnection(url,name,pwd);
     80         } catch (ClassNotFoundException e) {
     81             e.printStackTrace();
     82         } catch (SQLException e) {
     83             e.printStackTrace();
     84         }
     85     }
     86     //获取列数
     87     public int getColumn(String sql){
     88         try{
     89             pstm=conn.prepareStatement(sql);
     90             rs=pstm.executeQuery();
     91             return rs.getMetaData().getColumnCount();
     92         }catch (Exception e) {
     93             // TODO: handle exception
     94         }
     95         return 0;
     96     }
     97     //获取行数
     98     public int getRow(String sql){
     99         int row = 0 ;
    100         try{
    101             pstm=conn.prepareStatement(sql);
    102             rs=pstm.executeQuery();
    103             while(rs.next()){
    104                 row++;
    105             }
    106         }catch (Exception e) {
    107             // TODO: handle exception
    108         }
    109         return row;
    110     }
    111 }
    View Code

    接下来,我们在DAO层进行获取值的操作:

    1 public class DownLoadDao extends DataBase{
    2     public List<List<String>> getDataInDao(){
    3         String sql="select * from emp";
    4         List<List<String>> list=this.query(sql);
    5         return list;
    6     }
    7 }

    最后是关键的数据导出,当然也是非常简单,a、获取标题栏;b、在填充区添加数据

     1 public class DownLoadServiceImpl implements BaseService{
     2     DownLoadDao dld=new DownLoadDao();
     3 //实现数据库的基本开关
     4     public void openStore(){
     5         dld.open();
     6     }
     7     public void closeStore(){
     8         dld.close();
     9     }
    10     public boolean createExcel(HSSFWorkbook excel)throws IOException{
    1 List<List<String>> list=this.getData();
    2 System.out.println(list);
    3 int rowNum=list.size();
    4 int columnNum=list.get(0).size();
     1 //基本步骤
     2 HSSFSheet sheet=model.createSheet();
     3 model.setSheetName(0, "个人信息");
     4 //创建第一格的样式
     5 HSSFCellStyle style=model.createCellStyle();
     6 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
      style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    7 style.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM); 8 style.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM); 9 style.setBorderRight(HSSFCellStyle.BORDER_MEDIUM); 10 style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM); 11 //创建第一格中字体样式 12 HSSFFont font=model.createFont(); 13 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 14 //将设置的字体样式加入单元格样式中 15 style.setFont(font); 16 //创建第一格单元格,并将之前设置的样式加入 17 HSSFRow row=sheet.createRow((short)0); 18 HSSFCell cell=row.createCell((short)0); 19 cell.setCellValue("个人信息录入"); 20 cell.setCellStyle(style); 21 HSSFCell cella=null; 22 for (int i = 1; i < 5; i++) { 23 cella=row.createCell((short)i); 24 cella.setCellValue(""); 25 cella.setCellStyle(style); 26 } 27 //设置接下来两行标题的样式 28 HSSFCellStyle styleTitle=model.createCellStyle(); 29 //加边框
    styleTitle.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
    styleTitle.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
    styleTitle.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
    styleTitle.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
    30 HSSFFont fontTitle = model.createFont(); 31 fontTitle.setBoldweight((short) 10);// 设置字体的宽度 32 fontTitle.setFontHeightInPoints((short) 10);// 设置字体的高度 33 fontTitle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示 34 styleTitle.setFont(fontTitle);// 设置style1的字体 35 styleTitle.setWrapText(true);// 设置自动换行 36 styleTitle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向) styleTitle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向) 37 //创建第二行,并将上面设置的标题样式加入 38 HSSFRow rowTitle=sheet.createRow((short)1); 39 //第二行四列数据 40 HSSFCell cellNum=rowTitle.createCell((short)0); 41 cellNum.setCellValue("编号"); 42 cellNum.setCellStyle(styleTitle); 43 HSSFCell cellName=rowTitle.createCell((short)1); 44 cellName.setCellValue("姓名"); 45 cellName.setCellStyle(styleTitle); 46 HSSFCell cellMsg=rowTitle.createCell((short)2); 47 cellMsg.setCellValue("验证信息"); 48 cellMsg.setCellStyle(styleTitle); 49 HSSFCell cellDept=rowTitle.createCell((short)4); 50 cellDept.setCellValue("部门"); 51 cellDept.setCellStyle(styleTitle); 52 //第三行两列数据 53 HSSFRow rowAT=sheet.createRow((short)2); 54 HSSFCell cellS=null; 55 for (int i = 0; i < 2; i++) { 56 cellS=rowAT.createCell((short)i); 57 cellS.setCellValue(""); 58 cellS.setCellStyle(styleTitle); 59 } 60 HSSFCell cellSss=rowAT.createCell((short)2); 61 cellSss.setCellValue("密码"); 62 cellSss.setCellStyle(styleTitle); 63 HSSFCell cellCard=rowAT.createCell((short)3); 64 cellCard.setCellValue("身份证号"); 65 cellCard.setCellStyle(styleTitle); 66 HSSFCell cellD=rowAT.createCell((short)4); 67 cellD.setCellValue(""); 68 cellD.setCellStyle(styleTitle); 69 //将标题的合并合并起来 70 Region region=null; 71 region=new Region((short)0,(short)0,(short)0,(short)4); 72 sheet.addMergedRegion(region); 73 region=new Region((short)1,(short)0,(short)2,(short)0); 74 sheet.addMergedRegion(region); 75 region=new Region((short)1,(short)1,(short)2,(short)1); 76 sheet.addMergedRegion(region); 77 region=new Region((short)1,(short)4,(short)2,(short)4); 78 sheet.addMergedRegion(region); 79 region=new Region((short)1,(short)2,(short)1,(short)3); 80 sheet.addMergedRegion(region); 81 //设置剩余的空格,将空着数值填充为空 82 //设置一个需要提供下拉的区域 83 String[] list={"研发部","财务部","工程部",}; 84 //定义一个名称,指向刚才创建的下来项的区域 85 HSSFName range = model.createName(); 86 range.setNameName("disRange"); 87 //确定下拉列表框的位置 88 CellRangeAddressList regions=new CellRangeAddressList(3,65535,4,4); 89 //生成下拉列表框的内容 90 DVConstraint constraint=DVConstraint.createExplicitListConstraint(list); 91 //绑定下拉框的作用区域 92 HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint); 93 //对哪一页起作用 94 sheet.addValidationData(dataValidate);
    1 for (int i = 3; i < rowNum+3; i++) {
    2     HSSFRow row=sheet.createRow(i);
    3     for (int j = 0; j < columnNum; j++) {
    4         HSSFCell focus=row.createCell(j);
    5         focus.setCellValue(list.get(i).get(j).toString());
    6     }
    7 }

    以上我分别以四个模块编写的代码,相信也很容易明白各自的含义,*首先是对数据库的开关操作,*然后是根据从数据库中获取到的值,得到相应的数据参数;*再次是获取标题部分;*最后是增添原来的填充部分,当然这里的填充部分都是包含数据的

    这样我们通过Apache POI对Excel的操作我们都做了简单的介绍,当然这只是单纯面对一个文件时采用的操作,当生成多个模板,或者读取多个数据,或者导出多个数据时,我们必须对于现有的代码进行优化,知其然不如知其所有然,我们只有更好的理解操作的原理,才能在当前基础上进行变动,简化,写的有些凌乱,但自己在理解上更深了一层,也希望对你有所帮助,在开发道路上愈走愈顺,加油....

  • 相关阅读:
    pt-align的用法简要记录
    percona-toolkit 3.0.13 简单安装记录
    mysql8.0.17复制搭建及其gtid的1062和1032异常
    percona-xtrabackup-8.0.7简单快捷使用
    8.0.17 MySQL Community Server 二进制手工安装
    mysql参数sql_log_bin配置
    ERROR 1040 (08004): Too many connections
    MongoDB 副本集+分片 认证方式搭建
    属性配置文件详解(2)(十七)
    属性配置文件详解(1)(十六)
  • 原文地址:https://www.cnblogs.com/marsmile/p/3695880.html
Copyright © 2011-2022 走看看