();
-
- @Override
- public void invoke(DemoData data, AnalysisContext context) {
- LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
- list.add(data);
- if (list.size() >= BATCH_COUNT) {
- saveData();
- list.clear();
- }
- }
-
- @Override
- public void doAfterAllAnalysed(AnalysisContext context) {
- saveData();
- LOGGER.info("所有数据解析完成!");
- }
-
- /**
- * 加上存储数据库
- */
- private void saveData() {
- LOGGER.info("{}条数据,开始存储数据库!", list.size());
- LOGGER.info("存储数据库成功!");
- }
-}
-```
-##### 代码
-```java
- /**
- * 最简单的读
- * 1. 创建excel对应的实体对象 参照{@link DemoData}
- *
2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
- *
3. 直接读即可
- */
- @Test
- public void simpleRead() {
- // 写法1:
- String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
- // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
- EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
-
- // 写法2:
- fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
- ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();
- ReadSheet readSheet = EasyExcel.readSheet(0).build();
- excelReader.read(readSheet);
- // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
- excelReader.finish();
- }
-```
-
-### 指定列的下标或者列名
-##### excel示例
-参照:[excel示例](#simpleReadExcel)
-##### 对象
-```java
-@Data
-public class IndexOrNameData {
- /**
- * 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配
- */
- @ExcelProperty(index = 2)
- private Double doubleData;
- /**
- * 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
- */
- @ExcelProperty("字符串标题")
- private String string;
- @ExcelProperty("日期标题")
- private Date date;
-}
-```
-##### 监听器
-参照:[监听器](#simpleReadListener) 只是泛型变了而已
-##### 代码
-```java
- /**
- * 指定列的下标或者列名
- *
- *
1. 创建excel对应的实体对象,并使用{@link ExcelProperty}注解. 参照{@link IndexOrNameData}
- *
2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link IndexOrNameDataListener}
- *
3. 直接读即可
- */
- @Test
- public void indexOrNameRead() {
- String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
- // 这里默认读取第一个sheet
- EasyExcel.read(fileName, IndexOrNameData.class, new IndexOrNameDataListener()).sheet().doRead();
- }
-```
-
-### 读多个sheet
-##### excel示例
-参照:[excel示例](#simpleReadExcel)
-##### 对象
-参照:[对象](#simpleReadObject)
-##### 监听器
-参照:[监听器](#simpleReadListener)
-##### 代码
-```java
- /**
- * 读多个sheet,这里注意一个sheet不能读取多次,多次读取需要重新读取文件
- *
- * 1. 创建excel对应的实体对象 参照{@link DemoData}
- *
- * 2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
- *
- * 3. 直接读即可
- */
- @Test
- public void repeatedRead() {
- // 方法1 如果 sheet1 sheet2 都是同一数据 监听器和头 都写到最外层
- String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
- ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();
- ReadSheet readSheet1 = EasyExcel.readSheet(0).build();
- ReadSheet readSheet2 = EasyExcel.readSheet(1).build();
- excelReader.read(readSheet1);
- excelReader.read(readSheet2);
- // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
- excelReader.finish();
-
- // 方法2 如果 sheet1 sheet2 数据不一致的话
- fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
- excelReader = EasyExcel.read(fileName).build();
- // 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
- readSheet1 = EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
- readSheet2 = EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
- excelReader.read(readSheet1);
- excelReader.read(readSheet2);
- // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
- excelReader.finish();
- }
-```
-
-### 日期、数字或者自定义格式转换
-##### excel示例
-参照:[excel示例](#simpleReadExcel)
-##### 对象
-```java
-@Data
-public class ConverterData {
- /**
- * 我自定义 转换器,不管数据库传过来什么 。我给他加上“自定义:”
- */
- @ExcelProperty(converter = CustomStringStringConverter.class)
- private String string;
- /**
- * 这里用string 去接日期才能格式化。我想接收年月日格式
- */
- @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
- private String date;
- /**
- * 我想接收百分比的数字
- */
- @NumberFormat("#.##%")
- private String doubleData;
-}
-```
-##### 监听器
-参照:[监听器](#simpleReadListener) 只是泛型变了
-##### 自定义转换器
-````java
-public class CustomStringStringConverter implements Converter {
- @Override
- public Class supportJavaTypeKey() {
- return String.class;
- }
-
- @Override
- public CellDataTypeEnum supportExcelTypeKey() {
- return CellDataTypeEnum.STRING;
- }
-
- /**
- * 这里读的时候会调用
- *
- * @param cellData
- * NotNull
- * @param contentProperty
- * Nullable
- * @param globalConfiguration
- * NotNull
- * @return
- */
- @Override
- public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
- GlobalConfiguration globalConfiguration) {
- return "自定义:" + cellData.getStringValue();
- }
-
- /**
- * 这里是写的时候会调用 不用管
- *
- * @param value
- * NotNull
- * @param contentProperty
- * Nullable
- * @param globalConfiguration
- * NotNull
- * @return
- */
- @Override
- public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
- GlobalConfiguration globalConfiguration) {
- return new CellData(value);
- }
-
-}
-````
-##### 代码
-```java
- /**
- * 日期、数字或者自定义格式转换
- *
- * 默认读的转换器{@link DefaultConverterLoader#loadDefaultReadConverter()}
- *
1. 创建excel对应的实体对象 参照{@link ConverterData}.里面可以使用注解{@link DateTimeFormat}、{@link NumberFormat}或者自定义注解
- *
2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link ConverterDataListener}
- *
3. 直接读即可
- */
- @Test
- public void converterRead() {
- String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
- // 这里 需要指定读用哪个class去读,然后读取第一个sheet 然后千万别忘记 finish
- EasyExcel.read(fileName, ConverterData.class, new ConverterDataListener())
- // 这里注意 我们也可以registerConverter来指定自定义转换器, 但是这个转换变成全局了, 所有java为string,excel为string的都会用这个转换器。
- // 如果就想单个字段使用请使用@ExcelProperty 指定converter
- // .registerConverter(new CustomStringStringConverter())
- // 读取sheet
- .sheet().doRead();
- }
-```
-
-### 多行头
-##### excel示例
-参照:[excel示例](#simpleReadExcel)
-##### 对象
-参照:[对象](#simpleReadObject)
-##### 监听器
-参照:[监听器](#simpleReadListener)
-##### 代码
-```java
- /**
- * 多行头
- *
- *
1. 创建excel对应的实体对象 参照{@link DemoData}
- *
2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
- *
3. 设置headRowNumber参数,然后读。 这里要注意headRowNumber如果不指定, 会根据你传入的class的{@link ExcelProperty#value()}里面的表头的数量来决定行数,
- * 如果不传入class则默认为1.当然你指定了headRowNumber不管是否传入class都是以你传入的为准。
- */
- @Test
- public void complexHeaderRead() {
- String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
- // 这里 需要指定读用哪个class去读,然后读取第一个sheet 然后千万别忘记 finish
- EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()
- // 这里可以设置1,因为头就是一行。如果多行头,可以设置其他值。不传入也可以,因为默认会根据DemoData 来解析,他没有指定头,也就是默认1行
- .headRowNumber(1).doRead();
- }
-```
-
-### 同步的返回
-##### excel示例
-参照:[excel示例](#simpleReadExcel)
-##### 对象
-参照:[对象](#simpleReadObject)
-##### 代码
-```java
- /**
- * 同步的返回,不推荐使用,如果数据量大会把数据放到内存里面
- */
- @Test
- public void synchronousRead() {
- String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
- // 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finish
- List