转载请注明出处:

  官方文档: https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read

1.简洁

  Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 ​ easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便

  优点:节省内存消耗,可大量减少网络开销

2.使用方法

2.1.引入依赖

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>

2.2 导入

  导入对应的表格字段解析实体类:

public class ConfigImportExcelRow implements Serializable {

    @ExcelProperty(value = "姓名", index = 0)
private String userName; /**
* 昵称
*/
@ExcelProperty(value = "昵称", index = 1)
private String nickName; @ExcelProperty(value = "年龄", index = 2)
private Integer age; }

  接口示例

@PostMapping("/import")
public JSONResult import(@RequestParam(name = "file") MultipartFile file, HttpServletResponse response) { List<ConfigImportExcelRow> userRowList = null;
try {
userRowList = EasyExcel.read(file.getInputStream()).headRowNumber(2)
.head(ConfigImportExcelRow.class).sheet().doReadSync();
} catch (Exception e) {
LOGGER.error("导入配置异常", e);
} return "导入结果";
}

  head()指定Excel行对应的POJO

  sheet() 读取第一个sheet

  doReadSync() ; 同步读取会自动finish

  headRowNumber 从头的第几行开始读取:可以设置1,因为头就是一行。如果多行头,可以设置其他值。不传入也可以没有指定头,也就是默认1行

  当有多个 sheet的时候,可以将 read 改为 readSheet 方法:

  官方示例:

2.3 导出

  同样对导出的实体字段添加 @ExcelProperty 注解

public class ConfigExportExcelRow implements Serializable {

    @ExcelProperty(value = "姓名", index = 0)
private String userName; /**
* 昵称
*/
@ExcelProperty(value = "昵称", index = 1)
private String nickName; @ExcelProperty(value = "年龄", index = 2)
private Integer age; }

  调用示例

