当前位置:网站首页>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);
}
边栏推荐
猜你喜欢

The world's largest Apache open source foundation is how it works?

A number of embassies and consulates abroad have issued reminders about travel to China, personal and property safety

【Tensorflow】AttributeError: '_TfDeviceCaptureOp' object has no attribute '_set_device_from_string'

此次519暴跌的几点感触 2021-05-21

The future of financial services will never stop, and the bull market will continue 2021-05-28

RKMPP 在FFmpeg上实现硬编解码

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

玉溪卷烟厂通过正确选择时序数据库 轻松应对超万亿行数据

tinymce 如何实现动态国际化

RKMPP库快速上手--(一)RKMPP功能及使用详解
随机推荐
RowBounds[通俗易懂]
eclipse连接数据库后插入数据报错null
二极管及其应用
C# 编译错误:Compiler Error CS1044
web测试和app测试的区别?
机器学习——交叉验证法
栈 && 队列
打破文件锁限制,以存储力量助力企业增长新动力
The bad policy has no long-term impact on the market, and the bull market will continue 2021-05-19
Fabric.js 动态设置字号大小
SQL函数 $TSQL_NEWID
SQL函数 USER
乐心湖‘s Blog——MySQL入门到精通 —— 囊括 MySQL 入门 以及 SQL 语句优化 —— 索引原理 —— 性能分析 —— 存储引擎特点以及选择 —— 面试题
MySQL - ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)
劲爆!阿里巴巴面试参考指南(嵩山版)开源分享,程序员面试必刷
苏州大学:从 PostgreSQL 到 TDengine
为什么四个字节的float表示的范围比八个字节的long要广
如何解决1045无法登录mysql服务器
Mysql 基本操作指南之mysql查询语句
Kunpeng devkit & boostkit