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

相关文章

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

通过C#获取Excel单元格的数据类型的方法详解

《通过C#获取Excel单元格的数据类型的方法详解》在处理Excel文件时,了解单元格的数据类型有助于我们正确地解析和处理数据,本文将详细介绍如何使用FreeSpire.XLS来获取Excel单元格的... 目录引言环境配置6种常见数据类型C# 读取单元格数据类型引言在处理 Excel 文件时,了解单元格

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格