通过 EasyPOI 进行快速的导入导出
- EasyPOI 是一个封装的工具类
简单的使用
- 导入EasyPOI依赖
<!--EasyPOI-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.0-beta2</version>
</dependency>
<!--测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!--JSON依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
- 给要导出的数据对应的实体类加注解(根据Excel表的字段边编写对应的实体类)
- ExcelProperty:指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。也可以不写,默认第一个字段就是index=0,以此类推。注意,要么全部不写,要么全部用index,要么全部用名字去匹配。
- ExcelIgnore:默认所有字段都会和excel去匹配,加了这个注解会忽略该字段。
- DateTimeFormat:日期转换,用String去接收excel日期格式的数据会调用这个注解。里面的value参照java.text.SimpleDateFormat。
- NumberFormat:数字转换,用String去接收excel数字格式的数据会调用这个注解。里面的value参照java.text.DecimalFormat。
- ExcelIgnoreUnannotated:默认不加ExcelProperty 的注解的都会参与读写,加了不会参与。
写数据
- 创建实体类
@Data
public class User {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String ignore;
}
- 数据导出
public class EasyExcelTest {
/**
* 这里我们使用模拟数据、真实中更具前端或数据库查询出真是的数据
*/
private List<User> usersData() {
List<User> list = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setString("字符串" + i);
user.setDate(new Date());
user.setDoubleData(0.56);
list.add(user);
}
return list;
}
/**
* 最简单的写、利用模拟的list数据进行数据导出
* <p>1. 创建excel对应的实体对象 参照{@link User}
* <p>2. 直接写即可
*/
@Test
public void simpleWrite() {
//指定文件的输出位置和文件名字
String fileName = "F://user.xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为:userdata 然后文件流会自动关闭
EasyExcel.write(fileName, User.class).sheet("userdata").doWrite(usersData());
}
}
读数据
- 配置一个监听器
/**
* 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
*/
public class UserDataListener extends AnalysisEventListener<User>{
private static final Logger LOGGER = LoggerFactory.getLogger(UserDataListener.class);
// 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
private static final int BATCH_COUNT = 5;
List<User> list = new ArrayList<User>();
/**
* 读取数据时会执行的方法
*
*/
@Override
public void invoke(User user, AnalysisContext analysisContext) {
// 把读到的数据打印到控制台
System.out.println(user);
list.add(user);
// 达到BATCH_COUNT(5条)了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
/**
* 在这里需要调用DAO层实现把数据存储到数据库中
*/
// 存储完成清理 list
list.clear();
}
}
/**
* 读取完成时执行的方法
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
/**
* 这里也要保存数据,确保最后遗留的数据也存储到数据库
*/
LOGGER.info("所有数据解析完成!");
}
}
- 数据写入
public class EasyExcelTest {
/**
* 最简单的读
* <p>1. 创建excel对应的实体对象 参照{@link User}
* <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UserDataListener}
* <p>3. 直接读即可
*/
@Test
public void simpleRead() {
// 有个很重要的点 UserDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
// 被读取的文件的路径
String fileName = "F://user.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(fileName, User.class , new UserDataListener()).sheet().doRead();
}
}
一些复杂的操作请参照文档:EasyExcel