最近项目多处用到excel导出功能,每次都要copy上次写好的导出代码来改,太麻烦,干脆写了一个稍微可以通用的导出excel代码,/** * Created by DX.liu on 2015/4/14. */ public class ExportUtil { /** * * @param <T> *@param sheetName 创建的表格sheet名称 * @param params 需创建的excel列名数组,数组元素必须以“名称(filed)”命名 ,如:名称(name),其中‘name’是实体类中对应的字段名! * {"用户名(userName)","密码(password)","性别(sex)","邮箱(email)","年龄(age)","电话(phone)"} * @param objects 实体对象list * @return * @throws IllegalAccessException * @throws IllegalArgumentException */ public static <T> HSSFWorkbook exp(String sheetName,String[] params,List<T> objects) throws IllegalArgumentException, IllegalAccessException{ HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(sheetName); HSSFRow row = sheet.createRow(0); // 创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 创建一个居中格式 HSSFCell cell = null; String[] fields = new String[params.length]; for(int i=0;i<params.length;i++){ int x =params[i].indexOf("(");//获取“(”的下标位置 int y = params[i].indexOf(")");//获取“)”的下标位置 String str = params[i].trim().substring(x+1,y);//获取属性“field” String str1 = params[i].substring(0,x);//获取列名 fields[i] = str; cell = row.createCell(i); cell.setCellValue(str1); cell.setCellStyle(style); } for(int i=0;i<objects.size();i++){ row = sheet.createRow(i + 1); Class c = objects.get(i).getClass(); Field[] fields2 = c.getDeclaredFields();//获取所有属性 for(int j=0;j<fields.length;j++){ for(Field f : fields2){ f.setAccessible( true );//设置私有属性可见 String fieldName = f.getName(); if(fields[j].equals(fieldName)){ if(null != f.get(objects.get(i))){ row.createCell(j).setCellValue(""+f.get(objects.get(i))); }else{ row.createCell(j).setCellValue(""); } } } } } return workbook; } /** * * @param excellName 生成Excell文件名 * @param sheetName 创建的表格sheet名称 * @param params 需创建的excel列名数组,数组元素必须以“名称(filed)”命名 ,如:名称(name),其中‘name’是实体类中对应的字段名! * {"用户名(userName)","密码(password)","性别(sex)","邮箱(email)","年龄(age)","电话(phone)"} * @param objects 实体对象list * @param response * @param <T> */ public static <T>void exportExcell(String excellName,String sheetName,String[] params,List<T> objects,HttpServletResponse response) { OutputStream os = null; try { response.addHeader("Content-Disposition", "attachment;filename=" + new String(excellName.getBytes("GBK"), "ISO-8859-1")); os = response.getOutputStream(); HSSFWorkbook workbook = exp(sheetName, params, objects); workbook.write(os); os.close(); }catch (Exception e){ e.printStackTrace(); }finally { if(null != os){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
利用Java反射、泛型和apache/poi编写可通用的导出Excel代码
最新推荐文章于 2022-09-10 11:49:03 发布