EasyExcel快速入门-读Excel
easyexcel
快速、简洁、解决大文件内存溢出的java处理Excel工具
项目地址:https://gitcode.com/gh_mirrors/ea/easyexcel

·
文章目录
EasyExcel简介
官网:https://easyexcel.opensource.alibaba.com/
EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。
他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。
下面我们直接开始体验Easy Excel的用法
简单的读取
第一步,我们先准备一个Excel
第二步,创建一个与之对应得类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DemoData {
private String string;
private Date date;
private Double doubleData;
}
方式一:PageReadListener
这种方式可以直接读取,但是默认每次只读取100条数据,具体需要返回多少行数据可以在PageReadListener
的构造函数中设置。
@Slf4j
public class EasyExcelRead {
@Test
public void simpleReadDemo1() {
EasyExcel.read("一个测试表格_01.xlsx", DemoData.class, new PageReadListener<DemoData>(dataList -> {
for (DemoData demoData : dataList) {
log.info("读取到一条数据:{}", JSON.toJSONString(demoData));
}
})).sheet().doRead();
}
}
方式二:匿名内部类
@Test
public void simpleReadDemo2() {
EasyExcel.read("一个测试表格_01.xlsx", DemoData.class, new ReadListener<DemoData>() {
/**
* 单次缓存的数据量
*/
public static final int BATCH_COUNT = 2;
/**
*临时存储
*/
private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
@Override
public void invoke(DemoData data, AnalysisContext context) {
cachedDataList.add(data);
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveData();
}
private void saveData() {
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
log.info("存储数据库成功!");
}
}).sheet().doRead();
}
方式三:自定义ReadListener的实现类
此方式与匿名内部类一致,即将匿名内部类构造出来
首先我们先创建一个监听类,有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去。
@Slf4j
public class DemoDataListener implements ReadListener<DemoData> {
/**
* 单次缓存的数据量
*/
public static final int BATCH_COUNT = 2;
/**
*临时存储
*/
private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
@Override
public void invoke(DemoData data, AnalysisContext context) {
cachedDataList.add(data);
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveData();
}
private void saveData() {
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
log.info("存储数据库成功!");
}
}
方式四:ExcelReader
@Test
public void simpleReadDemo4() {
try (ExcelReader excelReader = EasyExcel.read(
"一个测试表格_01.xlsx", DemoData.class, new DemoDataListener()).build()) {
// 构建一个sheet 这里可以指定名字或者no
ReadSheet readSheet = EasyExcel.readSheet(0).build();
// 读取一个sheet
excelReader.read(readSheet);
}
}
指定列的下标会列名
我们可以通过注解@ExcelProperty
去指定匹配Excel中的第几列或列名。
ExcelProperty
名称 | 默认值 | 描述 |
---|---|---|
value | 空 | 用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头 |
order | Integer.MAX_VALUE | 优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序 |
index | -1 | 优先级高于value和order,会根据index直接指定到excel中具体的哪一列 |
converter | 自动选择 | 指定当前字段用什么转换器,默认会自动选择。读的情况下只要实现com.alibaba.excel.converters.Converter#convertToJavaData(com.alibaba.excel.converters.ReadConverterContext<?>) 方法即可 |
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DemoData {
@ExcelProperty(index = 2)
private Double doubleData;
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
}
读取表头数据
只需要在监听器中重写invokeHead
方法即可实现读取表头数据。
/**
* 这里会一行行的返回头
*
* @param headMap
* @param context
*/
@Override
public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
log.info("解析到一条头数据:{}", JSON.toJSONString(headMap));
}
此时会将单元格的详细信息全部打印出来,如果只想拿到表头的值,我们可以将其转换为Map<Integer,String>
。EasyExcel为我们提供了两种方式。
- 不要implements ReadListener 而是 extends AnalysisEventListener
- 调用 ConverterUtils.convertToStringMap(headMap, context) 自动会转换
@Override
public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
Map<Integer, String> stringHeadMap = ConverterUtils.convertToStringMap(headMap, context);
log.info("解析到一条头数据:{}", JSON.toJSONString(stringHeadMap));
}
运行结果:




快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:7 个月前 )
c42183df
Bugfix 7 个月前
efa7dff6 * 重新加回 `commons-io`
7 个月前
更多推荐
所有评论(0)