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 ...
随机推荐
- php用正则匹配出图片img标签中的src路径(兼容)
用php抓图片是个常用的需求,下面提供一个比较兼容的正则表达式来实现php抓取出页面.字符串中所有图片的src. 下面是一个范例,能匹配各种标签格式写法的图片,不管src在什么地方,还是单引号.双引号 ...
- css设置兼容的透明样式
css设置透明并实现兼容: <style>div{ filter: alpha(opacity=80); -moz-opacity: 0.8; -khtml-opacity: 0.8; o ...
- 洛谷P1896 [SCOI2005]互不侵犯King【状压DP】
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式: 只有一行,包含两个数N,K ...
- Dynamics CRM 2015-Ribbon In Basic Home Tab
前文中有说到关于Form上Ribbon的配置以及控制,而Ribbon Button还可以在其它地方的配置,今天就来说说在Basic Home Tab里面的配置,效果图如下: 具体配置Customiza ...
- Java经典编程题50道之三十一
将一个数组逆序输出. public class Example31 { public static void main(String[] args) { int[] a = { 9 ...
- mysql5.7中解决中文乱码的问题
在使用mysql5.7时,会发现通过web端向数据库中写入中文后会出现乱码,但是在数据库中直接操作SQL语句插入数据后中文就显示正常,这个问题怎么解决呢?此处不对mysql的数据编码过程和原理进行讲解 ...
- Mysql 远程登录及常用命令
第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...
- UVa 11988破损的键盘
这题是很好的学习用数组实现链表的例子. 原题链接 UVa11988 题意 输入一段文本,字符'['表示Home键,']'表示End键.输出屏幕上面的结果. 思路 难点在于在字符串的头和尾插入字符,如果 ...
- 【BZOJ3529】【SDOI2014】 数表
Time Limit: 10 Sec Memory Limit: 512 MB Description 有一张\(n×m\)的数表,其第i行第j列(\(,1 \le i \leq n,1 \le ...
- shiro整合ehcache
目标:让Shiro整合ehcache,提供缓存realm数据的功能. 1.引入encache配置文件,配置缓存 <!-- <ehcache xmlns:xsi="http://w ...