poi 导出Excel 使用工具类

来源:互联网 发布:全职烽火知韩百度云 编辑:程序博客网 时间:2024/06/04 20:03

今天公司有一个新的功能需求,就是用导出excel,上网搜了一下,大部分都是推荐使用poi,于是研究了一下poi,并且整合成了一个工具类,方便以后使用
首先导入poi的jar包,是在网上下载的,导入到项目中就可以用了。

/**     *      *功能:      *@param excelHeader 表头内容数组     *@param list   需要显示的List数据     *@param model  显示的表头内容独立出一个model     *@param excelName  excel  sheet的名字     *@param cellName excel中的标题     *@return     */     public static HSSFWorkbook export(String[] excelHeader,List list,Object model,String excelName,String cellName) {            HSSFWorkbook wb = new HSSFWorkbook();//创建一个EXCEL              HSSFSheet sheet = wb.createSheet(excelName);   //创建一个Excel的Sheet             int[] excelHeaderWidth = { 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150 };            // 设置字体                HSSFFont headfont = wb.createFont();                headfont.setFontName("黑体");                headfont.setFontHeightInPoints((short) 10);// 字体大小                headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗              HSSFCellStyle headstyle = wb.createCellStyle();                headstyle.setFont(headfont);                headstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中                headstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中                headstyle.setLocked(true);                headstyle.setWrapText(true);// 自动换行             // 创建第一行                HSSFRow row0 = sheet.createRow(0);                // 设置行高                row0.setHeight((short) 900);                // 创建第一列                HSSFCell cell0 = row0.createCell(0);                cell0.setCellValue(new HSSFRichTextString(cellName));                cell0.setCellStyle(headstyle);                /**               * 合并单元格               *    第一个参数:第一个单元格的行数(从0开始)               *    第二个参数:第二个单元格的行数(从0开始)               *    第三个参数:第一个单元格的列数(从0开始)               *    第四个参数:第二个单元格的列数(从0开始)               */                CellRangeAddress range = new CellRangeAddress(0, 0, 0,15);                sheet.addMergedRegion(range);             HSSFRow row = sheet.createRow(1);              HSSFCellStyle style = wb.createCellStyle();              style.setAlignment(HSSFCellStyle.ALIGN_CENTER);            for (int i = 0; i < excelHeader.length; i++) {                  HSSFCell cell = row.createCell(i);                  cell.setCellValue(excelHeader[i]);                  cell.setCellStyle(style);                  sheet.autoSizeColumn(i);              }              sheet.autoSizeColumn(8);              for (int i = 0; i < excelHeaderWidth.length; i++) {                sheet.setColumnWidth(i, 32 * excelHeaderWidth[i]);            }            for (int i = 0; i < list.size(); i++) {                  row = sheet.createRow(i + 2);                  model= list.get(i);                Object[] obj1=getFiledValues(model);                String str="";                for(int j = 0; j < obj1.length; j++){                    Object obj2  = obj1[j];                    if(Check.isNotNull(obj2)){                         str  = obj2.toString();                    }//                  System.out.println(str);                    row.createCell(j).setCellValue(str);                  }            }            return wb;          }

这个方法共有5个参数
excelHeader 是excel表头第一行显示,定义为数组,比如

String[] excelHeader= { "姓名","性别","年龄"};

list 是你需要显示的具体数据,放在一个list里面传进去
model 需要显示的数据自定义一个model出来,这样可以直接获取到对象属性名称和属性值,不需要一个一个get出来

 private static Object getFieldValueByName(String fieldName, Object o) {                try {                    String firstLetter = fieldName.substring(0, 1).toUpperCase();                    String getter = "get" + firstLetter + fieldName.substring(1);                    Method method = o.getClass().getMethod(getter, new Class[] {});                    Object value = method.invoke(o, new Object[] {});                    return value;                } catch (Exception e) {                    System.out.println("属性不存在");                    return null;                }            }        private static String[] getFiledName(Object o){              Field[] fields=o.getClass().getDeclaredFields();              String[] fieldNames=new String[fields.length];              for(int i=0;i<fields.length;i++){                  fieldNames[i]=fields[i].getName();              }              return fieldNames;          }        public static Object[] getFiledValues(Object o){              String[] fieldNames=getFiledName(o);              Object[] value=new Object[fieldNames.length];              for(int i=0;i<fieldNames.length;i++){                  value[i]=getFieldValueByName(fieldNames[i], o);              }              return value;          } 

excelName 是excel sheet的名字

cellName 是excel的大标题

值传好后,excel就建好了,接下来只需要自动下载下来就行了

    /**     *      *功能:      *@param name  浏览器下载显示的名字     *@param wb 创建的excel文件     *@param response 发送到浏览器     */    public static void fileName(String name, HSSFWorkbook wb,HttpServletResponse response){        response.setContentType("application/vnd.ms-excel");         response.setCharacterEncoding("utf-8");         try {            response.setHeader("Content-disposition", "attachment;filename="+new String(name.getBytes("GBK"),"ISO-8859-1")+".xls");            OutputStream ouputStream = response.getOutputStream();              wb.write(ouputStream);              ouputStream.flush();              ouputStream.close();        } catch (Exception e) {            e.printStackTrace();        }      }

这个只是简单的用poi导出excel,所以excel的样式并不是很丰富。追求样式美观,可以在研究研究。