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实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

java poi实现Excel多级表头导出方式(多级表头,复杂表头)

《javapoi实现Excel多级表头导出方式(多级表头,复杂表头)》文章介绍了使用javapoi库实现Excel多级表头导出的方法,通过主代码、合并单元格、设置表头单元格宽度、填充数据、web下载... 目录Java poi实现Excel多级表头导出(多级表头,复杂表头)上代码1.主代码2.合并单元格3.