定义Excel模板时,会生产空行问问题,可以自定义监听器过滤空行。以PageReadListener为例。
java
/**
* 自定义读取监听器,解决无法空行问题
*
*/
@Slf4j
public class MyPageReadListener<T> extends PageReadListener<T> {
@Override
public void invoke(T data, AnalysisContext context) {
// 如果一行Excel数据均为空值,则不装载该行数据
if (isLineNullValue(data)) {
return;
}
...
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
...
}
/**
* 判断整行单元格数据是否均为空
*/
private boolean isLineNullValue(T data) {
if (data instanceof String) {
return Objects.isNull(data);
}
try {
List<Field> fields = Arrays.stream(data.getClass().getDeclaredFields())
.filter(f -> f.isAnnotationPresent(ExcelProperty.class))
.collect(Collectors.toList());
List<Boolean> lineNullList = new ArrayList<>(fields.size());
for (Field field : fields) {
field.setAccessible(true);
Object value = field.get(data);
if (Objects.isNull(value)) {
lineNullList.add(Boolean.TRUE);
} else {
lineNullList.add(Boolean.FALSE);
}
}
return lineNullList.stream().allMatch(Boolean.TRUE::equals);
} catch (Exception e) {
log.error("读取数据行[{}]解析失败: {}", data, e.getMessage());
}
return true;
}
}