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

    [poj3565]Ants 标签(空格分隔):二分图 描述 Young naturalist Bill studies ants in school. His ants feed on plant-l ...

  2. Python中高阶函数sorted()用法

    在Python中,有内置的排序方法:sorted(iterable, key, reverse). Sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序.key指定的函数 ...

  3. python3基础入门-知识点简记

    1.基础语法 编码.标识符.保留字.注释.行与缩进... 2.变量类型 (1)Python3有6个标准的数据类型: Numbers(数字)  数字数据类型用于存储数值  不可改变的数据类型 可细分为  ...

  4. Taurus.MVC 2.2.3.4 :WebAPI 实现权限控制认证(及功能增强说明)

    前言: 前两天,当我还在老家收拾行旅,准备回广州,为IT连的创业再战365天时, 有网友扣上问:Taurus.MVC中如何实现认证和权限控制,最好能做个小例子. 我一不小心回了句:等回广州我再写篇文章 ...

  5. Js比较对Object类型进行排序

    <script> var data=[{name:"121",age:"18",year:"2018"},{name:" ...

  6. UVA - 10118 Free Candies 记忆化搜索经典

    思路:d[a][b][c][d]表示从已经第一个篮子取了a颗糖,第二个取了b颗糖,第三个取了c颗糖,第四个取了d颗糖最多还能够获得多少糖果.首先明白一个问题:如果能分别取a,b,c,d个,不论如何取, ...

  7. POJ - 2251 bfs [kuangbin带你飞]专题一

    立体bfs,共有六个方向: const int dx[] = {0,0,1,-1,0,0}; const int dy[] = {1,-1,0,0,0,0}; const int dz[] = {0, ...

  8. 【Learning】 莫比乌斯反演

    莫比乌斯反演 ​ 对于两个定义域为非负整数的函数\(F(n)\)和\(f(n)\) ​ 若满足:\(F(n)=\sum\limits_{d|n}f(d)\),则反演得到\(f(n)=\sum\limi ...

  9. 网卡驱动引起openstack的mtu问题

    一套Pike版本的openstack测试环境,使用vlan模式的网络,数据网网卡使用的是绿联的usb百兆网卡,遇到了虚拟机网络异常的问题.同一个vlan下,不同宿主机上的两台虚拟机,相互之间可以pin ...

  10. Hive命令及操作

    1.hive表操作 复制表结构 create table denserank_amt like otheravgrank_amt;修改表名 alter table tmp rename to cred ...