一、poi是什么?
poi是Apache旗下的一个中间件,主要针对 Office 格式的文件 读写的专门的工具库。主要操作excel 读写。
二、为什么要用POI?
-
可以将数据写入excel,让用户可以共享数据
-
作为备份数据,方便还原数据。
- 介绍一下另外一个中间件jxl,它也是读写excel的中间件,但是它只能读写excel2003,而poi支持操作整个office文件。
- 在读取大数据量时,查询数据效率要比poi低。
- 单sheet(工作表)存放数据量比poi要小。jxl 大概可以存放 行:65536 列:256; poi 大概可以存放 行:1048576 百万数据 列:16384;
三、使用poi中间件的几个步骤
点连接
打开刚刚下载的包,再找出具体用到的jar包,然后导jar包:
操作excel的几个步骤:
相关代码:
@Test public void testPoi() throws Exception{ //1.创建工作簿 Workbook wb = new XSSFWorkbook(); //2.创建工作表Sheet Sheet sheet = wb.createSheet(); //3.创建行对象Row Row row = sheet.createRow(3); //下标从0开始 //4.创建单元格对象 从0记数 Cell cell = row.createCell(3); //5.设置单元格内容 cell.setCellValue("test"); //6.设置单元格的样式 CellStyle cellStyle = wb.createCellStyle(); Font font = wb.createFont();//创建字体对象 font.setFontName("叶根友毛笔行书2.0版");//设置字体名称 font.setFontHeightInPoints((short)48);//设置字体大小 cellStyle.setFont(font);//样式中添加一个字体样式 cell.setCellStyle(cellStyle); //7.保存,关闭流 OutputStream os = new FileOutputStream("C:/test/abc.xlsx");//创建一个输出流 wb.write(os); os.close(); }
利用反射写的通用的数据导出
package core.Utils; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List; import javax.servlet.ServletOutputStream; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.util.CellRangeAddress; public class ExcelUtil { public static void exportExcel(List<?> objlist,ServletOutputStream out,String bigTitle,String[] objTitle,String[] objParams){ try { //创建工作簿 HSSFWorkbook wbook = new HSSFWorkbook(); //创建工作表并设置大标题 HSSFSheet sheet = wbook.createSheet(bigTitle); //大标题 创建合拼单元格对象 首行 结束行 首列 结束列 CellRangeAddress cra=new CellRangeAddress(0,0,0,5); //大标题加载合拼单元格 sheet.addMergedRegion(cra); //大标题样式 HSSFCellStyle cs = createCellStyle(wbook, (short)24); //默认列宽 sheet.setDefaultColumnWidth(25); HSSFRow row = sheet.createRow(0); HSSFCell cell=row.createCell(0); cell.setCellStyle(cs); cell.setCellValue(bigTitle); //小标题 HSSFCellStyle cs2 = createCellStyle(wbook, (short)16); sheet.setDefaultColumnWidth(25); HSSFRow row2 = sheet.createRow(1); for(int i=0;i<objTitle.length;i++){ HSSFCell cell2=row2.createCell(i); cell2.setCellStyle(cs2); cell2.setCellValue(objTitle[i]); } //把所有对象的列表传进来 然后把每个对象输出 //反射调用传进来的类的方法 为了设置单元格的值 Field[] f = new Field[objParams.length]; if(objlist!=null){ for(int j=0;j<objlist.size();j++){ //获取每个对象 Class<?> clazz=objlist.get(j).getClass(); //把从action构建的对象每一个变量名弄到Field数组 for(int i=0;i<objParams.length;i++){ Field fi=clazz.getDeclaredField(objParams[i]); f[i]=fi; } //创建行 从第三行开始 //大标题和栏目占了俩行 所以要加2 HSSFRow row3 = sheet.createRow(j+2); for(int i=0;i<f.length;i++){ //根据上面的Field数组里面的变量名 通过PropertyDescriptor获取真正的类变量 PropertyDescriptor pd=new PropertyDescriptor(f[i].getName(),clazz); //获取变量的方法 Method getMethod=pd.getReadMethod(); if(getMethod.invoke(objlist.get(j))!=null){ //执行方法 Object s=getMethod.invoke(objlist.get(j)); // System.out.println("sss"+s); HSSFCell cell1=row3.createCell(i); //判断是否是性别栏 if(i==2){ //1就是男 if(s.equals(1)){ cell1.setCellValue("男"); }else{ cell1.setCellValue("女"); } }else{ cell1.setCellValue(s.toString()); } } } } } //写出 wbook.write(out); wbook.close(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @SuppressWarnings("deprecation") private static HSSFCellStyle createCellStyle(HSSFWorkbook wbook, short s) { // TODO Auto-generated method stub HSSFCellStyle style = wbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //创建字体 HSSFFont font = wbook.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字体 font.setFontHeightInPoints(s);//设置字体大小 //加载字体 style.setFont(font); return style; } }
action
导出来后的execlpublic void exExcel(){ try { HttpServletResponse res = ServletActionContext.getResponse(); //设置回应的类型 res.setContentType("application/x-execl"); //设置响应头 res.setHeader("Content-Disposition", "attachment;filename=" + new String("用户列表.xls".getBytes(), "ISO-8859-1")); ServletOutputStream out = res.getOutputStream(); String[] objParams={"workerNo","workerName","workerSex","workerPro","workerTel","workerPwd","state"}; String[] objTitle={"工号","职工姓名","性别","职称等级","职工手机","职工密码","状态"}; List<Worker> l=workerService.findObjects(); workerService.exExcel(l, out, "职工列表", objTitle, objParams); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }