EasyExcel——写文件
- 创建对象的写
- 简单写入
- 根据参数只导出指定列
- 指定写入的列
- 复杂头写入
- 重复多次写入(写到单个或者多个Sheet)
- 同一个sheet多次写
- 写到不同的sheet 同一个对象
- 写到不同的sheet 不同的对象
- 日期、数字或者自定义格式转换
- 指定列宽、行高
- 注解形式自定义样式
- 自定义样式
- 合并单元格
- 自动列宽(不太精确)
- 不创建对象的写
- web的写(文件下载)
- web中的写并且失败的时候返回json
easyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。
64M内存1分钟内读取75M(46W行25列)的Excel(当然还有急速模式能更快,但是内存占用会在100M多一点)
可有效避免OOM。
致敬阿里:
---参照官方文档进行编辑,主要记录了工作中用到的,用的少的就没有记录
---官方文档 : https://www.yuque.com/easyexcel
---官方github : https://github.com/alibaba/easyexcel
写入数据实体类
@Data
public class DemoData {@ExcelProperty("字符串标题")private String stringData;@ExcelProperty("整型标题")private Integer integerData;@ExcelProperty("日期标题")private Date dateData;@NumberFormat("#.##%")private Double dounleData;
}
- @ExcelProperty("***") 标题行名称
构造数据的方法
private List<DemoData> data() {List<DemoData> list = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setStringData("字符串" + i);data.setIntegerData(i);data.setDateData(new Date());data.setDounleData(0.56);list.add(data);}return list;}
创建对象的写
简单写入
//写法一String fileName = "c://Users//****";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());//写法二String fileName = "c://Users//****";// 这里 需要指定写用哪个class去写ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();excelWriter.write(data(), writeSheet);// 千万别忘记finish 会帮忙关闭流excelWriter.finish();
根据参数只导出指定列
String fileName = "c://Users//****";//排除掉不想输出的列 假设我们要忽略 stringDataSet<String> excludeColumnFiledNames = new HashSet<String>();excludeColumnFiledNames.add("stringData");EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板").doWrite(data());//只输出实体类我们想要的字段 假设我们只要导出 stringDataSet<String> includeColumnFiledNames = new HashSet<String>();includeColumnFiledNames.add("stringData");EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板").doWrite(data());
指定写入的列
修改实体类注解即可
@ExcelProperty(value = "数字标题", index =5)private Integer integerData;
复杂头写入
修改实体类注解即可
@ExcelProperty({"主标题", "字符串标题"})
@ExcelProperty({"主标题", "日期标题"})
@ExcelProperty({"主标题", "数字标题"})
重复多次写入(写到单个或者多个Sheet)
同一个sheet多次写
String fileName = "c://Users//****";
ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();//同一个sheet只要创建一次
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();// 调用写入,实际使用时根据数据库分页的总的页数来
for (int i = 0; i < 5; i++) {// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<DemoData> data = data();excelWriter.write(data, writeSheet);
}
/// 千万别忘记finish 会帮忙关闭流
excelWriter.finish();
写到不同的sheet 同一个对象
String fileName = "c://Users//****";
ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();// 去调用写入,实际使用时根据数据库分页的总的页数来。最终会写到5个sheet里面
for (int i = 0; i < 5; i++) {// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<DemoData> data = data();excelWriter.write(data, writeSheet);
}
/// 千万别忘记finish 会帮忙关闭流
excelWriter.finish();
写到不同的sheet 不同的对象
String fileName = "c://Users//****";
//指定文件
ExcelWriter excelWriter = EasyExcel.write(fileName).build();
// 去调用写入,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
for (int i = 0; i < 5; i++) {// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(DemoData.class).build();// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<DemoData> data = data();excelWriter.write(data, writeSheet);
}
/// 千万别忘记finish 会帮忙关闭流
excelWriter.finish();
日期、数字或者自定义格式转换
修改实体类注解即可
日期、数字
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")@ExcelProperty("日期标题")private Date dateData;@NumberFormat("#.##%")@ExcelProperty("浮点型标题")private Double dounleData;
自定义格式转换
@ExcelProperty(converter = CustomStringStringConverter.class)
private String stringData;
public class CustomStringStringConverter implements Converter<String> {@Overridepublic Class supportJavaTypeKey() {return String.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}/*** 这里读的时候会调用*/@Overridepublic String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {return "自定义:" + cellData.getStringValue();}/*** 这里是写的时候会调用*/@Overridepublic CellData convertToExcelData(String value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {return new CellData(value);}
}
指定列宽、行高
@Data
@ContentRowHeight(10)
@HeadRowHeight(20)
@ColumnWidth(25)
public class DemoData {@ColumnWidth(50)@ExcelProperty("字符串标题")//@ExcelProperty(converter = CustomStringStringConverter.class)private String stringData;@ExcelProperty(value = "数字标题")private Integer integerData;@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")@ExcelProperty("日期标题")private Date dateData;@NumberFormat("#.##%")@ExcelProperty("浮点型标题")private Double dounleData;
}
注解形式自定义样式
@Data
// 头背景设置成红色 IndexedColors.RED.getIndex()
@HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 10)
// 头字体设置成20
@HeadFontStyle(fontHeightInPoints = 20)
// 内容的背景设置成绿色 IndexedColors.GREEN.getIndex()
@ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 17)
// 内容字体设置成20
@ContentFontStyle(fontHeightInPoints = 20)
public class DemoData {@ColumnWidth(50)@ExcelProperty("字符串标题")// 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()@HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 14)private String stringData;// 字符串的头字体设置成20@HeadFontStyle(fontHeightInPoints = 30)@ExcelProperty(value = "数字标题")private Integer integerData;// 字符串的内容的背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()@ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40)@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")@ExcelProperty("日期标题")private Date dateData;// 字符串的内容字体设置成20@ContentFontStyle(fontHeightInPoints = 30)@NumberFormat("#.##%")@ExcelProperty("浮点型标题")private Double dounleData;
}
自定义样式
String fileName = "c://Users//****";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭// 头的策略WriteCellStyle headWriteCellStyle = new WriteCellStyle();// 背景设置为红色headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());WriteFont headWriteFont = new WriteFont();headWriteFont.setFontHeightInPoints((short)20);headWriteCellStyle.setWriteFont(headWriteFont);// 内容的策略WriteCellStyle contentWriteCellStyle = new WriteCellStyle();// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);// 背景绿色contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());WriteFont contentWriteFont = new WriteFont();// 字体大小contentWriteFont.setFontHeightInPoints((short)20);contentWriteCellStyle.setWriteFont(contentWriteFont);// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现HorizontalCellStyleStrategy horizontalCellStyleStrategy =new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭EasyExcel.write(fileName, DemoData.class).registerWriteHandler(horizontalCellStyleStrategy).sheet("模板").doWrite(data());
合并单元格
@Data
// 将第6-7行的2-3列合并成一个单元格
//@OnceAbsoluteMerge(firstRowIndex = 5, lastRowIndex = 6, firstColumnIndex = 1, lastColumnIndex = 2)
public class DemoData {// 这一列 每隔2行 合并单元格@ContentLoopMerge(eachRow = 2)@ExcelProperty("字符串标题")private String stringData;@ExcelProperty(value = "数字标题")private Integer integerData;@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")@ExcelProperty("日期标题")private Date dateData;@NumberFormat("#.##%")@ExcelProperty("浮点型标题")private Double dounleData;
}
自动列宽(不太精确)
EasyExcel.write(fileName, DemoData.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet("模板").doWrite(data());
不创建对象的写
String fileName = "c://Users//****";EasyExcel.write(fileName).head(head()).sheet("模板").doWrite(dataList());-------------------------------------------------------------------------private List<List<String>> head() {List<List<String>> list = new ArrayList<List<String>>();List<String> head0 = new ArrayList<String>();head0.add("字符串" + System.currentTimeMillis());List<String> head1 = new ArrayList<String>();head1.add("数字" + System.currentTimeMillis());List<String> head2 = new ArrayList<String>();head2.add("日期" + System.currentTimeMillis());list.add(head0);list.add(head1);list.add(head2);return list;}private List<List<Object>> dataList() {List<List<Object>> list = new ArrayList<List<Object>>();for (int i = 0; i < 10; i++) {List<Object> data = new ArrayList<Object>();data.add("字符串" + i);data.add(new Date());data.add(0.56);list.add(data);}return list;}
web的写(文件下载)
/*** 文件下载(失败了会返回一个有部分数据的Excel)*/@GetMapping("download")public void download(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());}
web中的写并且失败的时候返回json
@GetMapping("downloadFailedUsingJson")public void downloadFailedUsingJson(HttpServletResponse response) throws IOException {try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");// 这里需要设置不关闭流EasyExcel.write(response.getOutputStream(), DownloadData.class).autoCloseStream(Boolean.FALSE).sheet("模板").doWrite(data());} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<String, String>();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());response.getWriter().println(JSON.toJSONString(map));}}private List<DownloadData> data() {List<DownloadData> list = new ArrayList<DownloadData>();for (int i = 0; i < 10; i++) {DownloadData data = new DownloadData();data.setStringData("字符串" + i);data.setIntegerData(i);data.setDateData(new Date());data.setDounleData(0.56);list.add(data);}return list;}
EasyExcel——写文件相关推荐
- EasyExcel写文件的三种方式
第一种:创建实体对象 写入对象 @HeadRowHeight(20) // 表头行高 @ColumnWidth(15) // 表头行宽 public class VipReportDtoOut {@E ...
- 使用EasyExcel进行文件的读取与写出(根据目录看更清晰)
EasyExcel简介 Java领域解析.生成Excel比较有名的框架有Apache poi.jxl等.但他们都存在一个严重的问题就是非常的耗内存.如果你的系统并发量不大的话可能还行,但是一旦并发上来 ...
- EasyExcel读写文件
EasyExcel读写文件 文章目录 EasyExcel读写文件 1.写文件 1.1 定义实体类 1.2 获取表头样式 1.3 获取内容样式 1.4 定义标注处理器 1.5 写文件 1.5.1 全量写 ...
- Hhadoop-2.7.0中HDFS写文件源码分析(二):客户端实现(1)
一.综述 HDFS写文件是整个Hadoop中最为复杂的流程之一,它涉及到HDFS中NameNode.DataNode.DFSClient等众多角色的分工与合作. 首先上一段代码,客户端是如何写文件的: ...
- python中如何在写文件之前删除文件内容_Python:文件的读取、创建、追加、删除、清空...
一.用Python创建一个新文件,内容是从0到9的整数, 每个数字占一行: #python >>>f=open('f.txt','w') # r只读,w可写,a追加 >> ...
- java写文件方法之比较
import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import ja ...
- hadoop写文件 java_写文件 - Hadoop 学习手册_教程_Java开发社区
HDFS - 写文件 1.客户端将文件写入本地磁盘的N#x4E34;时文件中 2.当临时文件大小达到一个block大小时,HDFS client通知NameNode,申请写入文件 3.NameNode ...
- Dom4j 写文件不全
今天用dom4j 写文件,要么写文件不全,要么文件为空. 刚开始有问题的是: package com.zhangyue.translate;import org.dom4j.Document; imp ...
- linux内核写文件flush,innodb_flush_method 与linux File I/O
从实验角度比较了fdatasync,O_DSYNC和O_DIRECT在性能上的差异.本文将试图从Linux/Unix"文件I/O"(unbuffered I/O)的角度来解释inn ...
最新文章
- python获取系统时间月份_python 取数组绝对值python获取当前日期
- php注释验证,注解验证 · ThinkPHP6.0完全开发手册 · 看云
- HTML DOCTYPE 标签 -- DTDs 文档类型声明
- Linux RTC 驱动实验
- 17-Docker的数据持久化介绍
- 摄影测量--后方交会
- 浅析如何通过PHP类的反射来实现依赖注入
- python计算多边形面积_Python求凸包及多边形面积教程
- HIVE中常见文件存储格式比较
- C++学习足迹---(纯DOS版)五子棋
- 智慧教育平台android,智慧教育平台APP 1.0.2 安卓版
- 厦门大学计算机系研究生课程《数据科学》课程主页
- C/C++ 混合编译 C++中的extern “C“
- 一键重装系统后蓝屏怎么修复
- 银行卡信用卡号校验查询API接口
- 多大的带宽才叫大带宽服务器,大带宽服务器有什么优势。
- Python数据分析 读书笔记
- zabbix是什么?主要用来做啥?
- 【第一性原理】Centos7下编译并行lammps-7Aug19
- 解决element Upload 上传 出现Access to XMLHttpRequest at