maven依赖

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

导出

Data

@Data
@EqualsAndHashCode(callSuper = true)
@ColumnWidth(10) //指定全局列宽
public class RobotSummaryVO extends BaseRowModel { @ApiModelProperty("id")
@ExcelIgnore //表示导出时忽略该字段
private String id; @ApiModelProperty("姓名")
@ExcelProperty(index = 0,value = "姓名") //index指定表头顺序,从0开始。value指定表头名称
private String name; @ApiModelProperty("年龄")
@ExcelProperty(index = 9,value = "年龄")
private Integer age; @ApiModelProperty("出生时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(index = 8,value = "出生时间")
@ColumnWidth(20) //可单独指定该列列宽
private LocalDateTime createDate; }

controller层:调用方法

/*  ExcelTypeDTO:导入导出表标记,指定导出对应的表/菜单
*/
@ApiOperation("导出")
@GetMapping
public void exportExcel(ExcelTypeDTO dto, HttpServletRequest request, HttpServletResponse response) throws IOException,Exception {
//若菜单标记为空,则抛出异常或导出空excel。
if (StringUtils.isBlank(dto.getMenu())) {
throw new Exception(String.valueOf(ServiceErrCode.TYPE_NOT_FOUND));
}
ExcelVO excelVO = excelService.getExportList(dto); //此处根据menu获得easyexcel导出需要的一些数据
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
String fileName = URLEncoder.encode(excelVO.getName(), "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// EasyExcel.write(response.getOutputStream(), excelVO.getVoClass()).sheet("sheet").doWrite(excelVO.getList());
//增加日期类型转换器
EasyExcel.write(response.getOutputStream(), excelVO.getVoClass()).registerConverter(new LocalDateTimeConverter()).sheet("sheet").doWrite(excelVO.getList()); ​ }

service实现层:返回ExcelVO

@Override
public ExcelVO getExportList(ExcelTypeDTO dto) {
String name = "";
List list = null;
Class voClass = null;
switch (dto.getMenu()){
case "MONITOR_EXE":
name = "病历自动质控项目";
List<MonitorExeVO> monitorExeVOS = monitorExeMapper.getList(new QueryMonitorExeQTO());
list = monitorExeVOS;
voClass = MonitorExeVO.class;
break; QualityScoreItemVO.class;
break;
case "QUALITY_SCORE":
name = "质控评分要求";
List<QualityScore> qualityScores = qualityScoreMapper.getList(new QueryQualityScoreQTO());
list = qualityScores;
voClass = QualityScore.class;
break;
//此处省略... 根据业务需求自行封装ExcelVO
default:
break;
}
ExcelVO excelVO = ExcelVO.builder()
.name(name)
.list(list)
.voClass(voClass)
.build();
return excelVO;
}

ExcelVO:封装通用导出 需要的一些数据

@Builder
@Data
public class ExcelVO { @ApiModelProperty("导出表名称")
private String name;
@ApiModelProperty("导出表数据")
private List list;
@ApiModelProperty("导出表数据对应的class")
private Class voClass; }

ExcelTypeDTO:接受前端传值 标记导入导出是哪张表

@Data
public class ExcelTypeDTO { @ApiModelProperty("导入导出类型标记:" +
"单病种质控:DISEASE;" +
"质控评分要求:QUALITY_SCORE;" +
"质控缺陷字典:QUALITY_SCORE_ITEM;" +
"诊断和手术字典:BUSI_DICT;" +
"基础字典:BASE_DICT;" +
"病历质控代码:QUALITY_MONITOR;" +
"员工管理:STAFF;" +
"床位管理:BED;" +
"管床小组:BED_GROUP;" +
"病区管理:WARD;" +
"科室管理:DEPARTMENT;" +
"分院管理:BRANCH;" +
"医院管理:HOSPITAL;" +
"机器人配置:ROBOT;" +
"机器人任务:JOB_ROBOT;" )
private String menu; }

  

导入示例

controller层:调用方法

    /**
* 文件上传
* 1. 创建excel对应的实体对象
* 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器
* 3. 直接读即可
*/
@ApiOperation("导入")
@GetMapping("importExcel")
public Result importExcel(ExcelTypeDTO dto, MultipartFile file) throws IOException {
Class clazz = excelService.getImportClass(dto); //此处根据menu获得easyexcel导入封装的数据对象class
//EasyExcel.read(file.getInputStream(), clazz, new EasyExcelListener()).sheet().doRead();
//优化:监听器传值
EasyExcel.read(file.getInputStream(), clazz, new EasyExcelListener(excelListenerDao)).sheet().doRead();
String result = String.format("共导入成功%s条,失败%s",excelListenerDao.getSuccess(),excelListenerDao.getError());
return Result.ok(result);
}

service实现类:根据menu获得easyexcel导入时对应的Javaclass

因为easyexcel导入时是将表格数据转为指定的Java类,再传入监听器。所以导入前需要将数据指定对应的Javaclass

@Override
public Class getImportClass(ExcelTypeDTO dto) {
Class clazz = null;
switch (dto.getMenu()){
case "DISEASE":
clazz = DiseaseMonitorVO.class;
break;
//省略...
default:
break;
}
return clazz;
}

EasyExcelListener监听器:导入时每读一行数据将数据封装为Java类后进入监听器

@Component
@Slf4j
public class EasyExcelListener extends AnalysisEventListener { //ExcelListenerDao获得easyexcel导入时监听器返回的值。此处返回导入成功数量和失败数量
@Autowired
private ExcelListenerDao excelListenerDao;
//构造函数,一定要写,将excelListenerDao添加到监听中
public EasyExcelListener(ExcelListenerDao excelListenerDao) {
this.excelListenerDao = excelListenerDao;
} private static int success; //每次导入成功数量
private static int error; //每次导入失败数量 //此处其实也可将数据放入集合中,由外部controller获取集合列表另调方法
@Autowired
private InterfaceRobotMapper interfaceRobotMapper;
@Autowired
private JobRobotConfigMapper jobRobotConfigMapper; //当前工具类
private static EasyExcelListener listener;
//解决静态方法中不能直接用mapper的问题
@PostConstruct
public void init() {
listener = this;
} @Override
public void invoke(Object o, AnalysisContext analysisContext) {
log.info("==================导入开始=================="+ JsonUtils.write(o));
listener.save(o);
} @Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
log.info("==================导入完成==================");
log.info("共导入成功{}条,失败{}",success,error);
//将导入成功数量和失败数量返回excelListenerDao
excelListenerDao.setError(error);
excelListenerDao.setSuccess(success);
//将success和error清零
success = 0;
error = 0;
} private void save(Object o){
int result = 0;
if (o.getClass() == InterfaceRobot.class) {
//机器人
InterfaceRobot interfaceRobot = (InterfaceRobot) o;
InterfaceRobotExample example = new InterfaceRobotExample();
example.createCriteria().andCodeEqualTo(interfaceRobot.getCode());
List<InterfaceRobot> list = listener.interfaceRobotMapper.selectByExample(example);
if (list.size() > 0) {
log.error("导入错误:{}", ServiceErrCode.CODE_IS_EXIST);
}else {
//根据具体业务进行相应的数据处理
interfaceRobot.setId(IDGenerator.generateUUID());
interfaceRobot.setFlag(0);
result = listener.interfaceRobotMapper.insert(interfaceRobot);
}
}else if (o.getClass() == JobRobotConfigVO.class){
//机器人任务
JobRobotConfigVO vo = (JobRobotConfigVO)o;
result = listener.jobRobotConfigMapper.insert(vo);
} //统计成功数量和失败数量
if (result == 1) {
success = success +1;
}else {
error = error + 1;
}
} }

测试

使用postman测试导入导出

注意

