EasyExcel读取多个sheet表数据,自定义监听器
接口
/**
* 导入
*
* @param file
* @return
*/
@PostMapping("/waitimport")
public Result waitImport(@RequestParam("file") MultipartFile file) {
try {
ExcelReader read = EasyExcel.read(file.getInputStream()).build();
ReadSheet sheet1 = EasyExcel.readSheet("流水列表").head(BankSerialWaitCheckImportDto.class).registerReadListener(bankSerialWaitCheckImportListener).build();
ReadSheet sheet2 = EasyExcel.readSheet("明细列表").head(BusinessBillsBankSerialImportDto.class).registerReadListener(businessBillsBankSerialImportListener).build();
read.read(sheet1, sheet2);
read.finish();
ThreadLocal<List<BankSerialWaitCheckImportDto>> dataListLocal1 = bankSerialWaitCheckImportListener.getDataList();
List<BankSerialWaitCheckImportDto> bsList = (List<BankSerialWaitCheckImportDto>) dataListLocal1.get();
ThreadLocal<List<BusinessBillsBankSerialImportDto>> dataListLocal2 = businessBillsBankSerialImportListener.getDataList();
List<BusinessBillsBankSerialImportDto> billsRecv = (List<BusinessBillsBankSerialImportDto>) dataListLocal2.get();
Result result = bankSerialService.handleWaitCheckPageImport(bsList, billsRecv);
return Result.ok();
} catch (Exception e) {
e.printStackTrace();
return Result.error("导入失败:" + e.getMessage());
}
}
监听器
package com.chinaums.chcp.biz.importXls.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.chinaums.chcp.biz.importXls.vo.BankSerialWaitCheckImportDto;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@Scope("prototype")
public class BankSerialWaitCheckImportListener extends AnalysisEventListener<BankSerialWaitCheckImportDto> {
// 保存结果
List<BankSerialWaitCheckImportDto> saveList = new ArrayList<>();
ThreadLocal<List<BankSerialWaitCheckImportDto>> dataList = new ThreadLocal<>();
/**
* 每读一行内容,都会调用一次该对象的invoke,在invoke可以操作使用读取到的数据
*
* @param vo
* @param analysisContext
*/
@Override
public void invoke(BankSerialWaitCheckImportDto vo, AnalysisContext analysisContext) {
vo.setNum(saveList.size() + 1);
saveList.add(vo);
}
/**
* 读取完整个文档之后,调用的方法
*
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
List<BankSerialWaitCheckImportDto> newList = new ArrayList<>();
newList.addAll(saveList);
saveList.clear();
dataList.set(newList);
}
public ThreadLocal<List<BankSerialWaitCheckImportDto>> getDataList() {
return dataList;
}
}
package com.chinaums.chcp.biz.importXls.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.chinaums.chcp.biz.importXls.vo.BusinessBillsBankSerialImportDto;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@Scope("prototype")
public class BusinessBillsBankSerialImportListener extends AnalysisEventListener<BusinessBillsBankSerialImportDto> {
// 保存结果
List<BusinessBillsBankSerialImportDto> saveList = new ArrayList<>();
ThreadLocal<List<BusinessBillsBankSerialImportDto>> dataList = new ThreadLocal<>();
/**
* 每读一行内容,都会调用一次该对象的invoke,在invoke可以操作使用读取到的数据
*
* @param vo
* @param analysisContext
*/
@Override
public void invoke(BusinessBillsBankSerialImportDto vo, AnalysisContext analysisContext) {
vo.setNum(saveList.size() + 1);
saveList.add(vo);
}
/**
* 读取完整个文档之后,调用的方法
*
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
List<BusinessBillsBankSerialImportDto> newList = new ArrayList<>();
newList.addAll(saveList);
saveList.clear();
dataList.set(newList);
}
public ThreadLocal<List<BusinessBillsBankSerialImportDto>> getDataList() {
return dataList;
}
}
实体类
package com.xxx.chcp.biz.importXls.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 流水列表
*/
@Data
//导出时忽略没有@ExcelProperty的字段
@ExcelIgnoreUnannotated
public class BankSerialWaitCheckImportDto implements Serializable {
private Integer num;
@ExcelProperty(value = "唯一标识")
private String id;
/**
* 银行名称-关联
*/
@ExcelProperty(value = "银行名称")
private String bankName;
/**
* 项目名称
*/
@ExcelProperty(value = "项目名称")
private String projectName;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
package com.xxx.chcp.biz.importXls.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.chinaums.chcp.base.annotation.Dict;
import com.chinaums.chcp.base.constant.SysConstant;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 明细列表
*/
@Data
//导出时忽略没有@ExcelProperty的字段
@ExcelIgnoreUnannotated
public class BusinessBillsBankSerialImportDto implements Serializable {
private Integer num;
/**
* 关联银行流水入账ID
*/
@ExcelProperty(value = "关联的唯一标识")
private String bankSerialId;
/**
* 合同号
*/
@ExcelProperty(value = "合同编号")
private String contractNo;
/**
* 合同金额
*/
@ExcelProperty(value = "合同金额")
private String contractAmount;
}
EasyExcel读取多个sheet表数据,自定义监听器的更多相关文章
- Easypoi实现excel多sheet表导入导出功能
Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 <!-- 导出文件工具 EasyPoi实现Excel读写管理测试 ...
- 使用python对工作簿每个sheet表进行数据可视化展示(本案例是从第2个sheet开始循环读取也就是索引为1的表)
# 导入相关模块from pyecharts.charts import Barfrom pyecharts import options as optsfrom pyecharts.charts i ...
- c# applibrary实现一个Sheet表中存放多张DataTable数据
1.工具类(applibrary.dll) public class ExcelHelper { /// <summary> /// 文件名 /// </summary> pu ...
- MVC视图中读取ViewBag传递过来的HashTable表数据
视图中头部添加 @using System.Collections; 循环读取哈希表数据 <ul id="AccessView" class="sys_spec_t ...
- Java读取excel指定sheet中的各行数据,存入二维数组,包括首行,并打印
1. 读取 //读取excel指定sheet中的各行数据,存入二维数组,包括首行 public static String[][] getSheetData(XSSFSheet sheet) thro ...
- HBase表数据的转移之使用自定义MapReduce
目标:将fruit表中的一部分数据,通过MR迁入到fruit_mr表中 Step1.构建ReadFruitMapper类,用于读取fruit表中的数据 package com.z.hbase_mr; ...
- 如何实现MySQL表数据随机读取?从mysql表中读取随机数据
文章转自 http://blog.efbase.org/2006/10/16/244/如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysql ...
- pandans导出Excel并将数据保存到不同的Sheet表中
数据存在mongodb中,按照类别导出到Excel文件,问题是想把同一类的数据放到一个sheet表中,最后只导出到一个excel文件中# coding=utf-8import pandas as pd ...
- Selenium应用代码(读取mysql表数据登录)
1. 封装链接数据库的类: import java.sql.ResultSet; import java.sql.Connection; import java.sql.DriverManager; ...
- Spark无法读取hive 3.x的表数据
通过Ambari2.7.3安装HDP3.1.0成功之后,通过spark sql去查询hive表的数据发现竟然无法查询 HDP3.0 集成了hive 3.0和 spark 2.3,然而spark却读取不 ...
随机推荐
- 添加xxx.so到环境变量里
点击查看代码 libxxx.so 文件位于 /usr/local/lib 目录下,你可以按照以下步骤操作: 创建配置文件: echo "/usr/local/lib" | sudo ...
- Java 设计模式:装饰者模式(Decorator Pattern)
一.模式定义 装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式.该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭). 二.核心角色 Co ...
- Django实战项目-学习任务系统-任务完成率统计
接着上期代码内容,继续完善优化系统功能. 本次增加任务完成率统计功能,为更好的了解哪些任务完成率高,哪些任务完成率低. 该功能完成后,学习任务系统1.0版本就基本完成了. 1,编辑urls配置文件:. ...
- 【Esp32】为 idf 定制本地 Arduino 组件
在开始今天的水文前,老周先要奉劝一下国内某些嵌入式砖家和穴者,不要看不起 Arduino,它不是一种开发板,而是一种规范.Arduino 的思想是正确的,把各种开发板封装为统一的 API,让许多开源库 ...
- 【Java】修饰符
修饰符(Modifier):是用于限定类型以及类型成员的声明的一种符号. 其用来定义类.方法或者变量,通常放在语句的最前端. 例子: public class Person { default Str ...
- 【Python】Python使用Tk实现动态爱心效果
[Python]Python使用Tk实现动态爱心效果 深夜种下希望,梦中便能发芽 相对于之前的版本(晚上星月争辉,美梦陪你入睡),解决了看起来很卡.爱心跳动死板和外围光环不怎么灵动的问题,添加了文字功 ...
- Tomcat知识点整理
从学习起就开始接触tomcat, 解压, 点击运行, 然后放文件夹里面会自动部署, 可以通过ip访问. 在这里主要记录一些tomcat相关的知识点 配置文件解析(留位置) server.xml/web ...
- 如何基于 Kestrel 实现 socks5 代理
前言 之前做了个轮子NZOrz, 本来打算慢慢参照Kestrel和Yarp长久地写着玩 奈何川普上台,关税,订婚案,自身和钱包等等各种乐子层出不穷,无暇慢悠悠地写轮子玩 还有有些盆友也想知道能否直接使 ...
- 松灵机器人scout mini 自主导航(5)——采用CMU团队导航策略
重操旧业,最近实验室又需要测试无人车导航算法,因此又重新启动了松灵机器人scout mini小车 自主导航项目.通过调研,最终选择了前几年比较火的CMU团队的策略(https://www.cmu-ex ...
- 【记录】C语言|获取其他文件的绝对路径转为相对路径的两种代码
GetModuleFileName获取当前程序的绝对路径.然后对比再strcat之类的. 只能获得同一盘符下的相对路径: #include <string.h> /*pa是绝对路径,rel ...