码迷,mamicode.com
首页 > 其他好文 > 详细

POI导出Excel的几种情况

时间:2018-03-14 12:47:39      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:email   ref   har   leo   cep   cas   工作薄   字段   tor   

 
第一种:常见导出【已知表头(长度一定),已知表数据(具体一个对象的集合,并已知对象各个属性的类型)】
第二种:不常见导出【已知表头(长度不定),已知表数据(没有具体对象,装在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对象的所有属性(首字母大写)

技术分享图片

有不懂的可以问我,也欢迎大家指点!(格式不太会调)

 

POI导出Excel的几种情况

标签:email   ref   har   leo   cep   cas   工作薄   字段   tor   

原文地址:https://www.cnblogs.com/zdd-/p/8566370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!