  • excel.xsl一个sheet最多存储65535条数据,超过会报错。待优化:若数据录过大时需要用多sheet导入导出

EasyExcel导入导出的更多相关文章

  1. java使用户EasyExcel导入导出excel

    使用alibab的EasyExce完成导入导出excel 一.准备工作 1.导包 <!-- poi 相关--> <dependency> <groupId>org. ...

  2. 【Easyexcel】java导入导出超大数据量的xlsx文件 解决方法

    解决方法: 使用easyexcel解决超大数据量的导入导出xlsx文件 easyexcel最大支持行数 1048576. 官网地址: https://alibaba-easyexcel.github. ...

  3. Java实现导入导出Excel:POI和EasyExcel

    文章与CSDN同步,欢迎访问:https://blog.csdn.net/qq_40280582/article/details/107300081 代码地址:https://gitee.com/il ...

  4. 使用Layui、Axios、Springboot(Java) 实现EasyExcel的导入导出(浏览器下载)

    实现EasyExcel的导入导出(浏览器下载) 实现三个按钮的功能,但是却花费了一天的时间包括总结. 使用到的技术:springboot layui axios EasyExcel mybatis-p ...

  5. SpringCloud微服务实战——搭建企业级开发框架(三十):整合EasyExcel实现数据表格导入导出功能

