官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com)

依赖

        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>

WEB中的使用

首先:写个模板类吧

package com.example.entity;import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;
import java.time.LocalDateTime;/*** @TableName t_company*/
@TableName(value = "t_company")
@Data
@ApiModel("企业实体类")
public class TCompany implements Serializable {/*** 主键*/@TableId(value = "id", type = IdType.AUTO)@ApiModelProperty("主键")@ExcelIgnoreprivate Integer id;/*** 用户名*/@TableField(value = "user_name")@ApiModelProperty("企业用户名")@ExcelProperty("企业用户名")private String userName;/*** 登录密码*/@TableField(value = "password")@ApiModelProperty("登陆密码")@ExcelIgnoreprivate String password;/*** 企业名*/@TableField(value = "name")@ApiModelProperty("企业真实名")@ExcelProperty("企业真实名")private String name;/*** 工商注册号*/@TableField(value = "gszch")@ApiModelProperty("工商注册号")@ExcelIgnoreprivate String gszch;/*** 营业执照*/@TableField(value = "yyzz")@ApiModelProperty("营业执照")@ExcelIgnoreprivate String yyzz;/*** 公司图标*/@TableField(value = "img")@ApiModelProperty("公司图标")@ExcelIgnoreprivate String img;/*** 公司规模*/@TableField(value = "gsgm")@ApiModelProperty("公司规模")@ExcelProperty("公司规模")private String gsgm;/*** 公司行业*/@TableField(value = "gshy")@ApiModelProperty("公司行业")@ExcelProperty("公司行业")private String gshy;/*** 联系人*/@TableField(value = "contact")@ApiModelProperty("联系人")@ExcelProperty("联系人")private String contact;/*** 联系电话*/@TableField(value = "phone")@ApiModelProperty("联系电话")@ExcelProperty("联系电话")private String phone;/*** 公司介绍*/@TableField(value = "company_desc")@ApiModelProperty("公司介绍")@ExcelProperty("公司介绍")private String companyDesc;/*** 公司地址*/@TableField(value = "address")@ApiModelProperty("公司地址")@ExcelProperty("公司地址")private String address;/*** 审核状态*/@TableField(value = "audit_status")@ApiModelProperty("审核状态")@ExcelIgnoreprivate Integer auditStatus;/*** 注册时间*/@TableField(value = "create_time", fill = FieldFill.INSERT)@ApiModelProperty("注册时间")@ExcelIgnoreprivate LocalDateTime createTime;/*** 更新时间*/@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)@ApiModelProperty("更新时间")@ExcelIgnoreprivate LocalDateTime updateTime;@TableField(exist = false)private static final long serialVersionUID = 1L;
}

最好使用注解,会自动对应我们的数据

读操作:

这里输入的参数讲解一下下,file.getInputStream(), 是前端上传的一个临时文件,我们获取他的一个输入流,TManger.class,是我们的一个实体类对象

new myListener(companyServiice))是我们的一个监听器,传递了一个service进去,可以看监听器的代码,传进去的目的就是,监听器里直接调用service的存储数据库操作

.sheet(),是模板名称,不是文件名称

.doRead();读

 /*** 文件上传* <p>* 1. 创建excel对应的实体对象 参照{@link UploadData}* <p>* 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}* <p>* 3. 直接读即可*/@PostMapping("upload")@ResponseBodypublic String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();return "success";

监听器:

package com.example.common;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson2.JSON;
import com.example.entity.TManger;
import com.example.service.TMangerService;
import com.example.service.impl.TMangerServiceImpl;
import lombok.extern.slf4j.Slf4j;import java.util.List;@Slf4j
public class myListener implements ReadListener<TManger> {/*** 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 100;/*** 缓存的数据*/private List<TManger> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);/*** 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。*/private TMangerService mangerService;public myListener() {// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数mangerService = new TMangerServiceImpl();}/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来** @param demoDAO*/public myListener(TMangerServiceImpl demoDAO) {this.mangerService = demoDAO;}/*** 这个每一条数据解析都会来调用** @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(TManger data, AnalysisContext context) {log.info("解析到一条数据:{}", JSON.toJSONString(data));cachedDataList.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (cachedDataList.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();log.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {log.info("{}条数据,开始存储数据库!", cachedDataList.size());mangerService.saveBatch(cachedDataList);log.info("存储数据库成功!");}
}

操作读

    /*** 文件上传* <p>* 1. 创建excel对应的实体对象 参照{@link UploadData}* <p>* 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}* <p>* 3. 直接读即可*/@PostMapping("upload")@ResponseBodypublic String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();return "success";}

监听器的异常处理:

    /*** 在转换异常 获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。** @param exception* @param context* @throws Exception*/@Overridepublic void onException(Exception exception, AnalysisContext context) {log.error("解析失败,但是继续解析下一行:{}", exception.getMessage());// 如果是某一个单元格的转换异常 能获取到具体行号// 如果要获取头的信息 配合invokeHeadMap使用if (exception instanceof ExcelDataConvertException) {ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;log.error("第{}行,第{}列解析异常,数据为:{}", excelDataConvertException.getRowIndex(),excelDataConvertException.getColumnIndex(), excelDataConvertException.getCellData());}}

这里的意思,应该是说,额,当一行数据解释失败的话,会打印出第几行解析失败,但是会继续解析,如果我们在方法里去抛出异常,就会停止解析

看到了吗,他的默认方法时直接抛出异常,我们重写,就不抛出异常,这样他就一直读了

写操作

    /*** 文件下载(失败了会返回一个有部分数据的Excel)* <p>* 1. 创建excel对应的实体对象 参照{@link DownloadData}* <p>* 2. 设置返回的 参数* <p>* 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大*/@GetMapping("download")public void download(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());}

