excel学习库

excel表格_excel函数公式大全_execl从入门到精通

Springboot上传导入EXCEL并批量保存数据

一、xml

<!-- 批量插入数据-->
<insert id="saveList">
insert into user(name,age) values
<foreach item="item" index="index" collection="list" separator=",">
(#{item.name},#{item.age})
</foreach>
</insert>

二、DAO

// 批量增加保存
public int saveList(List<User> list);

三、Services

// 批量增加保存
public int saveList(List<User> list) {
return userMapper.saveList(list);
}

四、前端页面

<form th:action="@{/user/uploadExcel}" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="上传文件">
</form>

五、Controller

@PostMapping("/uploadExcel")
public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), User.class, new ExcelListener(userService)).sheet().doRead();
return "redirect:/user/list";
}

六、Listener

package pers.gl.service;

import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import pers.gl.entity.User;

public class ExcelListener extends AnalysisEventListener<User> {
private static final Logger logger = LoggerFactory.getLogger(User.class);

/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 5;
List<User> list = new ArrayList<>();

private UserService userService;

// 构造函数,一定要写,添加到监听中
public ExcelListener(UserService userService) {
this.userService = userService;
}

@Override
public void invoke(User data, AnalysisContext context) {
// TODO Auto-generated method stub
logger.info("invoke方法被调用");
logger.info("解析到一条数据:{}", JSON.toJSONString(data));
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
list.clear();
}
}

/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// TODO Auto-generated method stub
System.out.println("doAfterAllAnalysed方法 被调用");
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
logger.info("所有数据解析完成!");
}

/**
* 加上存储数据库
*/
private void saveData() {
logger.info("{}条数据,开始存储数据库!", list.size());
userService.saveList(list);
logger.info("存储数据库成功!");
}

}

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
      友情链接