当前位置:网站首页>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);
}
边栏推荐
- 保姆级教程:写出自己的移动应用和小程序(篇三)
- wait() ,notify(),notifyAll()以及wait()与sleep()比较
- replay视频播放器_怎么让手机音乐跟视频一起放
- Detailed explanation of stored procedures
- 电脑死机,Word忘了保存怎么办?怎么恢复?(编辑器是WPS)
- Awesome!Alibaba interview reference guide (Songshan version) open source sharing, programmer interview must brush
- els 长条碰撞变形判断
- C language improvement (3)
- Selenium本地打开远程浏览器
- 线代:已知一个特征向量快速求另外两个与之正交的特征向量
猜你喜欢
动态刷新日志级别
世界上最大的开源基金会 Apache 是如何运作的?
Mysql's case the when you how to use
A number of embassies and consulates abroad have issued reminders about travel to China, personal and property safety
CVE-2020-27986(Sonarqube敏感信息泄漏) 漏洞修复
玉溪卷烟厂通过正确选择时序数据库 轻松应对超万亿行数据
Interview | with questions to learn, Apache DolphinScheduler Wang Fuzheng
不精确微分/不完全微分(Inexact differential/Imperfect differential)
Data Organization---Chapter 6 Diagram---Graph Traversal---Multiple Choice Questions
WeChat Mini Program-Recent Dynamic Scrolling Implementation
随机推荐
动态刷新日志级别
Detailed explanation of ORACLE expdp/impdp
Sentinel源码(六)ParamFlowSlot热点参数限流
Cloin 控制台乱码
Differences and concepts between software testing and hardware testing
MySQL - ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)
你真的懂单例模式么
2022-08-02日报:2022年7月最热的10篇AI论文
鲲鹏devkit & boostkit
GTK:Gdk-CRITICAL **: IA__gdk_draw_pixbuf: assertion ‘GDK_IS_DRAWABLE (drawable)’ failed
你接受不了60%的暴跌,就没有资格获得6000%的涨幅 2021-05-27
The world's largest Apache open source foundation is how it works?
线程安全问题及关键字synchronized,volatile
logback源码阅读(一)获取ILoggerFactory、Logger
不精确微分/不完全微分(Inexact differential/Imperfect differential)
ZABBIX配置邮件报警和微信报警
线代:已知一个特征向量快速求另外两个与之正交的特征向量
mysql的case when如何用
音频处理:浮点型数据流转PCM文件
Detailed explanation of stored procedures