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 ...
随机推荐
- 在CentOS下安装crontab服务
1. 确认crontab是否安装: 执行 crontab 命令如果报 command not found,就表明没有安装 2. 安装 crontab 执行 yum install -y vixie-c ...
- Mybatis查询,resultMap="Map" 查询数据有空值,导致整个map为空的问题
解决方法,不要使用Map接收,使用HashMap或者LinkHashMap,都可以. resultMap="Map" 替换为: resultMap="HashMap&qu ...
- .NET常用第三方库(包)总结
文章会不定期更新,以下内容均为个人总结,欢迎各位拍砖指正 序列化与反序列化 JSON.NET应该是.NET平台上使用最为广泛的序列化/反序列化包了,ASP.NET和ASP.NET Core中默认序列化 ...
- Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8387752.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- 【记录】.net 通用log4net日志配置
asp.net mvc 1.引入log4netNuGet包. 2.修改Global.asax下的Application_Start方法.加入log4net.Config.XmlConfigurator ...
- <url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>区别
<url-pattern>/</url-pattern>表示的为只匹配/login和/demo后面不带.xxx的网页 <url-pattern>/*</url ...
- Sping Boot入门到实战之入门篇(三):Spring Boot属性配置
该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置. 传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...
- java 集合框架(十)List
一.概述 List是一种有序集合,有时也被称为序列,可以有重复的元素.List集合相比Collection,除了直接继承的方法外,有以下拓展的操作方法 位置访问---可以基于元素索引来操作元素,比如g ...
- 笔记︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)
图像语义分割的意思就是机器自动分割并识别出图像中的内容,我的理解是抠图- 之前在Faster R-CNN中借用了RPN(region proposal network)选择候选框,但是仅仅是候选框,那 ...
- 利用ffmpeg做视频解码的顺序
这几天在实验室捣鼓着用ffmpeg做视频解码,终于把数据解出来了,虽然还没有做显示部分,不知道解码解得对不对,但料想是不会有什么问题了.回头看看这几天的工作,其间也遇到了不少问题,主要还是对ffmpe ...