表格中包含3行固定内容,
Test.java
@Ignore
public class ReadTest {
@Test
public void read() {
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "test1.xlsx";
EasyExcel.read(fileName, TestData.class, new DataListener()).sheet().headRowNumber(1).doRead();
}
}
DataListener.java
@Slf4j
public class DataListener extends AnalysisEventListener<TestData> {
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
log.info("HEAD : {}", headMap);
}
@Override
public void onException(Exception exception, AnalysisContext context) {
log.info("ERROR : {}", exception.getMessage());
String message = exception.getMessage();
if (exception instanceof ExcelDataConvertException) {
ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
message = String.format("解析异常:第%d行,第%d列,数据为:%s\n",
excelDataConvertException.getRowIndex() + 1,
excelDataConvertException.getColumnIndex() + 1,
excelDataConvertException.getCellData().toString());
log.info(message);
}
}
@Override
public void invoke(TestData data, AnalysisContext context) {
log.info("DATA : {}", JSON.toJSONString(data));
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("END ROW : {}", context.readRowHolder().getRowIndex() + 1);
}
}
TestData.java
@Data
public class TestData {
@ExcelProperty(value = {"head1"})
private String head1;
@ExcelProperty(value = {"head2"})
private String head2;
}
表格数据为: head1 | head2 头部名称1 | 头部名称2 示例1 | 示例2 数据11 | 数据12 数据21 | 数据22
情景:
1.此时设置的 headRowNumber
为 1,解析表格时会将head的名称行和示例行一起解析成数据。
且如果解析数据类型包括 Date
或者 Number
,因为head的描述内容是字符文本,此行就会解析错误。
Test.java
EasyExcel.read(fileName, TestData.class, new DataListener()).sheet().headRowNumber(1).doRead();
TestData.java
@ExcelProperty(value = {"head1"})
输出日志:
com.alibaba.easyexcel.test.demo.read.DataListener:20 - HEAD : {0=head1, 1=head2}
com.alibaba.easyexcel.test.demo.read.DataListener:39 - DATA : {"head1":"头部名称1","head2":"头部名称2"}
com.alibaba.easyexcel.test.demo.read.DataListener:39 - DATA : {"head1":"示例1","head2":"示例2"}
com.alibaba.easyexcel.test.demo.read.DataListener:39 - DATA : {"head1":"数据11","head2":"数据12"}
com.alibaba.easyexcel.test.demo.read.DataListener:39 - DATA : {"head1":"数据21","head2":"数据22"}
com.alibaba.easyexcel.test.demo.read.DataListener:44 - END ROW : 5
2.但如果将 headRowNumber
设置为 3,@ExcelProperty(value = {""})
的值就需要设置为示例行的数据,即 @ExcelProperty(value = {"示例1"})
,否则就会使解析的数据内容为空
Test.java
EasyExcel.read(fileName, TestData.class, new DataListener()).sheet().headRowNumber(3).doRead();
TestData.java
@ExcelProperty(value = {"head1"})
输出日志:
com.alibaba.easyexcel.test.demo.read.DataListener:20 - HEAD : {0=head1, 1=head2}
com.alibaba.easyexcel.test.demo.read.DataListener:20 - HEAD : {0=头部名称1, 1=头部名称2}
com.alibaba.easyexcel.test.demo.read.DataListener:20 - HEAD : {0=示例1, 1=示例2}
com.alibaba.easyexcel.test.demo.read.DataListener:39 - DATA : {}
com.alibaba.easyexcel.test.demo.read.DataListener:39 - DATA : {}
com.alibaba.easyexcel.test.demo.read.DataListener:44 - END ROW : 5
问题:
现在是否有设置方式,使得 @ExcelProperty(value = {""})
设置的值为第一行内容,且跳过 名称描述行 和 示例数据行?
或者是否有一个设置读取指定head行的方法,以及可以设置跳过若干指定行的方法。
备注:
如果使用 @ExcelProperty(index = )
可以避开这个问题,但就这样对模板要求更严格,无法自定义模板。