阿里easyExcel读取时自动忽略开头的空行解决办法

在使用EasyExcel3.2.1版本处理Excel导入功能时,遇到开头空行被自动过滤的问题。尝试通过自定义监听器并设置忽略空行选项无效。深入源码发现,当读取到开头的空行时,系统默认会忽略。为解决此问题,采取的策略是在监听器的invoke方法中检测首次调用并补充空对象,以确保数据完整性。

最近做excel导入功能时,测试人员导入的数据开头几行是空格,需要导入特定的第a-b行数据。结果发现开头的几个空白行老是被过滤掉了。导入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.2.1</version>
</dependency>

1,自定义监听器类继承AnalysisEventListener,重写invoke方法,context.readWorkbookHolder().setIgnooreEmptyRow(false). 这样子修改后,excel开头的空行还是被过滤掉了,中间和末尾的空行倒是没有再被过滤掉了

2,跟踪ExcelReader.reade(readSheet)方法,

到ExcelAnalyserIpl.analysis(List<ReadSheetList> readSheetList, Boolean readAll)的excelReadExecutor.execute()

到CsvExcelReadExecutor.execute()的excelReadExecutor.execute()的dealRecord(record, rowIndex++), 再到csvReadContext.analysisEventProcessor().endRow(csvReadContext)

当开头几行是空白时,执行到此处判断,是否忽略空白行默认是true, 因此直接return了,当执行到非空白行时才往下执行,然后回调重写后的invoke()方法, 重新设置是否忽略空白行值为false.

 没办法,我最后只好在invoke()方法获取当前物理行数context.readRowHolder().getRowIndex()进行判断:是否是第一次回调该方法,且当前物理行数大于0. 如果是就新增几个空对象补充上去,如果不是就改第一次回调该方法参数为false. 

### Java 使用阿里 EasyExcel 读取 Excel 间出现分钟偏差解决方案 在使用EasyExcel处理Excel文件的过程中,可能会遇到间字段读取不准确的情况,特别是当存在分钟级别的偏差。这种现象通常由日期格式解析差异引起。 为了确保间能够被正确解析,在定义`@Column`注解应指定对应的日期格式字符串。对于包含分钟的数据列,推荐设置精确到分的模式,例如`yyyy-MM-dd HH:mm`[^1]: ```java @Column(value = "A", format="yyyy-MM-dd HH:mm") private Date time; ``` 如果仍然遭遇精度丢失,则需考虑自定义转换器来增强控制力。通过实现`ReadConverter`接口并注册至全局配置或特定属性上,可以针对特殊情况进行定制化调整。下面展示了一个简单的例子用于修正可能存在的分钟级误差: ```java public class MinuteAccuracyDateConverter implements ReadConverter<Date> { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); @Override public Class<?> supportJavaTypeKey() { return Date.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } @Override public Date convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { String strValue = (String)cellData.getStringValue(); LocalDateTime ldt = LocalDateTime.parse(strValue, FORMATTER); return java.sql.Timestamp.valueOf(ldt).toLocalDateTime().toDate(); } } ``` 最后一步是在初始化Reader对象之前完成对该类实例的注入工作。这可以通过调用`ExcelReaderBuilder.addConverters()`方法轻松实现: ```java List<CustomConverter<?>> converters = new ArrayList<>(); converters.add(new MinuteAccuracyDateConverter()); EasyExcel.read(fileInputStream) .registerConverter(converters.toArray(new CustomConverter[0])) ... .build(); ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值