Easy Excel导入导出
1 . 导入(读)
- 首先要导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>版本号</version>
</dependency>
- 创建实体类
在属性上用@ExcelPriPerty修饰
@ExcelProperty(value = "姓名")
private String name;
读取数据(普通Java项目)
//自定义监听器
public class DemoDataListener implements ReadListener<DemoData> {
//每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
private static final int BATCH_COUNT = 100;
//用于存放缓存的数据
private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
//假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。
private DemoDAO demoDAO;
public DemoDataListener() {
//这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
demoDAO = new DemoDAO();
}
//如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的
public DemoDataListener(DemoDAO demoDAO) {
this.demoDAO = demoDAO;
}
// 这个每一条数据解析都会来调用
@Override
public void invoke(DemoData data, AnalysisContext context) {
cachedDataList.add(data);
// 达到BATCH_COUNT(100)了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
// 所有数据解析完,会调用这个方法来保存未达到100的数据
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
}
//最后存储到数据库
private void saveData() {
demoDAO.save(cachedDataList);
}
}
读取数据(Web项目)
/**
* 文件上传
*/
@PostMapping("upload")
@ResponseBody
/**
*MultipartFile file 是 Spring 提供的类,表示从前端上传过来的文件
*file.getInputStream() 获取上传文件的输入流,即 Excel 文件内容
*UploadData.class 数据模型类,用于映射 Excel 中每一行的数据
*UploadDataListener(uploadDAO) 监听器,每读取一定数量的数据后会回调这个监听器,也可以自定义监听器
*sheet() 表示要读取 Excel 中的工作表,默认读取第一个 sheet。
*doRead() 表示开始实际执行读取操作。
*/
public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
return "success";
}
2 . 导出(写)
以上实体类等已经讲解,下面不在叙述
写入数据(普通Java项目)
- 存储数据
private List<DemoData> data() {
//ListUtils 是 Apache Commons Collections 提供的一个工具类。
//newArrayList() 方法用于创建一个新的、空的 ArrayList 实例。
List<DemoData> list = ListUtils.newArrayList();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setString("字符串" + i);
data.setDate(new Date());
data.setDoubleData(0.56);
list.add(data);
}
return list;
}
- 导出数据
@Test
public void simpleWrite() {
// 写法1
/**
*设置文件名
*TestFileUtil.getPath():获取一个测试用的路径,比如:/Users/xxx/easy-excel-test/"simpleWrite":固定前缀名
*System.currentTimeMillis():当前时间戳,用于避免文件重名
*.xlsx:表示生成的是 Excel 2007 及以上格式(即 OOXML 格式)
**/
String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
/** 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
*DemoData:将 Excel 中的每一行数据映射成 DemoData 对象
*/
EasyExcel.write(fileName, DemoData.class)
.sheet("模板")
.doWrite(() -> {
// 查询的数据,data() 方法返回一个实现了 Iterable 接口的对象,比如 List<DemoData>,其中包含了要写入Excel的数据
return data();
});
// 写法2
fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
// 写法3
fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet);
}
}
写入数据(Web项目)
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
//设置 MIME 类型,告诉浏览器返回的是一个 Excel 文件(.xlsx 格式)
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//设置字符编码,告诉浏览器返回的内容使用的是 UTF-8 编码
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
/**
*fileName 参数指定了要写入的Excel文件的路径和名称
*DemoData.class 参数则指定了将被映射到Excel行的数据模型类
*sheet("模板"): 该方法指定了生成的Excel文件中的工作表(sheet)名称为"模板"
*.doWrite(data())写入的数据
*/
EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
}
1005

被折叠的 条评论
为什么被折叠?



