1. 官方网站
https://github.com/alibaba/easyexcel
2. pom引入xml相关依赖
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
3. 创建实体类
@Data
public class ExcelStudentData {
@ExcelProperty(value = "姓名", index = 0)
private String name;
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
@ExcelProperty("生日")
private Date birthday;
@NumberFormat("#.##%")//百分比表示,保留两位小数
@ExcelProperty("薪资")
private Double salary;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String password;
}
ExcelIgnore
这个字段不会读写
index
指定列
DateTimeFormat
日期格式化
NumberFormat
数字格式化
4. 最简单的写
@Test
public void simpleWrite07() {
String fileName = "d:/excel/01-simpleWrite-07.xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, ExcelStudentData.class).sheet("模板").doWrite(data());
}
@Test
public void simpleWrite03() {
String fileName = "d:/excel/01-simpleWrite-03.xls";
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, ExcelStudentData.class).excelType(ExcelTypeEnum.XLS).sheet("模板").doWrite(data());
}
private List<ExcelStudentData> data(){
List<ExcelStudentData> list = new ArrayList<>();
//算上标题,做多可写65536行
//超出:java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
for (int i = 0; i < 65535; i++) {
ExcelStudentData data = new ExcelStudentData();
data.setName("Helen" + i);
data.setBirthday(new Date());
data.setSalary(0.56);
data.setPassword("123"); //即使设置也不会被导出
list.add(data);
}
return list;
}
对XLS格式文件做操作时要指明excelType,excelType(ExcelTypeEnum.XLS)
excelType默认为 xlsx
扫描二维码关注公众号,回复: 13245306 查看本文章
5. 创建监听器
@Slf4j
public class ExcelStudentDataListener extends AnalysisEventListener<ExcelStudentData> {
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 5;
List<ExcelStudentData> list = new ArrayList<>();
/**
* 这个每一条数据解析都会来调用
*
* @param data
* one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(ExcelStudentData data, AnalysisContext context) {
log.info("解析到一条数据:{}", data);
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
log.info("存数据库");
// 存储完成清理 list
list.clear();
}
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("所有数据解析完成!");
}
}
easyExcel每读取一条数据就会走一遍 invoke()
为了防止内存溢出,设置临界值来清理内存