【问题排查】easyexcel日志打印Empty row!

问题原因

日志打印​​I/O 操作开销​(如 Log4j 的 FileAppender)会阻塞业务线程,直到日志写入完成,导致接口响应变慢

问题描述

  1. 在线上环境,客户反馈导入一个不到1MB的excel文件,耗时将近5分钟。

问题排查

  1. 发现日志文件有打印超多以下日志:
    WARN DefaultAnalysisEventProcessor:41 - Empty row!

  2. 和客户拿到文件分析后认定是客户导入的文件中存在大量的空行。导致的上述日志疯狂打印,每一行是空都会打印一条,导致接口耗时变慢。

  3. 源码寻找,如图:
    在这里插入图片描述

  4. 发现这行日志打印需满足日志等级是debug级别的才会打印。嗨,恰巧,由于项目年代久远我司线上环境日志级别是debug,导致了上述问题的发生。

问题解决

修改日志级别为info 避免日志打印。
Log4j日志配置修改方法

log4j.logger.com.alibaba.excel.read.processor.DefaultAnalysisEventProcessor=INFO

spring boot项目,日志级别修改方式

logging:
  level:
    com.alibaba.excel.read.processor.DefaultAnalysisEventProcessor: INFO
EasyExcel 是一个基于 Java 的开源工具,用于简化 Excel 文件的读写操作。要实现打印 Excel,可以按照以下步骤进行操作: 1. 首先,确保你已经引入了 EasyExcel 的依赖。可以在项目的 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.3.2</version> </dependency> ``` 2. 创建一个打印的 Excel 模板文件,可以使用 Excel 软件进行设计,包括需要打印的内容和样式。 3. 在 Java 代码中,使用 EasyExcel 的 API 加载并读取该模板文件。例如: ```java String templatePath = "path/to/template.xlsx"; List<Object> data = new ArrayList<>(); // 填充打印数据的集合,可以是自定义的对象列表 ExcelReader reader = EasyExcel.read(templatePath).build(); data = reader.readAllSync(); reader.finish(); ``` 4. 对读取到的数据进行处理,并进行打印配置。例如,可以设置打印区域、打印方向、打印纸张等。 ```java Workbook workbook = reader.getWorkbook(); // 获取 Workbook 对象 Sheet sheet = workbook.getSheet(0); // 获取第一个 Sheet PrintSetup printSetup = sheet.getPrintSetup(); printSetup.setPaperSize(PrintSetup.A4_PAPERSIZE); // 设置纸张大小 printSetup.setLandscape(false); // 设置打印方向为纵向 sheet.setPrintArea(0, 0, 10, 10); // 设置打印区域,这里假设为 A1 到 K11 区域 // 其他打印配置,如设置页眉页脚、打印标题等 ``` 5. 最后,调用 EasyExcel 的写入 API 将处理后的数据写入到新的 Excel 文件中,并保存。 ```java String outputPath = "path/to/output.xlsx"; ExcelWriter writer = EasyExcel.write(outputPath).withTemplate(templatePath).build(); writer.write(data, sheet); writer.finish(); ``` 以上就是使用 EasyExcel 实现打印 Excel 的基本步骤。根据具体的需求,你可以进一步自定义打印配置和处理数据的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值