封装Easyexcel工具类导入表格数据存入数据库
导入和导出方法类型,但导入需要定义一个工具类继承AnalysisEventListener监听器
一、引入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency>
二、编写ExcelUtil
/** * Excel表格工具类 */ @Slf4j public class ExcelUtil { //-------------------------------------------------------------- 导入文件解析监听类 start ---------------------------------------------------- /** * 读取文件解析监听类 * @param <T> */ public static class ExcelListener<T> extends AnalysisEventListener<T> { /** * 存放读取后的数据 */ public List<T> datas = new ArrayList<>(); /** * 逐条读取数据 */ @Override public void invoke(T t, AnalysisContext analysisContext) { datas.add(t); } /** * 解析读取数据总条数 */ @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { log.info("读取数据条数:{}条!", datas.size()); } public List<T> getDatas() { return this.datas; } } /** * 读取Excel表格返回数据集合,默认读取第一个sheet表数据 * @param inputStream 输入流 * @param tClass 数据映射类 * @param excelListener 读取监听类 * @param <T> 泛型 * @return List结果集 */ public static <T> List<T> readExcel(InputStream inputStream, Class<T> tClass, ExcelListener<T> excelListener) { if (inputStream == null || tClass == null || excelListener == null) { return null; } ExcelReaderBuilder read = EasyExcel.read(inputStream, tClass, excelListener); read.sheet().doRead(); return excelListener.getDatas(); } /** * 读取Excel表格返回数据集合,设置读取第几个sheet表数据 * @param inputStream 输入流 * @param sheetNo 第X个sheet表 * @param tClass 数据映射类 * @param excelListener 读取监听类 * @param <T> 泛型 * @return List结果集 */ public static <T> List<T> readExcel(InputStream inputStream, Integer sheetNo, Class<T> tClass, ExcelListener<T> excelListener) { if (inputStream == null || tClass == null || excelListener == null) { return null; } ExcelReaderBuilder read = EasyExcel.read(inputStream, tClass, excelListener); if (sheetNo != null) { read.sheet(sheetNo).doRead(); } else { ExcelReader excelReader = read.build(); excelReader.readAll(); excelReader.finish(); } return excelListener.getDatas(); } //-------------------------------------------------------------- 导入文件解析监听类 end ---------------------------------------------------- }
三、编写接收层controller
RequestParam对应的参数请求类型content-type,可理解为媒体类型,比如文件的上传和下载,spring中专门有个支持的类MultipartFile来支持这种请求。
@PostMapping("/import") public void import(@RequestParam(value = "file") MultipartFile file) { service.import(file); }
四、在serviceImpl里调用工具类读取表格数据
@Override public void import(MultipartFile file) throws IOException { //读取上传文件数据转换成 List<Export> list = ExcelUtil.readExcel(file.getInputStream(), 1, Export.class, new ExcelUtil.ExcelListener<>()); // 拿到list后发送给mapper层存入数据库 Mapper.insertImport(list); }
service层和mapper层省略不写,获取list之后按照批量存入数据库方法写入数据库内
五、在postman中进行导入测试
选择File类型,上传需要导入的文件