目录
  • 创建对象的写

    • 简单写入
    • 根据参数只导出指定列
    • 指定写入的列
    • 复杂头写入
    • 重复多次写入(写到单个或者多个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——写文件相关推荐

  1. EasyExcel写文件的三种方式

    第一种:创建实体对象 写入对象 @HeadRowHeight(20) // 表头行高 @ColumnWidth(15) // 表头行宽 public class VipReportDtoOut {@E ...

  2. 使用EasyExcel进行文件的读取与写出(根据目录看更清晰)

    EasyExcel简介 Java领域解析.生成Excel比较有名的框架有Apache poi.jxl等.但他们都存在一个严重的问题就是非常的耗内存.如果你的系统并发量不大的话可能还行,但是一旦并发上来 ...

  3. EasyExcel读写文件

    EasyExcel读写文件 文章目录 EasyExcel读写文件 1.写文件 1.1 定义实体类 1.2 获取表头样式 1.3 获取内容样式 1.4 定义标注处理器 1.5 写文件 1.5.1 全量写 ...

  4. Hhadoop-2.7.0中HDFS写文件源码分析(二):客户端实现(1)

    一.综述 HDFS写文件是整个Hadoop中最为复杂的流程之一,它涉及到HDFS中NameNode.DataNode.DFSClient等众多角色的分工与合作. 首先上一段代码,客户端是如何写文件的: ...

  5. python中如何在写文件之前删除文件内容_Python:文件的读取、创建、追加、删除、清空...

    一.用Python创建一个新文件,内容是从0到9的整数, 每个数字占一行: #python >>>f=open('f.txt','w') # r只读,w可写,a追加 >> ...

  6. java写文件方法之比较

    import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import ja ...

  7. hadoop写文件 java_写文件 - Hadoop 学习手册_教程_Java开发社区

    HDFS - 写文件 1.客户端将文件写入本地磁盘的N#x4E34;时文件中 2.当临时文件大小达到一个block大小时,HDFS client通知NameNode,申请写入文件 3.NameNode ...

  8. Dom4j 写文件不全

    今天用dom4j 写文件,要么写文件不全,要么文件为空. 刚开始有问题的是: package com.zhangyue.translate;import org.dom4j.Document; imp ...

  9. linux内核写文件flush,innodb_flush_method 与linux File I/O

    从实验角度比较了fdatasync,O_DSYNC和O_DIRECT在性能上的差异.本文将试图从Linux/Unix"文件I/O"(unbuffered I/O)的角度来解释inn ...

最新文章

  1. python获取系统时间月份_python 取数组绝对值python获取当前日期
  2. php注释验证,注解验证 · ThinkPHP6.0完全开发手册 · 看云
  3. HTML DOCTYPE 标签 -- DTDs 文档类型声明
  4. Linux RTC 驱动实验
  5. 17-Docker的数据持久化介绍
  6. 摄影测量--后方交会
  7. 浅析如何通过PHP类的反射来实现依赖注入
  8. python计算多边形面积_Python求凸包及多边形面积教程
  9. HIVE中常见文件存储格式比较
  10. C++学习足迹---(纯DOS版)五子棋
  11. 智慧教育平台android,智慧教育平台APP 1.0.2 安卓版
  12. 厦门大学计算机系研究生课程《数据科学》课程主页
  13. C/C++ 混合编译 C++中的extern “C“
  14. 一键重装系统后蓝屏怎么修复
  15. 银行卡信用卡号校验查询API接口
  16. 多大的带宽才叫大带宽服务器,大带宽服务器有什么优势。
  17. Python数据分析 读书笔记
  18. zabbix是什么?主要用来做啥?
  19. 【第一性原理】Centos7下编译并行lammps-7Aug19
  20. 解决element Upload 上传 出现Access to XMLHttpRequest at

热门文章

  1. 大数据之Flink流式计算引擎
  2. 提升仓储空间利用率的重型横梁货架 海格里斯防腐蚀防锈横梁式货架
  3. 第二章 关于74181逻辑图中的Cn+1
  4. 手机探索者开发实录--源代码
  5. 游戏使用html签名,在HTML5表单中使用涂写签名
  6. 拆书笔记3|让听得见炮声的人来决策
  7. 学习英文-学以致用【场景:请客吃饭】
  8. 从双非到应届大厂ssp offer ,再到万能博主,我是怎么做到的?
  9. 中国预灌封注射器市场现状及投资前景预测报告(2022版)
  10. [软件工具] 怎么样能按照表格内的对应关系为文件进行批量重命名?需要根据一个列表将文件批量重命名