POI导出Excel的几种情况
第一种:常见导出【已知表头(长度一定),已知表数据(具体一个对象的集合,并已知对象各个属性的类型)】
第二种:不常见导出【已知表头(长度不定),已知表数据(没有具体对象,装在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的几种情况的更多相关文章
- POI导出excel的三种方式
原文链接:https://www.cnblogs.com/zhaoblog/p/7661245.html poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产 ...
- 复杂的POI导出Excel表格(多行表头、合并单元格)
poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...
- 关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结
poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产生内存溢出问题,SXSSFWorkbook是一种大数据量导出格式,csv是另一种excel导出的一种轻快的 ...
- POI导出excel的简单demo
目前使用过两种导出excel的方式,一种是如题所示的使用POI的方式进行数据的导出,这种方式一般只有在处理比较多的数据或者说需要导出的excel表格中有图片之类的需要特殊处理的文件的时候使用:还有一种 ...
- 使用POI导出Excel(二)-利用模板
一.基本操作见: 使用POI导出Excel 二.本次功能需求 给了一个模板,里面有6个sheet页,每页里面都需要填充相应的数据.如图: 三.需求分析 1.分了6个sheet页,每页的数据都不一样,首 ...
- java解决poi导出excel文字水印,导出excel不可操作问题
首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...
- 重构:以Java POI 导出EXCEL为例
重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...
- 重构:以Java POI 导出EXCEL为例2
前言 上一篇博文已经将一些对象抽象成成员变量以及将一些代码块提炼成函数.这一节将会继续重构原有的代码,将一些函数抽象成类,增加成员变量,将传入的参数合成类等等. 上一篇博文地址:http://www. ...
- 关于poi导出excel方式HSSFWorkbook(xls).XSSFWorkbook(xlsx).SXSSFWorkbook.csv的总结
1.HSSFWorkbook(xls) import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermo ...
随机推荐
- Linux 自定义命令
在某个用户的家目录下 的 .bashrc 文件,写入如下内容: # .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . ...
- 借助Maven入手Spring Boot第一个程序
目前网上有不少Spring Boot的入门文章,都很有帮助,本人最近在深入学习Spring Cloud,在搭建第一个Hello World程序时,感觉对于新手而言,介绍文章怎么详细都不为过,因为其中坑 ...
- yum安装man命令程序错误
第一次安装CentOS后,man命令无法使用,查了一下,发现没有安装man命令程序.尝试安装man yum install man 结果如下: Loaded plugins: fastestmirro ...
- [bzoj4552][Tjoi2016&Heoi2016]排序-二分+线段树
Brief Description DZY有一个数列a[1..n],它是1∼n这n个正整数的一个排列. 现在他想支持两种操作: 0, l, r: 将a[l..r]原地升序排序. 1, l, r: 将a ...
- [HEOI2016]求和 sum
[HEOI2016]求和 sum 标签: NTT cdq分治 多项式求逆 第二类斯特林数 Description 求\[\sum_{i=0}^n\sum_{j=0}^i S(i,j)×2^j×(j!) ...
- 决策树--ID3 算法(一)
Contents 1. 决策树的基本认识 2. ID3算法介绍 3. 信息熵与信息增益 4. ID3算法的C++实现 1. 决策树的基本认识 决策树是一种 ...
- 弄懂 JRE、JDK、JVM 之间的区别与联系
其实很多 Java 程序员在写了很多代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,很多人不知所云.本篇不会讲述 jvm 底层是如何与不同的系统进行交互的,而主要理清楚三者之 ...
- java编程思想第四版第二章要点总结
1. 基本类型 基本类型 二进制位数 包装器类 boolean - Boolean byte 8 Byte char 16 Character short 16 Short int 32 Intege ...
- java数组:去重,增加,删除元素
import java.util.List; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; p ...
- HttpClient调用RestFul接口(post和get方式)
/** * @version V1.0 * @Description 调用http接口工具类 * @Author pc * @Date 2018/3/2 11:03 */public class Ht ...