<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
package com.baimi.code;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author chencl
* @date 2022/4/27
* @desc:
*/
public class NoModleDataListener extends AnalysisEventListener<Map<Integer, String>> {
List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
@Override
public void invoke(Map<Integer, String> data, AnalysisContext analysisContext) {
System.out.println(JSON.toJSONString(data));
list.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 5;
List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
@Override
public void invoke(Map<Integer, String> 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("存储数据库成功!");
}
package com.baimi.code;
import com.alibaba.excel.EasyExcel;
/**
* @author chencl
* @date 2022/4/15
* @desc:
*/
public class TestMain {
public static void main(String args[]) throws Exception {
String fileName = "D:\\data\\核销明细汇总-20220426.xlsx";
// 这里 只要,然后读取第一个sheet 同步读取会自动finish
EasyExcel.read(fileName, new NoModleDataListener()).sheet().doRead();
}
}
public class ExceListener extends AnalysisEventListener<UserData> { ? ? /** ? ? ?* 进行读的操作具体执行方法,一行一行的读取数据 ? ? ?* 从第二行开始读取,不读取表头 ? ? ?* ? ? ?* @param userData ? ? ?* @param analysisContext ? ? ?*/ ? ? @Override ? ? public void invoke(UserData userData, AnalysisContext analysisContext) { ? ? ? ? System.out.println(userData); ? ? }
? ? /** ? ? ?* 读取表头信息 ? ? ?* ? ? ?* @param headMap ? ? ?* @param context ? ? ?*/ ? ? @Override ? ? public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { ? ? ? ? super.invokeHeadMap(headMap, context); ? ? ? ? System.out.println("表头信息:" + headMap); ? ? }
? ? /** ? ? ?* 读取完数据的操作 ? ? ?* ? ? ?* @param analysisContext ? ? ?*/ ? ? @Override ? ? public void doAfterAllAnalysed(AnalysisContext analysisContext) { ? ? } }
/**
* 多行头
*
* <p>1. 创建excel对应的实体对象 参照{@link DemoData}
* <p>2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
* <p>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
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()
// 这里可以设置1,因为头就是一行。如果多行头,可以设置其他值。不传入也可以,因为默认会根据DemoData 来解析,他没有指定头,也就是默认1行
.headRowNumber(1).doRead();
}
Java EasyExcel写入Excel数据指定写入数据实体中列(忽略或包含)的方法-CJavaPy
|