1.Apache POI简介
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 POI 的功能。
2.POI结构
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读Microsoft Visio格式档案的功能。
HPBF - 提供读Microsoft Publisher格式档案的功能。
HSMF - 提供读Microsoft Outlook格式档案的功能。
3.生成execl的代码
1 package com.bjsxt.sxf.test; 2 3 4 import java.io.File; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.OutputStream; 9 import java.util.Date; 10 11 import org.apache.poi.hssf.usermodel.HSSFSheet; 12 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 13 import org.apache.poi.hssf.util.CellRangeAddress; 14 import org.apache.poi.hssf.util.HSSFColor; 15 import org.apache.poi.ss.usermodel.Cell; 16 import org.apache.poi.ss.usermodel.CellStyle; 17 import org.apache.poi.ss.usermodel.CreationHelper; 18 import org.apache.poi.ss.usermodel.Font; 19 import org.apache.poi.ss.usermodel.IndexedColors; 20 import org.apache.poi.ss.usermodel.Row; 21 import org.apache.poi.ss.usermodel.Workbook; 22 23 24 /** 25 * 操作java代码生成execl表格 26 * @ClassName: JavaToExcel 27 * @Description: TODO(这里用一句话描述这个类的作用) 28 * @author 尚晓飞 29 * @date 2014-10-9 上午10:21:54 30 * 31 */ 32 public class JavaToExcel { 33 34 public static void main(String[] args) throws IOException { 35 //创建Workbook对象(这一个对象代表着对应的一个Excel文件) 36 //HSSFWorkbook表示以xls为后缀名的文件 37 HSSFWorkbook wb=new HSSFWorkbook(); 38 //获得CreationHelper对象,这个应该是一个帮助类 39 CreationHelper helper = wb.getCreationHelper(); 40 //创建Sheet并给名字(表示Excel的一个Sheet) 41 HSSFSheet sheet1 = wb.createSheet("student01"); 42 //Row表示一行Cell表示一列 43 Row row = null; 44 Cell cell = null; 45 for(int i=0;i<60;i++){ 46 //获得这个sheet的第i行 (行是从0开始的,0是第一行) 47 row = sheet1.createRow(i); 48 //设置行长度自动 49 //row.setHeight((short)500); 50 row.setHeightInPoints(20); 51 //row.setZeroHeight(true); 52 for(int j=0;j<25;j++){ 53 //设置每个sheet每一列的宽度,自动,根据内容的最大长度确定。 54 sheet1.autoSizeColumn(j, true); 55 //创建一个基本的样式 56 CellStyle cellStyle = JavaToExcel.createStyleCell(wb); 57 //获得这一行的每j列 58 cell = row.createCell(j); 59 if(j==0){ 60 //设置文字在单元格里面的位置 61 cellStyle = JavaToExcel.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_LEFT, CellStyle.VERTICAL_BOTTOM); 62 //先创建字体样式,并把这个样式加到单元格的字体里面 63 cellStyle.setFont(createFonts(wb)); 64 //把这个样式加到单元格里面 65 cell.setCellStyle(cellStyle); 66 //给单元格设值 67 if(i%2==0){ 68 cell.setCellValue("尚晓飞是个大坏蛋dsafdsagfdsgserthgfdhytjfdsadfdsagrea"); 69 }else{ 70 cell.setCellValue("尚晓飞是个大坏蛋"); 71 } 72 73 }else if(j==1){ 74 //设置文字在单元格里面的位置 75 cellStyle = JavaToExcel.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); 76 //设置这个样式的格式(Format) 77 cellStyle = JavaToExcel.setCellFormat(helper,cellStyle, "#,##0.0000"); 78 //先创建字体样式,并把这个样式加到单元格的字体里面 79 cellStyle.setFont(createFonts(wb)); 80 //把这个样式加到单元格里面 81 cell.setCellStyle(cellStyle); 82 //给单元格设值 83 cell.setCellValue(new Date()); 84 }else if(j==2){ 85 cellStyle = JavaToExcel.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); 86 cellStyle.setFont(createFonts(wb)); 87 cell.setCellStyle(cellStyle); 88 cell.setCellValue(helper.createRichTextString("RichString"+i+j)); 89 }else if(j==3){ 90 cellStyle = JavaToExcel.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); 91 cellStyle = JavaToExcel.setCellFormat(helper,cellStyle, "MM-yyyy-dd"); 92 cell.setCellStyle(cellStyle); 93 cell.setCellValue(new Date()); 94 }else if(j==24){ 95 cellStyle = JavaToExcel.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); 96 cellStyle.setFont(createFonts(wb)); 97 //设置公式 98 cell.setCellFormula("SUM(E"+(i+1)+":X"+(i+1)+")"); 99 }else{ 100 cellStyle = JavaToExcel.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER); 101 cellStyle = JavaToExcel.setFillBackgroundColors(cellStyle,IndexedColors.ORANGE.getIndex(),IndexedColors.ORANGE.getIndex(),CellStyle.SOLID_FOREGROUND); 102 cell.setCellStyle(cellStyle); 103 cell.setCellValue(""); 104 } 105 } 106 107 108 109 } 110 111 //合并单元格 112 //参数含义:new CellRangeAddress(a, b, c,d) 113 //a和c:第几行 b和d是第几列 行和列的下标从0开始 0表示第一行或第一列 114 /** 115 * 重点注意事项: 116 1.单元格CELL和ROW对象下标都是从0开始的。 117 2.单元格合并时new CellRangeAddress(a, b, c,d)a的值的行号必须要比c的行号小,如果大于c就不能正常合并单元格 118 3.合并单元格的时候要合并的单单元格必须先创建,这样方便后面再次获取这个单元格来填充数据,主要就是因为合并时不能由后向前进行合并引起的。 119 */ 120 sheet1.addMergedRegion(new CellRangeAddress(0, 0, 0,24)); 121 Cell cell2=sheet1.getRow(0).getCell(0); 122 cell2.setCellValue("将java中的对象转换成execl表格并保存的表内容"); 123 124 125 //输出 126 OutputStream os; 127 try { 128 os = new FileOutputStream(new File("c://JavaToExcel.xls")); 129 wb.write(os); 130 os.close(); 131 } catch (FileNotFoundException e) { 132 // TODO Auto-generated catch block 133 e.printStackTrace(); 134 } 135 136 137 } 138 139 140 /** 141 * 边框 142 * @param wb 143 * @return 144 */ 145 public static CellStyle createStyleCell(Workbook wb){ 146 CellStyle cellStyle = wb.createCellStyle(); 147 //设置一个单元格边框样式 148 cellStyle.setBorderBottom(CellStyle.BORDER_THIN); 149 cellStyle.setBorderTop(CellStyle.BORDER_THIN); 150 cellStyle.setBorderLeft(CellStyle.BORDER_THIN); 151 cellStyle.setBorderRight(CellStyle.BORDER_THIN); 152 /** 153 * 154 CellStyle.BORDER_DOUBLE 双边线 155 CellStyle.BORDER_THIN 细边线 156 CellStyle.BORDER_MEDIUM 中等边线 157 CellStyle.BORDER_DASHED 虚线边线 158 CellStyle.BORDER_HAIR 小圆点虚线边线 159 CellStyle.BORDER_THICK 粗边线 160 */ 161 //设置一个单元格边框颜色 162 cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); 163 cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); 164 cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); 165 cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); 166 return cellStyle; 167 } 168 /** 169 * 设置文字在单元格里面的位置 170 * CellStyle.ALIGN_CENTER 171 * CellStyle.VERTICAL_CENTER 172 * @param cellStyle 173 * @param halign 174 * @param valign 175 * @return 176 */ 177 public static CellStyle setCellStyleAlignment(CellStyle cellStyle,short halign,short valign){ 178 //设置上下 179 cellStyle.setAlignment(CellStyle.ALIGN_LEFT); 180 //设置左右 181 cellStyle.setVerticalAlignment(CellStyle.VERTICAL_BOTTOM); 182 return cellStyle; 183 } 184 /** 185 * 格式化单元格 186 * 如#,##0.00,m/d/yy去HSSFDataFormat或XSSFDataFormat里面找 187 * @param cellStyle 188 * @param fmt 189 * @return 190 */ 191 public static CellStyle setCellFormat(CreationHelper helper,CellStyle cellStyle,String fmt){ 192 //还可以用其它方法创建format 193 cellStyle.setDataFormat(helper.createDataFormat().getFormat(fmt)); 194 return cellStyle; 195 } 196 /** 197 * 前景和背景填充的着色 198 * @param cellStyle 199 * @param bg IndexedColors.ORANGE.getIndex(); 200 * @param fg IndexedColors.ORANGE.getIndex(); 201 * @param fp CellStyle.SOLID_FOREGROUND 202 * @return 203 */ 204 public static CellStyle setFillBackgroundColors(CellStyle cellStyle,short bg,short fg,short fp){ 205 //cellStyle.setFillBackgroundColor(bg); 206 cellStyle.setFillForegroundColor(fg); 207 cellStyle.setFillPattern(fp); 208 return cellStyle; 209 } 210 /** 211 * 设置字体 212 * @param wb 213 * @return 214 */ 215 public static Font createFonts(Workbook wb){ 216 //创建Font对象 217 Font font = wb.createFont(); 218 //设置字体 219 font.setFontName("黑体"); 220 //着色 221 font.setColor(HSSFColor.BLUE.index); 222 //斜体 223 font.setItalic(true); 224 //字体大小 225 font.setFontHeight((short)300); 226 return font; 227 } 228 }
示例:生成报表【此示例生成学生信息表(应用到阿帕奇的poi和struts2下载)】
一:struts.xml关于生成报表的下载配置
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <!-- 如果请求地址=actionName!methodName ,则该配置需要进行设置,否则访问地址错误--> 8 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 9 10 <!-- 开发模式 --> 11 <constant name="struts.devMode" value="true" /> 12 13 <!-- 编码格式过滤 --> 14 <constant name="struts.i18n.encoding" value="utf-8"></constant> 15 16 <!-- 告诉struts.xml不要自己通过反射new,对象,去spring的ioc容器中找 17 action中的class='spring中Ioc容器中对象的id' 18 annotation注解生成对象默认情况下id值为是:类名首字符小写 19 需要加jar包struts-spring-plugin..jar 20 --> 21 <constant name="struts.objectFactory" value="spring"></constant> 22 23 24 <package name="default" namespace="/" extends="struts-default"> 25 <!-- actionName!methodName请求方式的配置 --> 26 <action name="StudentAction" class="StudentAction"> 27 <result name="success">/page/success.jsp</result> 28 <!-- 生成报表的下载返回 --> 29 <result name="inputStu" type="stream"> 30 <param name="contentType">application/vnd.ms-excel;charset=UTF-8</param> 31 <!-- 下载页文件名的显示,action中的属性 --> 32 <param name="contentDisposition">attachment;fileName="${fileName}"</param> 33 <!-- action中输入流属性的名字 --> 34 <param name="inputName">stuReport</param> 35 <!-- 读取字节数的大小1kb --> 36 <param name="bufferSize">1024</param> 37 </result> 38 </action> 39 <action name="PowerAction" class="PowerAction"> 40 <result name="success">/page/success.jsp</result> 41 </action> 42 </package> 43 </struts>
二:生成报表的action类,以及方法和下载时应该设置的属性。与struts.xml配置相对应
1 package com.bjsxt.sxf.action; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.InputStream; 7 import java.io.UnsupportedEncodingException; 8 9 import org.apache.struts2.ServletActionContext; 10 11 import com.bjsxt.sxf.po.Student; 12 import com.bjsxt.sxf.service.ClassRoomService; 13 import com.bjsxt.sxf.service.StudentService; 14 15 16 17 18 public class StudentAction { 19 private StudentService studentService; 20 private ClassRoomService classRoomService; 21 22 //struts2下载两个属性 23 private String fileName; //生成的execl的文件名 24 private InputStream stuReport;//将项目根目录下生成的execl文件读入的客户端内存中的输入流 25 26 27 28 //此get方法是为了 29 /** 30 * ISO8859-1是页面上数据传输的格式, 31 new String(fileName.getBytes("utf-8"),"iso8859-1"); 32 utf-8是你java项目格式(根据实际项目变更),目的是为了将中文文件名正确显示在页面上 33 */ 34 35 public String getFileName() { 36 try { 37 fileName=new String(this.fileName.getBytes("utf-8"),"ISO8859-1"); 38 } catch (UnsupportedEncodingException e) { 39 // TODO Auto-generated catch block 40 e.printStackTrace(); 41 } 42 return fileName; 43 } 44 45 public void setFileName(String fileName) { 46 this.fileName = fileName; 47 } 48 49 public InputStream getStuReport() { 50 return stuReport; 51 } 52 53 public void setStuReport(InputStream stuReport) { 54 this.stuReport = stuReport; 55 } 56 57 58 59 /**当前台请求触发该方法,则先生成execl表格,存放在项目根目录指定的文件下。然后利用struts2的下载将该execl下载到请求客户端的电脑上 60 * 生成学生信息execl表格,并下载 61 * @Title: reportStudent 62 * @Description: TODO(这里用一句话描述这个方法的作用) 63 * @return 64 * @return String 返回类型 65 * @author 尚晓飞 66 * @date 2014-10-9 上午11:07:08 67 */ 68 public String reportStudent(){ 69 try { 70 fileName=studentService.stuList2Excel(); 71 String path=ServletActionContext.getServletContext().getRealPath("master")+File.separator+"report"+File.separator+fileName; 72 stuReport=new FileInputStream(path); 73 } catch (FileNotFoundException e) { 74 // TODO Auto-generated catch block 75 e.printStackTrace(); 76 } 77 return "inputStu"; 78 } 79 80 public String findById(){ 81 studentService.findById(1); 82 return null; 83 } 84 85 public String findByIdClassRoom(){ 86 classRoomService.findById(1); 87 return null; 88 } 89 90 91 92 93 94 public ClassRoomService getClassRoomService() { 95 return classRoomService; 96 } 97 98 public void setClassRoomService(ClassRoomService classRoomService) { 99 this.classRoomService = classRoomService; 100 } 101 102 public StudentService getStudentService() { 103 return studentService; 104 } 105 106 public void setStudentService(StudentService studentService) { 107 this.studentService = studentService; 108 } 109 110 111 112 113 114 115 116 117 }
三:生成execl表格的业务类,并将execl存入项目根目录指定文件下(省去dao层与数据库交互的方法)
1 package com.bjsxt.sxf.service.impl; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.text.DateFormat; 9 import java.text.SimpleDateFormat; 10 import java.util.Date; 11 import java.util.List; 12 13 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 14 import org.apache.poi.hssf.usermodel.HSSFSheet; 15 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 16 import org.apache.poi.hssf.util.CellRangeAddress; 17 import org.apache.poi.hssf.util.HSSFColor; 18 import org.apache.poi.ss.usermodel.Cell; 19 import org.apache.poi.ss.usermodel.CellStyle; 20 import org.apache.poi.ss.usermodel.CreationHelper; 21 import org.apache.poi.ss.usermodel.Font; 22 import org.apache.poi.ss.usermodel.IndexedColors; 23 import org.apache.poi.ss.usermodel.Row; 24 import org.apache.struts2.ServletActionContext; 25 import org.hibernate.dialect.IngresDialect; 26 27 import com.bjsxt.sxf.dao.StudentDao; 28 import com.bjsxt.sxf.po.ClassRoom; 29 import com.bjsxt.sxf.po.Student; 30 import com.bjsxt.sxf.service.StudentService; 31 /** 32 * 学生的业务类 33 * @ClassName: StudentServiceImpl 34 * @Description: TODO(这里用一句话描述这个类的作用) 35 * @author 尚晓飞 36 * @date 2014-10-9 下午5:24:04 37 * 38 */ 39 public class StudentServiceImpl implements StudentService{ 40 private StudentDao studentDao; 41 42 /** 43 * 添加一个学生 44 * @Title: addStudent 45 * @Description: TODO(这里用一句话描述这个方法的作用) 46 * @author 尚晓飞 47 * @date 2014-10-9 下午5:24:29 48 * @param student 49 * @see com.bjsxt.sxf.service.StudentService#addStudent(com.bjsxt.sxf.po.Student) 50 */ 51 @Override 52 public void addStudent(Student student) { 53 // TODO Auto-generated method stub 54 studentDao.add(student); 55 56 } 57 58 59 /** 60 * 查询出指定id的学生 61 * @Title: findById 62 * @Description: TODO(这里用一句话描述这个方法的作用) 63 * @author 尚晓飞 64 * @date 2014-10-9 下午5:24:42 65 * @param id 66 * @return 67 * @see com.bjsxt.sxf.service.StudentService#findById(java.lang.Integer) 68 */ 69 @Override 70 public Student findById(Integer id) { 71 Student student=studentDao.find(id); 72 ClassRoom cls=student.getClassRoom(); 73 System.out.println("StudentServiceImpl.findById()"+cls.getName()); 74 return student; 75 } 76 77 78 /** 79 * 将学生信息生成excel表格,并写入项目根目录下 80 * @Title: stuList2Excel 81 * @Description: TODO(这里用一句话描述这个方法的作用) 82 * @author 尚晓飞 83 * @date 2014-10-9 上午11:28:57 84 * @return 85 * @see com.bjsxt.sxf.service.StudentService#stuList2Excel() 86 */ 87 @Override 88 public String stuList2Excel() { 89 // TODO Auto-generated method stub 90 //查询出所有学生的信息【要生成execl的java对象】 91 List<Student> students=studentDao.queryAll(); 92 //标题行 93 Date date=new Date(); 94 DateFormat format=new SimpleDateFormat("yyyy-MM-dd"); 95 String tilte=format.format(date)+"学生信息表"; 96 97 //列名行 98 String[] valueT={"学生id","学生姓名","学生性别","所在班级名称"}; 99 100 //第一步:创建excel文件 101 //HSSFWorkbook表示以xls为后缀名的文件 102 HSSFWorkbook wb=new HSSFWorkbook(); 103 //获得CreationHelper对象,这个应该是一个帮助类 104 CreationHelper helper = wb.getCreationHelper(); 105 //创建Sheet并给名字(表示Excel的一个Sheet) 106 HSSFSheet sheet1 = wb.createSheet("学生信息表"); 107 HSSFCellStyle cellStyle = wb.createCellStyle(); 108 109 //设置单元格边框 110 //设置一个单元格边框样式 111 cellStyle.setBorderBottom(CellStyle.BORDER_THICK); 112 cellStyle.setBorderTop(CellStyle.BORDER_THICK); 113 cellStyle.setBorderLeft(CellStyle.BORDER_THICK); 114 cellStyle.setBorderRight(CellStyle.BORDER_THICK); 115 116 //设置一个单元格边框的颜色 117 cellStyle.setRightBorderColor(IndexedColors.GREEN.getIndex()); 118 cellStyle.setLeftBorderColor(IndexedColors.GREEN.getIndex()); 119 cellStyle.setBottomBorderColor(IndexedColors.GREEN.getIndex()); 120 cellStyle.setTopBorderColor(IndexedColors.GREEN.getIndex()); 121 122 //设置单元格内容显示的位置 123 //上下 124 cellStyle.setAlignment(CellStyle.ALIGN_CENTER); 125 //设置左右 126 cellStyle.setVerticalAlignment(CellStyle.VERTICAL_BOTTOM); 127 128 //设置字体 129 Font font=wb.createFont(); 130 font.setFontName("黑体"); 131 font.setColor(HSSFColor.RED.index); 132 font.setFontHeight((short)500); 133 cellStyle.setFont(font); 134 135 //第二步:创建标题行(先创建单元格,再合并单元格) 136 Row titleRow=sheet1.createRow(0); 137 for(int i=0;i<valueT.length;i++){ 138 Cell cell=titleRow.createCell(i); 139 cell.setCellStyle(cellStyle); 140 141 } 142 //合并单元格 143 sheet1.addMergedRegion(new CellRangeAddress(0, 0, 0,valueT.length-1)); 144 Cell cellTitle=titleRow.getCell(0); 145 //标题行完成 146 cellTitle.setCellValue(tilte); 147 cellTitle.setCellStyle(cellStyle); 148 //设置列的宽度为内容的最大长度【设置列的显示宽度,防止不遮盖内容】 149 sheet1.autoSizeColumn(0, true); 150 151 152 153 //第三步:创建列名行 154 Row rowT=sheet1.createRow(1); 155 for(int i=0;i<valueT.length;i++){ 156 sheet1.autoSizeColumn(i, true); 157 Cell cellT=rowT.createCell(i); 158 cellT.setCellValue(valueT[i]); 159 cellT.setCellStyle(cellStyle); 160 } 161 162 //第四步创建内容行 163 for(int a=0;a<students.size();a++){ 164 Row row=sheet1.createRow(a+2); 165 Student student=students.get(a); 166 167 //id 168 sheet1.autoSizeColumn(0, true); 169 Cell cellId=row.createCell(0); 170 cellId.setCellValue(student.getId()); 171 cellId.setCellStyle(cellStyle); 172 173 //姓名 174 sheet1.autoSizeColumn(1, true); 175 Cell cellName=row.createCell(1); 176 cellName.setCellValue(student.getName()); 177 cellName.setCellStyle(cellStyle); 178 179 //性别 180 sheet1.autoSizeColumn(2, true); 181 Cell cellSex=row.createCell(2); 182 cellSex.setCellValue(student.getSex()); 183 cellSex.setCellStyle(cellStyle); 184 185 //班级名称 186 sheet1.autoSizeColumn(3, true); 187 Cell cellClassName=row.createCell(3); 188 cellClassName.setCellValue(student.getClassRoom().getName()); 189 cellClassName.setCellStyle(cellStyle); 190 191 192 } 193 194 //输出保存的文件名 195 DateFormat format2=new SimpleDateFormat("yyyyMMddHHmmss"); 196 String fileName=format2.format(date)+"学生信息表.xls"; 197 198 //创建一个存放学生信息表的文件在项目根目录下 199 File file=new File(ServletActionContext.getServletContext().getRealPath("master")+File.separator+"report"); 200 if(!file.exists()){ 201 file.mkdir(); 202 } 203 //输出 204 OutputStream os; 205 try { 206 //输出到项目根目录下 207 os = new FileOutputStream(file+File.separator+fileName); 208 wb.write(os); 209 os.close(); 210 } catch (IOException e) { 211 // TODO Auto-generated catch block 212 e.printStackTrace(); 213 } 214 215 216 217 return fileName; 218 } 219 220 221 222 public StudentDao getStudentDao() { 223 return studentDao; 224 } 225 226 public void setStudentDao(StudentDao studentDao) { 227 this.studentDao = studentDao; 228 } 229 230 231 }
四:效果图