第一种:常见导出【已知表头(长度一定),已知表数据(具体一个对象的集合,并已知对象各个属性的类型)】
第二种:不常见导出【已知表头(长度不定),已知表数据(没有具体对象,装在String类型的集合中)】
第三种:复杂导出【已知表头(长度不定,由第一个对象中的属性组成),已知表数据(具体一个对象的集合,未知对象的属性的类型,未知对象的属性)】
都需要用到的maven依赖包:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.15</version> </dependency>
第一种:常见导出【已知表头(长度一定),已知表数据(具体一个对象的集合,并已知对象各个属性的类型)】
表数据集合:List<User> valueList
Demo.java
// User是需要导出的对象的类型 public BaseResult createExcelToDisk(List<User> valueList){ // 创建工作薄 HSSFWorkbook wb = new HSSFWorkbook(); // 创建工作表,工作表的名字自定义,这里叫User表导出 HSSFSheet sheet = wb.createSheet("User表导出"); // 创建第一行 HSSFRow row = sheet.createRow(0); // 创建第一行的第一个单元格 HSSFCell cell = row.createCell(0); // 赋值
cell.setCellValue("姓名");
cell = row.createCell(1);
cell.setCellValue("密码");
cell = row.createCell(2);
cell.setCellValue("性别");
cell = row.createCell(3);
cell.setCellValue("生日");
cell = row.createCell(4);
cell.setCellValue("邮箱");
// ---------------至此,表头创建完毕---------------------------------- // 循环表数据集合 for (int i = 0; i < valueList.size(); i++) { // 创建新的一行 row = sheet.createRow((int) i + 1); // 获取单个对象u User u = valueList.get(i); // 给新的单元格赋值 row.createCell(0).setCellValue(u.getUsername()); row.createCell(1).setCellValue(u.getPassword()); // 1男 2女 if(u.getSex() == 1){ System.out.println("进入性别判断方法::"); System.out.println("性别字段的值::" + u.getSex()); row.createCell(2).setCellValue("男"); }else{ System.out.println("进入性别判断方法2::"); System.out.println("性别字段的值2::" + u.getSex()); row.createCell(2).setCellValue("女"); } // 生日类型转换 Timestamp timestamp = u.getBirthday(); String tsStr = ""; DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); tsStr = sdf.format(timestamp); // 没有特殊需要转换的类型 继续赋值 row.createCell(3).setCellValue(tsStr); row.createCell(4).setCellValue(s.getEmail()); } try { FileOutputStream fos = new FileOutputStream("F:/User.xls"); wb.write(fos); fos.close(); } catch (Exception e) { return new BaseResult(true, "导出失败!"); } return new BaseResult(true, "导出成功!"); }
第二种:不常见导出【已知表头(长度不定),已知表数据(没有具体对象,装在String类型的集合中)】
表头集合:List<String> keyList
表数据集合:List<String> valueList
Demo.java
// 传入两个集合参数 public BaseResult createExcelToDisk(List<String> keyList,List<String> valueList){ // 创建工作薄 HSSFWorkbook wb = new HSSFWorkbook(); // 创建工作表,工作表的名字自定义,这里叫User表导出 HSSFSheet sheet = wb.createSheet("User表导出"); // 创建第一行 HSSFRow row = sheet.createRow(0); // 创建第一行的第一个单元格 HSSFCell cell = row.createCell(0); // 赋值 for (int i = 0; i < keyList.size(); i++) { // 设置列宽 sheet.setColumnWidth(i, 5000); // 设置表头 cell.setCellValue(keyList.get(i)); // 创建新的单元格 cell = row.createCell(i + 1); } // ---------------至此,表头创建完毕---------------------------------- for (int i = 0; i < valueList.size(); i++) { row = sheet.createRow((int) i + 1); // object : [测试姓名1,32] Object object = valueList.get(i); // substring : 测试姓名1,32 String substring = object.toString().substring(1, object.toString().length()-1); // split : 测试姓名1 32 String[] split = substring.split(","); for(int j = 0; j<split.length; j++){ row.createCell(j).setCellValue(split[j]); } } try { FileOutputStream fos = new FileOutputStream("F:/User.xls"); wb.write(fos); fos.close(); } catch (Exception e) { return new BaseResult(true, "导出失败!"); } return new BaseResult(true, "导出成功!"); }
第三种:复杂导出【已知表头(长度不定),已知表数据(具体一个对象的集合,未知对象的属性的类型,未知对象的属性)】
表头集合:List<Field> keyList
表数据集合:List<ConFie> valueList
Demo.java
public BaseResult createExcelToDisk(List<Field>fieldList ,List<Confie>contactsList) { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("导出sheet"); HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); // 得到所有属性 List<String> conFields = this.getFiledName(contactsList.get(0)); Map<String, Object> map = new TreeMap<>(); PropertyDescriptor[] pd; try { pd = Introspector.getBeanInfo(ConFie.class).getPropertyDescriptors(); for (int i = 0; i < contactsList.size(); i++) { for (String str : conFields) { for (PropertyDescriptor p : pd) { if (str.equalsIgnoreCase(p.getName())) { map.put(str + i, p.getReadMethod().invoke(contactsList.get(i))); } } } } System.out.println(map.toString()); } catch (Exception e) { e.printStackTrace(); } for (int i = 0; i < fieldList.size(); i++) { // 设置列宽 sheet.setColumnWidth(i, 5000); // 字段备注,作为表头 cell.setCellValue(fieldList.get(i).getFieldNotes()); cell = row.createCell(i + 1); } for (int i = 0; i < contactsList.size(); i++) { row = sheet.createRow((int) i + 1); // 循环字段集合 赋值 for (int j = 0; j < fieldList.size(); j++) { String value = String.valueOf(map.get(fieldList.get(j).getDefName() + i)); if(fieldList.get(j).getDefName().equals("ContactsSex")){ if(String.valueOf(map.get(fieldList.get(j).getDefName() + i)).equals("0")){ value = "女"; }else{ value = "男"; } } // 创建新单元格 row.createCell(j).setCellValue(value); } } try { FileOutputStream fos = new FileOutputStream("F:/contacts.xls"); wb.write(fos); fos.close(); } catch (Exception e) { return new BaseResult(true, "导出失败!"); } return new BaseResult(true, "导出成功!"); }
// 得到所有属性 public List<String> getFiledName(ConFie contacts) { Class<? extends ConFie> contactsClass = contacts.getClass(); java.lang.reflect.Field[] fields = contactsClass.getDeclaredFields(); List<String> strList = new ArrayList<>(); for (java.lang.reflect.Field field : fields) { // 获得字符串名字 String userFieldName = field.getName(); // 字符串首字母大写 char[] cs = userFieldName.toCharArray(); cs[0] -= 32; strList.add(String.valueOf(cs)); System.out.println(String.valueOf(cs)); } return strList; }
注:defName的值是Confie对象的所有属性(首字母大写)
有不懂的可以问我,也欢迎大家指点!(格式不太会调)