easyExcel读数据后在写入另一个excel

2024-01-03 15:58

本文主要是介绍easyExcel读数据后在写入另一个excel,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求说明:如下图所示,excel中有4个sheet,每个sheet的数据格式都一样,有5列,第一列为订单id,现在要根据订单id到数据库中查询出其他几列的信息并补充到excel中。

代码如下:首先为service中的主方法

 public void userMessage() {
//        String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();ApplicationHome h = new ApplicationHome(getClass());File jarF = h.getSource();String path = jarF.getParentFile().toString();log.info("excel service jar2 path is:"+path+"==============================");//获取附件1的excelString adjunctOnePath = path+ File.separator+"1.xlsx";String adjunctOneWritePath = path+ File.separator+"1_complete.xlsx";File srcFile = new File(adjunctOnePath);File destFile = new File(adjunctOneWritePath);FileUtils.copyFile(srcFile,destFile);ExcelReader excelReader = EasyExcel.read(adjunctOnePath).excelType(ExcelTypeEnum.XLSX).autoCloseStream(true).build();// 新建一个ExcelWriterBuilder实例ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(destFile)).excelType(ExcelTypeEnum.XLSX).autoCloseStream(true).build();processSheet(0,excelReader,excelWriter,this::completeSheet1Data);processSheet(1,excelReader,excelWriter,this::completeSheet2Data);processSheet(2,excelReader,excelWriter,this::completeSheet2Data);processSheet(3,excelReader,excelWriter,this::completeSheet4Data);excelReader.finish();excelWriter.finish();}

上面首先我获取到了jar包的所在目录,因为我把excel和jar包放到了同一目录,其中1.xlsx是原始文件,1_complete.xlsx是要写入数据的文件,我这里直接复制了一份原文件。

然后我分别创建了ExcelReader 和ExcelWriter俩个对象,用于读和写excel。后面就是处理4个sheet的代码,我调用了4次方法,下面看下主要逻辑processSheet的代码:

private void processSheet(int sheetNo,ExcelReader excelReader, ExcelWriter excelWriter, Consumer<Map<Integer, String>> consumer) {Map<Integer, String> head = new HashMap<>();List<List<String>> data = new LinkedList<>();// 构建输出的sheetWriteSheet writeSheet = EasyExcel.writerSheet(sheetNo,"模板-"+sheetNo).build();final int[] num = {0};ReadSheet readSheet = EasyExcel.readSheet(sheetNo).registerReadListener(new AnalysisEventListener<Map<Integer, String>>() {@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {head.putAll(headMap);List<List<String>> header = head.values().stream().map(Collections::singletonList).collect(Collectors.toList());writeSheet.setHead(header);}@Overridepublic void invoke(Map<Integer, String> row, AnalysisContext analysisContext) {num[0]++;//补充数据consumer.accept(row);data.add( row.values().stream().collect(Collectors.toList()));if(num[0]%50==0){log.info("================read num is {}==============",num[0]);excelWriter.write(data,writeSheet);data.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 这里可以打印日志告知所有行读取完毕System.out.println("读取完毕");excelWriter.write(data,writeSheet);}}).build();writeSheet.setSheetName(readSheet.getSheetName());excelReader.read(readSheet);}

可以看到有4个参数,分别是sheet的序号(从0开始),还有上面提到的ExcelReader 和ExcelWriter俩个对象,最后是一个Consumer对象主要用来根据orderid查询其他列的数据,这个consumer跟我的业务有关,不是重点。上面可以看到构造readSheet 对象的时候注册了一个AnalysisEventListener,这个对象内部有三个方法:

invokeHeadMap方法会读取到excel的标题行,我这里读取到之后直接设置到了writeSheet里。

invoke方法会没每一行数据都会触发一次,我这里对每一行数据调用了上面提到的Consumer进行了处理(主要是到数据库里查询其他的数据),将处理后的数据放到一个list里保存,同时每50条会写一次,防止内存数据过多。

doAfterAllAnalysed方法 读取完之后会触发,我这里接着把剩余的数据写入到writesheet。

下面是Consumer对象对应的方法,如下:主要是查询数据。

 private void completeSheet2Data(Map<Integer, String> row) {String outerId = row.get(0);Condition condition = new Condition(BaixinCreditApply.class);condition.createCriteria().andEqualTo("outerOrderId",outerId);BaixinCreditApply   baixinCreditApply = baixinCreditApplyMapper.selectOneByExample(condition);if(Objects.isNull(baixinCreditApply)){log.info("======根据outer id {} 未查询到数据========",outerId);return ;}Long uid = baixinCreditApply.getUid();//查询身份证号String idCard = "-";String idStartDate = "-";String idEndDate = "-";condition = new Condition(OcrIdCard.class);condition.createCriteria().andEqualTo("uid",uid);OcrIdCard ocrIdCard = ocrIdCardMapper.selectOneByExample(condition);if(Objects.nonNull(ocrIdCard)){String idNumberAes = ocrIdCard.getIdNumberAes();idCard = BasicInfoEncryptUtil.decrypt(idNumberAes);String validDate = ocrIdCard.getValidDate();if(StringUtils.isNotBlank(validDate)&&validDate.indexOf("-")>=0){idStartDate = validDate.split("-")[0];idEndDate = validDate.split("-")[1];}}row.put(1,String.valueOf(uid));row.put(2,idStartDate);row.put(3,idEndDate);row.put(4,idCard);}

 

 

 

 

这篇关于easyExcel读数据后在写入另一个excel的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566250

相关文章

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Python Excel实现自动添加编号

《PythonExcel实现自动添加编号》这篇文章主要为大家详细介绍了如何使用Python在Excel中实现自动添加编号效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍简单的说,就是在Excel中有一列h=会有重复

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://