java导出excl POI
importjava.io.BufferedInputStream; importjava.io.BufferedOutputStream; importjava.io.ByteArrayInputStream; importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.lang.reflect.Field; importjava.lang.reflect.Method; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.List; importjava.util.Map; importjavax.servlet.ServletOutputStream; importjavax.servlet.http.HttpServletResponse; importorg.apache.poi.hssf.usermodel.HSSFWorkbook; importorg.apache.poi.ss.usermodel.Cell; importorg.apache.poi.ss.usermodel.CellStyle; importorg.apache.poi.ss.usermodel.Font; importorg.apache.poi.ss.usermodel.IndexedColors; importorg.apache.poi.ss.usermodel.Row; importorg.apache.poi.ss.usermodel.Sheet; importorg.apache.poi.ss.usermodel.Workbook; importcom.dodo.reseller.domain.sys.supermarket.Supermarket; importcom.dodo.reseller.utils.ExclUtilPo; /** *导出Excel文档工具类 * *@author *@date2015-09-14 */ publicclassExcelUtil{ /** *创建excel文档, * *@paramlist *数据 *@paramkeys *list中map的key数组集合 *@paramcolumnNames *excel的列名 */ publicstaticWorkbookcreateWorkBook(List<Map<String,Object>>list,String[]keys,StringcolumnNames[]){ //创建excel工作簿 Workbookwb=newHSSFWorkbook(); //创建第一个sheet(页),并命名 Sheetsheet=wb.createSheet(list.get(0).get("sheetName").toString()); //手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。 for(inti=0;i<keys.length;i++){ sheet.setColumnWidth((short)i,(short)(35.7*150)); } //创建第一行 Rowrow=sheet.createRow((short)0); row.setHeight((short)500); //创建两种单元格格式 CellStylecs=wb.createCellStyle(); CellStylecs2=wb.createCellStyle(); //创建两种字体 Fontf=wb.createFont(); Fontf2=wb.createFont(); //创建第一种字体样式(用于列名) f.setFontHeightInPoints((short)10); f.setColor(IndexedColors.BLACK.getIndex()); f.setBoldweight(Font.BOLDWEIGHT_BOLD); //创建第二种字体样式(用于值) f2.setFontHeightInPoints((short)10); f2.setColor(IndexedColors.BLACK.getIndex()); //Fontf3=wb.createFont(); //f3.setFontHeightInPoints((short)10); //f3.setColor(IndexedColors.RED.getIndex()); //设置第一种单元格的样式(用于列名) cs.setFont(f); cs.setBorderLeft(CellStyle.BORDER_THIN); cs.setBorderRight(CellStyle.BORDER_THIN); cs.setBorderTop(CellStyle.BORDER_THIN); cs.setBorderBottom(CellStyle.BORDER_THIN); cs.setAlignment(CellStyle.ALIGN_CENTER); //设置第二种单元格的样式(用于值) cs2.setFont(f2); cs2.setBorderLeft(CellStyle.BORDER_THIN); cs2.setBorderRight(CellStyle.BORDER_THIN); cs2.setBorderTop(CellStyle.BORDER_THIN); cs2.setBorderBottom(CellStyle.BORDER_THIN); cs2.setAlignment(CellStyle.ALIGN_CENTER); //设置列名 for(inti=0;i<columnNames.length;i++){ Cellcell=row.createCell(i); cell.setCellValue(columnNames[i]); cell.setCellStyle(cs); } //设置每行每列的值 for(shorti=1;i<list.size();i++){ //Row行,Cell方格,Row和Cell都是从0开始计数的 //创建一行,在页sheet上 Rowrow1=sheet.createRow((short)i); //在row行上创建一个方格 for(shortj=0;j<keys.length;j++){ Cellcell=row1.createCell(j); cell.setCellValue(list.get(i).get(keys[j])==null?"":list.get(i).get(keys[j]).toString()); cell.setCellStyle(cs2); } } returnwb; } /** *封装最上层导出Excl方法 *@privateList<Object>list; *@privateString[]keys;//参数字段 *@privateStringcolumnNames[];//列名称与参数keys对应 *@privateStringfileName;//生成的文件名称 *@privateStringsheetNameK="sheetName"; *@privateStringsheetNameV="sheet1"; *@以上是必填字段 * *@paramexclUtilPo *@paramresponse */ publicstaticvoidexportExcl(ExclUtilPoexclUtilPo,HttpServletResponseresponse){ List<Map<String,Object>>list=createExcelRecord(exclUtilPo); exclUtilPo.setListAndMap(list); try{ exportExclFile(exclUtilPo,response); }catch(IOExceptione){ e.printStackTrace(); } } /** *把传递的list参数封装为List<Map<String,Object>> * *@paramexclUtilPo *@return */ privatestaticList<Map<String,Object>>createExcelRecord(ExclUtilPoexclUtilPo){ List<Map<String,Object>>listmap=newArrayList<Map<String,Object>>(); Map<String,Object>map=newHashMap<String,Object>(); map.put(exclUtilPo.getSheetNameK(),exclUtilPo.getSheetNameV()); listmap.add(map); List<Object>projects=exclUtilPo.getList(); intsize=projects.size(); try{ if(projects!=null&&!projects.isEmpty()){ for(intj=0;j<size;j++){ Map<String,Object>mapValue=newHashMap<String,Object>(); Objectproject=projects.get(j); getProperty(project,mapValue); listmap.add(mapValue); } } }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } returnlistmap; } /** *获得一个对象各个属性的字节流 */ @SuppressWarnings("unchecked") publicstaticvoidgetProperty(ObjectentityName,Map<String,Object>mapValue)throwsException{ Classc=entityName.getClass(); Fieldfield[]=c.getDeclaredFields(); for(Fieldf:field){ Objectv=invokeMethod(entityName,f.getName(),null); mapValue.put(f.getName(),v); System.out.println(f.getName()+"\t"+v+"\t"+f.getType()); } } /** *获得对象属性的值 */ @SuppressWarnings("unchecked") privatestaticObjectinvokeMethod(Objectowner,StringmethodName,Object[]args)throwsException{ ClassownerClass=owner.getClass(); methodName=methodName.substring(0,1).toUpperCase()+methodName.substring(1); Methodmethod=null; try{ method=ownerClass.getMethod("get"+methodName); }catch(SecurityExceptione){ }catch(NoSuchMethodExceptione){ return"can'tfind'get"+methodName+"'method"; } returnmethod.invoke(owner); } /** *使用流的方式生成Excl文件在页面导出 * *@paramexclUtilPo *@paramresponse *@throwsIOException */ publicstaticvoidexportExclFile(ExclUtilPoexclUtilPo,HttpServletResponseresponse)throwsIOException{ ByteArrayOutputStreamos=newByteArrayOutputStream(); try{ createWorkBook(exclUtilPo).write(os); }catch(IOExceptione){ e.printStackTrace(); } byte[]content=os.toByteArray(); InputStreamis=newByteArrayInputStream(content); //设置response参数,可以打开下载页面 response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename="+newString((exclUtilPo.getFileName()+".xls").getBytes(),"iso-8859-1")); ServletOutputStreamout=response.getOutputStream(); BufferedInputStreambis=null; BufferedOutputStreambos=null; try{ bis=newBufferedInputStream(is); bos=newBufferedOutputStream(out); byte[]buff=newbyte[2048]; intbytesRead; //Simpleread/writeloop. while(-1!=(bytesRead=bis.read(buff,0,buff.length))){ bos.write(buff,0,bytesRead); } }catch(finalIOExceptione){ throwe; }finally{ if(bis!=null) bis.close(); if(bos!=null) bos.close(); bos.flush(); } } /** *创建excel文档, * *@paramlist *数据 *@paramkeys *list中map的key数组集合 *@paramcolumnNames *excel的列名 */ publicstaticWorkbookcreateWorkBook(ExclUtilPoexclUtilPo){ //创建excel工作簿 Workbookwb=newHSSFWorkbook(); //创建第一个sheet(页),并命名 Sheetsheet=wb.createSheet(exclUtilPo.getListAndMap().get(0).get(exclUtilPo.getSheetNameK()).toString()); //手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。 String[]keys=exclUtilPo.getKeys(); intkeyslength=keys.length; for(inti=0;i<keyslength;i++){ sheet.setColumnWidth((short)i,(short)(35.7*150)); } //创建第一行 Rowrow=sheet.createRow((short)0); row.setHeight((short)500); //创建两种单元格格式 CellStylecs=wb.createCellStyle(); CellStylecs2=wb.createCellStyle(); //创建两种字体 Fontf=wb.createFont(); Fontf2=wb.createFont(); //创建第一种字体样式(用于列名) f.setFontHeightInPoints((short)10); f.setColor(IndexedColors.BLACK.getIndex()); f.setBoldweight(Font.BOLDWEIGHT_BOLD); //创建第二种字体样式(用于值) f2.setFontHeightInPoints((short)10); f2.setColor(IndexedColors.BLACK.getIndex()); //Fontf3=wb.createFont(); //f3.setFontHeightInPoints((short)10); //f3.setColor(IndexedColors.RED.getIndex()); //设置第一种单元格的样式(用于列名) cs.setFont(f); cs.setBorderLeft(CellStyle.BORDER_THIN); cs.setBorderRight(CellStyle.BORDER_THIN); cs.setBorderTop(CellStyle.BORDER_THIN); cs.setBorderBottom(CellStyle.BORDER_THIN); cs.setAlignment(CellStyle.ALIGN_CENTER); //设置第二种单元格的样式(用于值) cs2.setFont(f2); cs2.setBorderLeft(CellStyle.BORDER_THIN); cs2.setBorderRight(CellStyle.BORDER_THIN); cs2.setBorderTop(CellStyle.BORDER_THIN); cs2.setBorderBottom(CellStyle.BORDER_THIN); cs2.setAlignment(CellStyle.ALIGN_CENTER); //设置列名 String[]columnNames=exclUtilPo.getColumnNames(); intcolumnNameslength=columnNames.length; for(inti=0;i<columnNameslength;i++){ Cellcell=row.createCell(i); cell.setCellValue(columnNames[i]); cell.setCellStyle(cs); } //设置每行每列的值 List<Map<String,Object>>listAndMap=exclUtilPo.getListAndMap(); intlistAndMapSize=listAndMap.size(); for(shorti=1;i<listAndMapSize;i++){ //Row行,Cell方格,Row和Cell都是从0开始计数的 //创建一行,在页sheet上 Rowrow1=sheet.createRow((short)i); //在row行上创建一个方格 for(shortj=0;j<keys.length;j++){ Cellcell=row1.createCell(j); cell.setCellValue( listAndMap.get(i).get(keys[j])==null?"":listAndMap.get(i).get(keys[j]).toString()); cell.setCellStyle(cs2); } } returnwb; } }