EasyExcel对于导入导出的操作十分简洁,记录一下多个sheet且内容不一致的导入导出。

引入 easyExcel依赖

    <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.1</version></dependency>
  1. 导出下载

提示:其中部分代码操作Dao层可以删除,可以自己创建ExportUserExcel 对象进行测试,思路数据映射到excel中。
这里ExportUserExcel .class 映射的模板替换下面代码中

@AllArgsConstructor
@NoArgsConstructorUser
@Builder
@HeadRowHeight(value = 20)
public class ExportUserExcel {@ExcelProperty(value = "姓名",index = 0)@ColumnWidth(value = 10)private String userName;@ExcelProperty(value = "年龄",index = 1)@ColumnWidth(value = 20)private String age;@ExcelProperty(value = "性别",index = 2)@ColumnWidth(value = 20)private String gender;
}
  1. 导出下载 ExportUserExcel.class 模板
 public void modelExport(HttpServletResponse response, Long id) {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码try {String fileName = URLEncoder.encode("Physical", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");//新建ExcelWriterExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();//获取sheet0对象WriteSheet mainSheet = EasyExcel.writerSheet(0, "模型信息").head(ExportUserExcel.class).build();//获取模型信息,向sheet0写入数据DmmPhysicalModel dmmPhysicalModel = dmmPhysicalModelMapper.selectById(id);List<DmmPhysicalModel> dmmPhysicalModels1 = Arrays.asList(dmmPhysicalModel);excelWriter.write(dmmPhysicalModels1, mainSheet);//获取sheet1对象WriteSheet detailSheet = EasyExcel.writerSheet(1, "词条信息").head(ExportUserExcel.class).build();HashMap entryHashMap = new HashMap<>();entryHashMap.put("model_id", id);//获取词条信息,向sheet1写入数据List<DmmPhysicalEntry> list = dmmPhysicalEntryMapper.selectByMap(entryHashMap);excelWriter.write(list, detailSheet);//关闭流excelWriter.finish();} catch (IOException e) {log.error("导出异常{}", e.getMessage());}}
  1. 导入excel 存入数据库,

    2.1 接收excel实体数据类
    

    注意:一定要和excel表标题内容一致 ,
    @ExcelProperty(value = “标题名称”)

/*** Copyright 2022 bejson.com */
package com.dtyunxi.yundt.cube.biz.item.svr.rest;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;/*** Auto-generated: 2022-07-20 14:18:43** @author bejson.com (i@bejson.com)* @website http://www.bejson.com/java2pojo/*/
@Data
public class ModelImportVO{@ExcelProperty(value = "标题名称")private String title;@ExcelProperty(value = "标题名称")private String merchant_no;@ExcelProperty(value = "标题名称")private String terminal_id;@ExcelProperty(value = "标题名称")private String token;}

这里很多博客的代码没有贴全,少了一个监视器读取excel的类!

package com.infinitus.dmm.service.impl;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;import java.util.ArrayList;
import java.util.List;/*** excel表格读取监视器*/
public class ExcelListener extends AnalysisEventListener {//可以通过实例获取该值private List<Object> datas = new ArrayList<Object>();public void invoke(Object o, AnalysisContext analysisContext) {datas.add(o);doSomething(o);}private void doSomething(Object object) {}public List<Object> getDatas() {return datas;}public void setDatas(List<Object> datas) {this.datas = datas;}public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}

2.excel导入到数据库 多个sheet、
ModelImportVO.class这也是模板,自己可以定义,对应的值。

 @PostMapping("test/excel/import")public void modelImport(MultipartFile serviceFile) throws IOException {//输入流InputStream inputStream = serviceFile.getInputStream();//监视器ExcelListener listener = new ExcelListener();ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();// 第一个sheet读取类型ReadSheet readSheet1 = EasyExcel.readSheet(0).head(ModelImportVO.class).build();// 第二个sheet读取类型ReadSheet readSheet2 = EasyExcel.readSheet(1).head(EntryImportVO.class).build();// 开始读取第一个sheetexcelReader.read(readSheet1);//excel sheet0 信息List<Object> list = listener.getDatas();//List<object> 转 List<实体类>List<JsonRootBean> dtoList = new ArrayList<>();//List object for 转换 实体类for (Object objects : list) {JsonRootBean dto = (JsonRootBean) objects;dtoList.add(dto);}//List 转JOSNString json = JSON.toJSONString(dtoList);System.out.println("json = " + json);// 清空之前的数据listener.getDatas().clear();// 开始读取第二个sheetexcelReader.read(readSheet2);//excel sheet1 信息List<Object> entry = listener.getDatas();//copy上面作法}

执行psotman接口请求

补充获取sheet名称 长度等信息方法
//获取从第二个sheet读取类型 词条多个sheet
//监视器
ExcelListener listener = new ExcelListener();
ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();
//弃用方法 List sheets = excelReader.getSheets();
// 新方法
List sheets = excelReader.excelExecutor().sheetList();

导入文件没有创建实例类模板

兼容任何标题的Excel

  //文件获取流InputStream inputStream = checkDTO.getFile().getInputStream();//excel监听器NoModelDataListener noModelDataListener = new NoModelDataListener(tableType);EasyExcel.read(inputStream, noModelDataListener).sheet().doRead();

数据统一在监听器进行插入更新

package io.sugo.cdp.upload.download.config;import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import io.sugo.cdp.upload.download.util.RegularUtils;
import lombok.Data;
import org.apache.commons.lang.StringUtils;import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;/*** easyExcel监听器* 不创建实体读取excel方式泛型用map:<Map<Integer, String>>** @author*/
@Data
public class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {/*** excel标题字段类型*/private List<String> excelType;/*** 统计对比错误次数*/private AtomicInteger rowCountError = new AtomicInteger();/*** 执行总条数*/private AtomicLong rowCount = new AtomicLong();/*** 返回错误信息的结果集*/List<String> results = new ArrayList<>();@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {//mapfor (Map.Entry<Integer, String> next : data.entrySet()) {String message = next.getValue();if (message != null) {message = message.replaceAll("[\\t\\n\\r]", "");}//正则检验每一列String result = RegularUtils.excelRegular(excelType.get(next.getKey()), message);if (StringUtils.isNotBlank(result)) {//返回前10条校验错误信息if (rowCountError.get() < 10) {long numberOfRows = rowCount.get() + 1L;String stringResult = "校验失败 - 第" + numberOfRows + "行:" +"(" + next.getValue() + ") " + result;String jsonString = JSON.toJSONString(stringResult);results.add(jsonString);rowCountError.incrementAndGet();}}}//统计总行数rowCount.incrementAndGet();}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {saveData();System.out.println("rowCount = " + rowCount.get());}/*** 加上存储数据库*/private void saveData() {}public NoModelDataListener(List<String> excelType) {this.excelType = excelType;}}
常用excel导入 数据转JSON 格式  快速构建工具代码  配合上面的监视器
package com.dtyunxi.yundt.cube.biz.item.svr.rest;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.fastjson.JSON;
import com.dtyunxi.yundt.cube.biz.item.svr.rest.ExcelListener;
import com.dtyunxi.yundt.cube.biz.item.svr.rest.ModelImportVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @author 瑾秋* @date 2022-08-05 9:56*/
@RestController
public class Test11 {@PostMapping("test/excel/import")public void modelImport(MultipartFile serviceFile) throws IOException {//输入流InputStream inputStream = serviceFile.getInputStream();//监视器ExcelListener listener = new ExcelListener();ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();// 第一个sheet读取类型ReadSheet readSheet1 = EasyExcel.readSheet(0).head(ModelImportVO.class).build();// 开始读取第一个sheetexcelReader.read(readSheet1);//excel sheet0 信息List<Object> list = listener.getDatas();//List<object> 转 List<实体类>List<ModelImportVO> dtoList = new ArrayList<>();//List object for 转换 实体类for (Object objects : list) {ModelImportVO dto = (ModelImportVO) objects;dtoList.add(dto);}List<ModelImportVO> ten = new ArrayList<>();//每个二十个输出一次for (ModelImportVO modelImportVO : dtoList) {if (ten.size() == 20) {System.out.println( JSON.toJSONString(ten));ten.clear();}ten.add(modelImportVO);}//最后不足二十输出一次System.out.println(JSON.toJSONString(ten));}}

Easyexcel导入导出多个sheet相关推荐

  1. EasyExcel导入导出下载模板(带下拉)

    EasyExcel导入导出网上资料很多,这里就不多做描述了,总之就是一款比较轻而小,易用的excel操作工具包:这里在项目中使用到,做下笔记.以及表格中下拉框的实现: 声明:本文思路是借鉴于某大神的, ...

  2. 【使用EasyExcel导入导出】

    使用EasyExcel导入导出 一,为什么要使用EasyExcel 1.1 EasyExcel与Poi的区别 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个 ...

  3. 阿里EasyExcel导入导出

    阿里EasyExcel导入导出 前言 使用阿里提供的EasyExcel进行excel的导入导出简单,方便,快捷 ` 一.使用版本 <dependency><groupId>co ...

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

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

  5. Spring Boot + EasyExcel 导入导出,好用到爆!

    今日推荐 Java 8 一行代码解决了空指针问题,太厉害了...List中remove()方法的陷阱,被坑惨了!25000 字详解 23 种设计模式,原来可以这么简单!最牛逼的 Java 日志框架,性 ...

  6. Spring Boot使用EasyExcel导入导出Excel

    一.导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</a ...

  7. easyExcel导入导出(列锁定单元格、表头合并、导出类型限制、锁定单元格增加底色、设置密码、隐藏列等)

    easyexcel官网文档:https://www.yuque.com/easyexcel/doc/easyexcel easyexcel {maven 版本} GitHub网址:https://gi ...

  8. 使用阿里开源的EasyExcel导入导出EXCEL——工具类

    工具类 package com.example.demo.util.excel;import com.alibaba.excel.EasyExcel; import com.alibaba.excel ...

  9. EasyExcel导入导出excel 复杂表头 表头校验 数据校验

    目录 EasyExcel特点 一.导入excel案例 二.读取excel的相关技术点 1.读取excel的方式 2.读取sheet数量 3.指定从第几行开始读数据 三.导出excel 1.前端发起请求 ...

最新文章

  1. 理解RESTful架构
  2. 刚刚!2021世界一流学科排名,正式发布!
  3. 对抗性攻击轻松愚弄人工智能
  4. android adb恢复出厂设置,android开发分享擦除数据/通过ADB恢复出厂设置
  5. Python-面向对象进阶
  6. python 语言教程(3)变量之字典
  7. 【有三吐槽】程序员改BUG的六重境界,你,第几重了?
  8. 信息系统项目管理师题型及题数
  9. Ribbon源码解析(一)
  10. 工作流学习——Activiti整体认识二步曲
  11. winserver的consul部署实践与.net core客户端使用(附demo源码)
  12. 应用实践 | 南方科技大学研发基于新型冠状病毒知识图谱模式挖掘系统
  13. 计算机由简单的二进制阴阳,二进制之美,大道至简,二生万物!
  14. Sipdroid项目的编译运行
  15. h5调用摄像头 android,H5 使用移动端摄像头
  16. 窃取5亿雅虎用户信息的黑客 被判处5年有期徒刑
  17. 2021 绩效管理必读
  18. java算法一个岛屿上一个说真话 一个说假话_面试常问智力题40道(逻辑题)+ 参考答案...
  19. STM32L4时钟系统(转载)
  20. Linux学习——废旧电脑再利用Ubuntu部署私有云Nextcloud

热门文章

  1. 文件服务器报502,SFTP文件管理-服务端发生错误502、504
  2. redis设计与实现 笔记(一)
  3. 微服务-微服务为什么要用到 API 网关
  4. FileReader的编码问题
  5. 《詹姆斯·高斯林Java白皮书1996自译》00:概览
  6. 【译】Jep文档(4)——数据类型(Data Type)
  7. Java~Java代理模式
  8. input值变化监听事件
  9. List集合(列表)
  10. 几款实用的内网穿透工具,推荐