这个前面都时一些协议设置啥的,那个”测试“,时生成的文件名,还有最后的写操作,其他不关我们事

失败情况:

    /*** 文件下载并且失败的时候返回json(默认失败了会返回一个有部分数据的Excel)** @since 2.1.1*/@GetMapping("downloadFailedUsingJson")public void downloadFailedUsingJson(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmantry {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + 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 = MapUtils.newHashMap();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());response.getWriter().println(JSON.toJSONString(map));}}

看的懂吗,翻译一下,就是说当遇到解析不了的数据时,就会抛出异常,然后我们可以捕获这个异常,给他处理方式就是,在输出的Excel尾部加上Sorry,解析失败了。但是上面成功解析的还是会输出的

以上没有测试,不想改我的代码,摆烂,但是,我感觉我看文档理解到的就是我要说的,然后这些代码都是直接官网复制的,哈哈

EasyExcel的使用相关推荐

  1. easyexcel生成excel_阿里JAVA解析Excel工具easyexcel

    java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...

  2. easyexcel怎么设置表头宽度_easyexcel 自动设置列宽

    com.alibaba easyexcel 2.1.4 导出controller层代码 @RequestMapping("/download") public void downl ...

  3. Spring Boot + EasyExcel 导入导出,好用到爆,可以扔掉 POI 了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.EasyExcel EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据 ...

  4. 史上最全的Excel导入导出(easyexcel版)

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/qq_32258777/article/details/89031479 喝水不忘挖井人,感谢阿里 ...

  5. easyexcel导入时读不到数据_EasyExcel简单使用--导入excel数据

    读Excel 1.依赖包 com.alibaba easyexcel 2.0.5 2.代码import java.io.File; import com.alibaba.excel.EasyExcel ...

  6. easyexcel工具类_阿里巴巴程序员常用的 15 款开发者工具

    从人工到自动化,从重复到创新,技术演进的历程中,伴随着开发者工具类产品的发展. 阿里巴巴将自身在各类业务场景下的技术积淀,通过开源.云上实现或工具等形式对外开放,本文将精选了一些阿里巴巴的开发者工具, ...

  7. Apache POI和EasyExcel 第七集:EasyExcel的基本操作,读取和写入Excel,一行足矣

    Apache POI和EasyExcel 第七集:EasyExcel的基本操作,读取和写入Excel,一行搞定 一.资源 在这里设置lombok会遇到一个问题,以前在springboot那里都没遇到, ...

  8. Apache POI和EasyExcel 第六集:Apache POI的Excel读取单元格中的计算公式

    Apache POI和EasyExcel 第六集:Apache POI的Excel读取单元格中的计算公式 一.资源 代码实现中的带有计算公式的Excel(xls) 链接:https://pan.bai ...

  9. Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据

    Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据 一.资源 什么是Apache POI Apache POI 不同类型的数据的表格(xls) 链接: ...

  10. Apache POI和EasyExcel 第四集:Apache POI的Excel基本读取(分为03版的xls、07版的xlsx)

    Apache POI和EasyExcel 第四集:Apache POI的Excel基本读取(分为03版的xls.07版的xlsx) 一.资源 一个十分好用的日期类型处理包,和Java8搭配使用非常好 ...

最新文章

  1. LVS 四层 TCP/UDP 负载均衡器
  2. 在linux CentOS 上安装chrome 谷歌浏览器
  3. Flashdevelop 在Project 上增加 ComboBox
  4. SuperSet连接Hive失败(客户端报日志拒绝连接)
  5. 这个工具可以组合参数画出2种单细胞Marker显示图
  6. 关于“我的藏书阁:.NET/数据库应用开发”的几点看法。
  7. python浮雕图片_python图像数据增强——imgaug (二)
  8. c语言中Oo是什么进制整数字,C语言中的大小端存储及原码补码反码的运算关系 %d %u...
  9. QQ安装目录下各文件用途不完全揭密(转)
  10. 2020年系统集成项目管理工程师课教程
  11. R语言绘制 tan 图像
  12. 西门子S7-200 SMART控制步进电机(一)
  13. PRN(20210421):Task-Free Continual Learning
  14. 【问链财经-EOS公开课】 第十八课 史上最全EOS 资源汇总
  15. android 目录详解,Android源码目录结构详解
  16. 【EmguCV系列一】EmguCV下载安装以及配置
  17. QT学习-----按钮弹起效果的实现
  18. Deep Learning(1)
  19. 计算机导么是进制,计算机基础 进制简介和转换
  20. 必应输入法的分析与用户需求调查报告

热门文章

  1. ZOJ Monthly,Feburary 2012 部分题解
  2. 最美圣诞树,用Python画棵雪夜圣诞树送给你
  3. win7防火墙设置开放某个端口
  4. window10下WSL使用Ubuntu报错: System has not been booted with systemd as init system (PID 1). Can‘t operat
  5. PWM控制直流电机(单片机实验)
  6. 【Eclipse使用技巧】格式化代码的方法 + 解决注释是繁体字的方法
  7. GIT CZ的错误解决
  8. Java写计算器自闭了
  9. 淘宝/天猫整店采集(店铺宝贝列表接口)
  10. 人生算法第一天心得总结(A)九段进阶(3-6)