第一种:常见导出【已知表头(长度一定),已知表数据(具体一个对象的集合,并已知对象各个属性的类型)】
第二种:不常见导出【已知表头(长度不定),已知表数据(没有具体对象,装在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的几种情况的更多相关文章

  1. POI导出excel的三种方式

    原文链接:https://www.cnblogs.com/zhaoblog/p/7661245.html poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产 ...

  2. 复杂的POI导出Excel表格(多行表头、合并单元格)

    poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...

  3. 关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结

    poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产生内存溢出问题,SXSSFWorkbook是一种大数据量导出格式,csv是另一种excel导出的一种轻快的 ...

  4. POI导出excel的简单demo

    目前使用过两种导出excel的方式,一种是如题所示的使用POI的方式进行数据的导出,这种方式一般只有在处理比较多的数据或者说需要导出的excel表格中有图片之类的需要特殊处理的文件的时候使用:还有一种 ...

  5. 使用POI导出Excel(二)-利用模板

    一.基本操作见: 使用POI导出Excel 二.本次功能需求 给了一个模板,里面有6个sheet页,每页里面都需要填充相应的数据.如图: 三.需求分析 1.分了6个sheet页,每页的数据都不一样,首 ...

  6. java解决poi导出excel文字水印,导出excel不可操作问题

    首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...

  7. 重构:以Java POI 导出EXCEL为例

    重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...

  8. 重构:以Java POI 导出EXCEL为例2

    前言 上一篇博文已经将一些对象抽象成成员变量以及将一些代码块提炼成函数.这一节将会继续重构原有的代码,将一些函数抽象成类,增加成员变量,将传入的参数合成类等等. 上一篇博文地址:http://www. ...

  9. 关于poi导出excel方式HSSFWorkbook(xls).XSSFWorkbook(xlsx).SXSSFWorkbook.csv的总结

    1.HSSFWorkbook(xls) import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermo ...

随机推荐

  1. iOS 使用NTP时间同步服务

    githup上有相关开源库, ios-ntp 导入即可使用 NetworkClock *netClock = [NetworkClock sharedNetworkClock]; netClock.n ...

  2. 听闰土大话前端之ES6是怎么来的

    前言 相信做前端的朋友没有不知道ECMAScript6的,都知晓ES6新增了不少新的特性,但是你知道ES6是怎么来的吗?今天就让闰土来带大家大话ES6的前世今生.当然了,这篇文章会以扫盲为主,科普为辅 ...

  3. IntelliJ IDEA(八) :git的使用

    项目管理离不开版本控制,目前主流版本控制工具大概就是SVN和Git,至于两者有啥区别这里就不详细介绍了,如果有不明白的可以上网查资料,后期如果有机会我再开篇栏目细说,而且现在市场上Git的使用率已经远 ...

  4. mysql数据库外部无法访问

    有以下两种情况: 1.mysql未分配访问权限 格式:grant 权限 on 数据库名.表名 用户@登录主机 identified by "用户密码"; grant select, ...

  5. js中的typeof和instanceof和===

    typeof: 用于判断number/string/boolean/underfined类型/function 不能判断:null和object ,不能区分object和Array instanceo ...

  6. SpringBoot 中常用注解

    本篇博文将介绍几种SpringBoot 中常用注解 其中,各注解的作用为: @PathVaribale 获取url中的数据 @RequestParam 获取请求参数的值 @GetMapping 组合注 ...

  7. (MonoGame从入门到放弃-2) 初识MonoGame

    上一节记录了大致的搭建MonoGame的环境,默认大家都是都是使用过Visual Studio的,没使用过的话,可以去https://www.visualstudio.com/下载一个试试,社区版免费 ...

  8. Visual Studio 环境路径答疑!

    工程目录结构如下: Console │ Console.sln │ Console.VC.db │ ├─Console │ │ Console.cpp │ │ Console.vcxproj │ │ ...

  9. javascript对象(简略)

    javascript对象有着自有的属性,对象可以从一个称为原型的对象继承属性,对象的方法通常是继承的属性,原型式继承是javascript的核心特征.

  10. ORACLE透明网关访问SQL Server配置总结

      透明网关概念 ORACLE透明网关(Oracle Transparent Gateway)可以解决ORACLE数据库和非ORACLE数据库交互数据的需求.在一个异构的分布式环境中,通过ORACLE ...