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