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