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

    HTTPS协议 一.为什么需要https 1.HTTP是明文传输的,也就意味着,介于发送端.接收端中间的任意节点都可以知道你们传输的内容是什么.这些节点可能是路由器.代理等. 举个最常见的例子,用户登 ...

  2. mysql5.7中解决中文乱码的问题

    在使用mysql5.7时,会发现通过web端向数据库中写入中文后会出现乱码,但是在数据库中直接操作SQL语句插入数据后中文就显示正常,这个问题怎么解决呢?此处不对mysql的数据编码过程和原理进行讲解 ...

  3. C编程之 一个容易忽视但是十分严重的小错误

    while(...) { ...if(a=b) continue; } 调试时就一直执行continue.一直找不到原因,后面才发现是少一个"=": 还有一次就是也是在if中,if ...

  4. hdu1496 打表

    通常可以想到直接四个for枚举,但是会超时.就算只用三个for也很危险.可以用打表的方法将时间复杂度降到O(n^2),注意到x1,x2,x3,x4的取值区间是关于零对称的,因此可以只考虑正整数部分,洗 ...

  5. Docker系列二:Docker的基本结构

    Docker的基本结构 Docker 的三大基础组件 Docker有三个重要的概念:仓库 , 镜像 和 容器 ,它们是Docker的三大基出组件 Docker的组织结构 Docker处于操作系统和虚拟 ...

  6. 关于 Java 面试,你应该准备这些知识点

    来源:占小狼, www.jianshu.com/p/1b2f63a45476 马老师说过,员工的离职原因很多,只有两点最真实: 钱,没给到位 心,受委屈了 当然,我是想换个平台,换个方向,想清楚为什么 ...

  7. WebApi 参数绑定方法

    WebAPI 2参数绑定方法   简单类型参数 Example 1: Sending a simple parameter in the Url 01 02 03 04 05 06 07 08 09 ...

  8. 第5章 PCIe总线的事务层

    事务层是PCIe总线层次结构的最高层,该层次将接收PCIe设备核心层的数据请求,并将其转换为PCIe总线事务,PCIe总线使用的这些总线事务在TLP头中定义.PCIe总线继承了PCI/PCI-X总线的 ...

  9. dojo实现省份地市级联---省份数据源

    province.json: { "identifier": "id", "label": "name", " ...

  10. java.text.ParseException: Unparseable date: "2015-06-09 hh:56:19"

    1.错误描述 [DEBUG:]2015-06-09 16:56:19,520 [-------------------transcation start!--------------] java.te ...