一、EasyExcel是较轻量级的Excel操作框架,由阿里开源的项目。
项目地址:https://github.com/alibaba/easyexcel
引入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
二、EasyExcel的简单读写操作,工具类如下:
package XX.XX.XX.XX.utils;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSONObject;
import com.southfund.risk.test.model.Student;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
/**
* @Author xiarg
* @CreateTime 2022/10/28 15:12
*/
public class ExcelUtil<T> {
private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
public List<T> readExcel(T t,String filePath){
List<T> returnList = new ArrayList<>();
// 匿名内部类 不用额外写一个DemoDataListener
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(filePath, t.getClass(), new ReadListener<T>() {
/**
* 单次缓存的数据量
*/
public static final int BATCH_COUNT = 100;
/**
*临时存储
*/
private List<T> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
@Override
public void invoke(T t, AnalysisContext context) {
cachedDataList.add(t);
returnList.add(t);
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
/**
* 执行到最后如果数据不满 BATCH_COUNT
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveData();
}
/**
* 加上存储数据库
*/
private void saveData() {
logger.info("{}条数据,开始存储数据库!", cachedDataList.size());
logger.info("存储数据库成功!");
}
}).sheet().doRead();
return returnList;
}
public void writerExcel(T t,String filePath,String sheetName,List<T> dataList){
// 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(filePath, t.getClass())
.sheet(sheetName)
.doWrite(dataList);
}
}
读取数据可以有两种选择,1、根据泛型T的不同,分批次的saveData保存数据。2、保存在returnList中,并且进行返回,但是如果数据量大,容易OOM。
写入数据就很简单,把dataList中的数据写入Excel,也可以循环调用写入方法,而不是一次全部写入。
三、页面的上传和下载
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
return "success";
}
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
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");
EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
}
上传:UploadData 是上传数据的实体类,UploadDataListener 是监听器(实现 ReadListener<T>,里面可以确认读多少数据写一次数据,还是做点其他的什么),uploadDAO 是操作数据库的Dao。
下载:DownloadData 是写入数据实体类,data() 是写入的数据。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89032.html