EasyExcel进行导入导出excel表
1、添加依赖
<!-- EasyExcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
2、编写实体类(即excel表数据格式)
@Data
public class UserData {
@ExcelProperty("账号")
private String account;
@ExcelProperty("姓名")
private String userName;
@ExcelProperty("密码")
private String password;
}
3、编写监听器
上传文件时,监听器会自动触发,调用相关方法进行数据的处理,如果需要对数据进行数据库的相关操作,可以引入 private UserService userService;业务,在saveData()方法进行操作
package com.example.poi.easyExcel.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.poi.easyExcel.entity.UserData;
import com.example.poi.easyExcel.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class UserDataListener extends AnalysisEventListener<UserData> {
private static final Logger LOGGER = LoggerFactory.getLogger(UserDataListener.class);
private static final int BATCH_COUNT = 5;
private boolean hasAccountRepeat = false;
List<UserData> list = new ArrayList<UserData>(); // 待存储数据
private UserService userService;
// public UserDataListener() {
// lsysUserService = new LsysUserServiceImpl();
// }
/** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来*/
public UserDataListener(UserService userService) {
this.userService = userService;
}
public boolean getHasAccountRepeat() {
return this.hasAccountRepeat;
}
@Override
public void invoke(UserData data, AnalysisContext analysisContext) {
// LOGGER.info("解析到一条数据:{}", JSONUtils.toJSONString(data));
System.out.println("解析到一条数据");
System.out.println(data.toString());
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
list.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
LOGGER.info("所有数据解析完成!");
}
// 加入数据库操作
private void saveData() {
LOGGER.info("{}条数据,开始存储数据库!", list.size());
System.out.println(list);
// for (UserData user: list) {
// // 查询该用户是否已注册
// if (lsysUserService.selectUserByAccount(user.getAccount())==null){
// LsysUser lsysUser = new LsysUser();
// lsysUser.setAccount(user.getAccount());
// lsysUser.setUsername(user.getUserName());
// String pwdmd5 = SerialUtil.encoderByMd5(user.getPassword()); // 密码加密
// lsysUser.setMd5password(pwdmd5);
// lsysUserService.addOne(lsysUser);
// LOGGER.info("存储数据库成功!");
// } else {
// hasAccountRepeat = true;
// LOGGER.info("存储数据库失败!");
// }
// }
}
}
4、excle表上传下载业务层
package com.example.poi.easyExcel.service;
import com.alibaba.excel.EasyExcel;
import com.example.poi.easyExcel.entity.UserData;
import com.example.poi.easyExcel.listener.UserDataListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
@Service
public class EasyExcelServiceImpl implements EasyExcelService{
@Autowired
private UserService userService;
@Override
public void downloadUserTemplete(HttpServletResponse response) {
try {
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("UTF-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("用户注册表模板","UTF-8");
// 设置以下载方式打开文件
response.addHeader("Content-Disposition","attachment;filename*=''" + fileName +".xlsx");
List<UserData> list = new ArrayList<>();
UserData data = new UserData();
data.setAccount("zhangsan");
data.setUserName("张三");
data.setPassword("123456");
list.add(data);
// 改用传递
simpleWrite(response.getOutputStream(),fileName, UserData.class,list);
} catch (IOException e) {
System.out.println(e);
}
}
@Override
public String uploadUserExcle(MultipartFile file) {
try {
UserDataListener userDataListener = new UserDataListener(userService);
EasyExcel.read(file.getInputStream(), UserData.class, userDataListener)
.sheet().doRead();
String msg = userDataListener.getHasAccountRepeat()?"部分添加完成,有重复账号,重复账号将不会被添加":"全部添加成功";
return msg;
} catch (IOException e) {
System.out.println(e);
return "失败";
}
}
// 写
public static void simpleWrite(OutputStream outputStream,String sheetName, Class<?> clazz, List<?> list) {
// 写法1
// String fileName = "E:\\test2.xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(outputStream, clazz).sheet(sheetName).doWrite(list);
}
// 流方式写
public void simpleWrite(String pathFileName, Class<?> clazz, List<?> list) {
// 写法1
// String fileName = "E:\\test2.xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(pathFileName, clazz).sheet("模板").doWrite(list);
}
}
6、控制层
package com.example.poi.easyExcel.controller;
import com.example.poi.easyExcel.service.EasyExcelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/easyExcel")
public class EasyExcelController {
@Autowired
private EasyExcelService easyExcelService;
// 下载用户表模板
@GetMapping("/download")
public void downloadUserTemplete(HttpServletResponse response) {
easyExcelService.downloadUserTemplete(response);
}
@PostMapping("/upload")
public String uploadUsernExcle(MultipartFile file) {
System.out.println(file);
if (file==null) {
return null;
}
return easyExcelService.uploadUserExcle(file);
}
}