      批量上传数据导入.数据统计分析导出,已经基本是系统必不可缺的一项功能,这里从性能和易用性方面考虑,集成EasyExcel.EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项 ...

  6. 导入导出笔记-easyExcel初探(表格导入和模板化导出)

    前言 本文使用的EasyExcel Alibaba和EasyPoi Apache技术栈分析 EasyExcel Dependency EasyPoi Dependency 1.需求一:表格化需求导入导 ...

  7. 使用VUE+SpringBoot+EasyExcel 整合导入导出数据

    使用VUE+SpringBoot+EasyExcel 整合导入导出数据 创建一个普通的maven项目即可 项目目录结构 1 前端 存放在resources/static 下 index.html &l ...

  8. JAVA对Excel的导入导出

    今天需要对比2个excel表的内容找出相同:由于要学的还很多上手很慢所以在这做个分享希望对初学的有帮助: 先是pom的配置: <dependency> <groupId>org ...

  9. SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

随机推荐

  1. JNI小记

    本文参考<较详细的介绍JNI>一文,并添加了一些方法,代码已经过测试,留待日后工作使用.关于JNI的HelloWorld的例子,就不赘述了. java代码: 1 package com.c ...

  2. vue3 script setup 定稿

    vue script setup 已经官宣定稿.本文主要翻译了来自 0040-script-setup 的内容. 摘要 在单文件组件(SFC)中引入一个新的 <script> 类型 set ...

  3. ArrayList 从源码角度剖析底层原理

    本篇文章已放到 Github github.com/sh-blog 仓库中,里面对我写的所有文章都做了分类,更加方便阅读.同时也会发布一些职位信息,持续更新中,欢迎 Star 对于 ArrayList ...

  4. java面向对象(下)-抽象类

    抽象类和抽象方法 抽象类和抽象方法必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法 抽象类和抽象方法的规则如下 1.抽象类和抽象方法必须要用abstra ...

  5. [刘阳Java]_为什么要前后端分离

    前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多 ...

  6. POJ 树的直径和重心

    树的直径:(无根)树上最长两点间的最长路径,两次dfs即可,第一次dfs任选一点u,找到距离它最远的点s,再从点s进行一次dfs,找到距离s最远的点t,则s-t之间的路径就是树的直径.证明: < ...

  7. 每天五分钟Go - 闭包

    闭包的示例代码 func getSequence() func() int{ i:=0 return func() int { i+=1 return i } } 首先,函数名getSequence, ...

  8. [IOI2005]mea

    IOI 读完题,感觉这个题并不是很难,那我是不是可以去IOI了: 最先考虑暴力,发现完全行不通,所以,我们考虑其他方法.突然发现:其实在确定 \(s_1\) 的时候,整个序列就可以确定了,所以我们考虑 ...

  9. vue+element实现分页--之--前端分页

    效果图: 访问的数据量小,一次返回所有数据,再次利用elementUI-Table 和el-pagination组件进行展示,关键点事数据的筛选 官网的完整案例 <div class=" ...

  10. Intouch/ifix语音报警系统制作(4-自动发送邮件提醒)

    在近期项目完成后,有遇到情况:类似于语音报警后,中控室人员未及时报告给我们造成了事件的危害升级,以及造成很不好的影响.针对这个情况特此添加语音报警后,自动发送邮件提醒,完善现有的报警机制. 1.函数编 ...