首页 > 代码库 > Java通过POI技术操作Excel(3)----数据导出

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