当前位置:网站首页>EasyExcel 的使用
EasyExcel 的使用
2022-08-02 14:01:00 【昊天h1】
一,导入到数据库
1.导入依赖
<!--easyexcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
2.准备要上传文件所对应的实体类
@TableName(value ="account")
@Data
public class Account implements Serializable {
@ExcelIgnore
@TableId(type = IdType.AUTO)
private Integer accid;
@ExcelProperty("账户名称")
private String accname;
@ExcelProperty("账户密码")
private String accpass;
@ExcelProperty("状态")
private String accstate;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
3.上传
/** * 文件上传 * <p>1. 创建excel对应的实体对象 参照{@link Account} * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link AccountDataListener} * <p>3. 直接读即可 */
@PostMapping("/upload")
@ResponseBody
public R upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), AccountImportData.class, new AccountDataListener(accountService)).sheet().doRead();
return new R(200,"导入成功",null);
}
4.创建监听器(把服务层或者持久层对象传进去)
// 有个很重要的点 AccountDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class AccountDataListener implements ReadListener<AccountImportData> {
/** * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 */
private static final int BATCH_COUNT = 100;
/** * 缓存的数据 */
private List<Account> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
/** * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。 */
private AccountService accountService;
public AccountDataListener() {
}
/** * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来 * * @param accountService */
public AccountDataListener(AccountService accountService) {
this.accountService = accountService;
}
/** * 这个每一条数据解析都会来调用 * * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()} * @param context */
@Override
public void invoke(AccountImportData data, AnalysisContext context) {
log.info("解析到一条数据:{}", data);
Account account = new Account();
account.setAccstate("0");
BeanUtil.copyProperties(data,account);
cachedDataList.add(account);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
/** * 所有数据解析完成了 都会来调用 * * @param context */
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
log.info("所有数据解析完成!");
}
/** * 加上存储数据库 */
private void saveData() {
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
accountService.saveBatch(cachedDataList);
log.info("存储数据库成功!");
}
}
二,导出到本地
1. 直接实现接口
/** * 文件下载(失败了会返回一个有部分数据的Excel) * <p> * 1. 创建excel对应的实体对象 参照{@link Account} * <p> * 2. 设置返回的 参数 * <p> * 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大 */
@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");
List<Account> list = accountService.queryList();
EasyExcel.write(response.getOutputStream(), Account.class).sheet("模板").doWrite(list);
}
边栏推荐
- Interviewer: Can you talk about optimistic locking and pessimistic locking?
- 社区收藏缓存设计重构实战
- Mysql's case the when you how to use
- 软件测试和硬件测试的区别及概念
- Large and comprehensive pom file example
- 网络安全第一次作业
- 乐心湖‘s Blog——MySQL入门到精通 —— 囊括 MySQL 入门 以及 SQL 语句优化 —— 索引原理 —— 性能分析 —— 存储引擎特点以及选择 —— 面试题
- mysql的case when如何用
- WiFi Association & Omnipeek Packet Capture Analysis
- 关于Google词向量模型(googlenews-vectors-negative300.bin)的导入问题
猜你喜欢

eclipse连接数据库后插入数据报错null

如何选择正规的期货交易平台开户?

shell脚本“画画”

Sentinel源码(六)ParamFlowSlot热点参数限流

劲爆!阿里巴巴面试参考指南(嵩山版)开源分享,程序员面试必刷

二极管及其应用

拯救流浪猫 | 「喵先锋」系列数字版权盲盒明日开抢

You can't accept 60% slump, there is no eligible for gain of 6000% in 2021-05-27

基于深度学习的图像检索方法!

The world's largest Apache open source foundation is how it works?
随机推荐
线代:已知一个特征向量快速求另外两个与之正交的特征向量
腾讯安全游戏行业研讨会:生态共建,护航游戏产业健康发展
拯救流浪猫 | 「喵先锋」系列数字版权盲盒明日开抢
WiFi Association&Omnipeek抓包分析
WiFi Association & Omnipeek Packet Capture Analysis
Some impressions of the 519 plummet 2021-05-21
苏州大学:从 PostgreSQL 到 TDengine
AWVS工具介绍[通俗易懂]
stack && queue
VMM是什么?_兮是什么意思
二分查找 && 树
ping命令的使用及代码_通过命令查看ping路径
RKMPP库快速上手--(一)RKMPP功能及使用详解
Mysql's case the when you how to use
为什么四个字节的float表示的范围比八个字节的long要广
网络安全第三次作业
栈 && 队列
电脑死机,Word忘了保存怎么办?怎么恢复?(编辑器是WPS)
目标检测场景SSD-Mobilenetv1-FPN
第二讲 软件生命周期