第一种:常见导出【已知表头(长度一定),已知表数据(具体一个对象的集合,并已知对象各个属性的类型)】
第二种:不常见导出【已知表头(长度不定),已知表数据(没有具体对象,装在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. 如何使用 window api 转换字符集?

    //宽字符转多字节 std::string W2A(const std::wstring& utf8) { int buffSize = WideCharToMultiByte(CP_ACP, ...

  2. HDU - 2612 bfs [kuangbin带你飞]专题一

    分别以两个人的家作为起点,bfs求得到每个KFC最短距离.然后枚举每个KFC,求得时间之和的最小值即可. 此题不符合实际情况之处:  通过了一个KFC再去另一个KFC可以吗? 出题人都没好好想过吗? ...

  3. [Code] 递归函数在函数式 Java 中的实现

    这里以阶乘函数为例,对于阶乘函数 fact :: Integer -> Integer fact 0 = 1 fact n = n * fact (n - 1) 在函数式 Java 中可以使用 ...

  4. Appium疑难杂症

    坑之初体验 在Appium的初体验中,遇到了一些坑坑洼洼.将他们记录下来,以后方便查阅. 1. session大于60秒没接收到命令自动关闭 通过Appium-Python-Client连接到appi ...

  5. 前端时间戳timestamp相关总结:

    一.JavaScript获取当前时间戳的方法 第一种方法:var timestamp = Date.parse(new Date());结果:1280977330000 第二种方法:var times ...

  6. 特殊权限SUIG、SGID、SBIT

    一.SetUID与SGID 只能用于二进制程序 执行者需要有该二进制程序的x权限 执行具有SUID权限的二进制程序,那么执行者将具有该二进制程序所有者的权限. 举例来说,/etc/passwd文件的权 ...

  7. 【前端】jQuery移动端左滑删除

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/left_slide_menu.html <!doctype html> <html> &l ...

  8. 01-python中字符串的常见操作

    (1)find 检测str是否包含在myStr中,如果存在则返回开始的索引值,否则返回-1. In [1]: myStr = "hello world tairan and tairanCi ...

  9. Object Detection︱RCNN、faster-RCNN框架的浅读与延伸内容笔记

    一.RCNN,fast-RCNN.faster-RCNN进化史 本节由CDA深度学习课堂,唐宇迪老师教课,非常感谢唐老师课程中的论文解读,很有帮助. . 1.Selective search 如何寻找 ...

  10. error: No curses/termcap library found的解决办法

    mysql版本:5.1.30 已经不记得这次是第几次安装mysql了,遇到这个问题倒是第一次. 之前在tar,./configure,make,make install 经典四步时,从来没有想过其中的 ...