@GetMapping("/export")
@ApiOperation(value = "导出明细")
public JSONResult importUser(HttpServletResponse response) { return JSONResult.okResult();
} public void exportWorkerPlan(Long cycleId, HttpServletResponse response) { try {
List<ConfigExportExcelRow> excelRowList = new ArrayList<>();
ConfigExportExcelRow result1 = new ConfigExportExcelRow();
result1.setUserName("张三");
result1.setNickName("张三");
result1.setAge(22);
excelRowList.add(result1);
AssessPersonConfigImportResult result2 = new AssessPersonConfigImportResult();
result2.setUserName("李四");
result2.setNickName("李四");
result2.setAge("33");
excelRowList.add(result2); String fileFix = DateUtils.formatDate(System.currentTimeMillis(), DateFormatEnum.YYYYMMDDHHMMSSS);
String fileName = "导出结果_" + fileFix;
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
fileName = URLEncoder.encode(fileName, "UTF-8").replace("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); // 内容样式策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 垂直居中,水平居中
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
// 字体策略
WriteFont contentWriteFont = new WriteFont();
// 字体大小
contentWriteFont.setFontHeightInPoints((short) 10);
contentWriteCellStyle.setWriteFont(contentWriteFont); //设置输出流和模板信息
File excelTemplate = ResourceUtils.getFile(EXCEL_TEMPLATE_PATH);
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
.registerWriteHandler(new HorizontalCellStyleStrategy(null, contentWriteCellStyle))
.excelType(ExcelTypeEnum.XLSX)
.withTemplate(excelTemplate).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
//开启自动换行,自动换行表示每次写入一条list数据是都会重新生成一行空行,此选项默认是关闭的,需要提前设置为true
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(excelRowList, fillConfig, writeSheet);
excelWriter.finish();
} catch (Exception e) {
LOGGER.error("导出Excel失败, errorMessage={}", e.getMessage(), e);
throw new BusinessException(ActionStatus.PARAMAS_ERROR.inValue(), "人员设置导出Excel失败!");
}
}

比 poi导入导出更好用的 EasyExcel使用小结的更多相关文章

  1. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  2. poi 导入导出的api说明(大全)

    原文链接:http://www.cnblogs.com/qingruihappy/p/8443101.html poi 导入导出的api说明(大全) 一. POI简介 ApachePOI是Apache ...

  3. POI导入导出

    一.使用POI导出Execl表格 需要的jar包 package cn.yxj.poi; import java.io.FileOutputStream; import java.util.Date; ...

  4. POI导入导出excel(附工具类)

    关于POI导出excel的功能我在前面的文章已经写过了,POI导出excel的三种方式 , 导出表格数据到excel并下载(HSSFWorkbook版) ,本篇文章主要是将导入导出功能进一步地封装,在 ...

  5. 告别硬编码,让你的POI导入导出拥抱变化

    GitHub地址 | 博客 | 中文 | English | 原文链接 为什么使用AutoExcel? Excel导入导出在软件开发中非常常见,只要你接触过开发,就一定会遇到.相信很多人会跟我一样选择 ...

  6. Excel基于POI导入导出的Annotation化之路(一)

    Excel在web项目里的使用变得越来越广泛,特别是和线下耦合度较高的业务,Excel导入导出变得非常频繁,尽管很多人写了诸多的工具方法,但是终究没有解决一个问题:有效的控制字段英文名称和实际表头名称 ...

  7. POI导入导出Excel(HSSF格式,User Model方式)

    1.POI说明 Apache POI是Apache软件基金会的开源代码库, POI提供对Microsoft Office格式档案读和写的功能. POI支持的格式: HSSF - 提供读写Microso ...

  8. Java POI导入导出Excel

    1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...

  9. java中使用poi导入导出excel文件_并自定义日期格式

    Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使 ...

  10. poi 导入/导出 工具类

    package com.holy.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcept ...

随机推荐

  1. SignalR《二》接着前篇的继续

    SignalR<二>接着前篇的继续 SignalR身份验证 在ChatRoomHub加上[Authorize] 这样登录了才能发送消息  using Microsoft.AspNetCor ...

  2. 无法启动iis服务器

    网上的大多数教程都千篇一律,增加我寻找解决方法的难度 ,在我边气边找的努力下终于找到了解决办法. 不过还是建议先去看其他的教程,其他的不行的话再来看这个 因为工作进程未能正确初始化,因而无法启动.返回 ...

  3. jenkins +docker+python接口自动化之jenkins拉取gitee上的代码(四)

    1.背景 1.经过我们前面几轮的安装测试,我们已经安装了jenkins容器,python3,以及运行我们python代码所需要的第三方库在requirements.txt文件下统一安装. 2.需求 我 ...

  4. OpenEuler 中C与汇编的混合编程

    2.5.1用汇编代码编程 将C代码编译成汇编代码 C代码: /**********a.c file********/ #include <stdio.h> extern int B(); ...

  5. git拉取远程主支内容,在本地进行修改后,重新提交到新建分支的过程

    git拉取远程主支内容,在本地进行修改后,重新提交到新建分支的过程 在本地找一个干净的文件夹 git  init  进行初始化 git clone 复制拉取远程的地址 在文件夹中打开,进入复制下来的项 ...

  6. LeetCode系列之 (JavaScript) => 66. 加一

    题目描述: 解题思路分析: 模拟十进制: 分析有几种情况,按情况来定 不同解法: /** * @param {number[]} digits * @return {number[]} */ // v ...

  7. uniapp 模拟器的使用

    uniapp 模拟器的使用 下载夜深模拟器 uniapp  - 工具-设置 adb路径  模拟器路径 模拟器端口号 :26944

  8. python读取与处理netcdf数据

    netcdf是气候数据中的主流格式,当涉及到大范围的全球数万个格网点数据时,使用python脚本可以较快地读取与处理. import netCDF4 from netCDF4 import Datas ...

  9. Alibaba Cloud Linux 3.2104 64位安装mydumper-0.9.1

    1 下载 wget https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz tar -zxvf mydumpe ...

  10. PHP实现JWT登录鉴权

    一.什么是JWT 1.简介 JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准. 简单的说,JWT就是一种Token的编码算法,服务器端负责根据一个 ...