SpringBoot项目使用EasyExcel读取上传Excel
1、EasyExcel简介
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
EasyExcel读取Excel的解析原理:
2、导入相应的依赖文件
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.3</version>
</dependency>
3、编写对应数据库字段的pojo类,使用注解注入
package com.ec.wlfxxt.db.po;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;import javax.persistence.Id;
import javax.persistence.Table;@Table(name = "t_test_user")
@Data
public class TestUser {//主键/*** ExcelProperty注解 index参数是指第几列,0为第一列,1为第二列 ,value是对应的内容列*/@ExcelProperty(index = 0)@Idprivate String userSid;@ExcelProperty(index = 1)private String userAccount;@ExcelProperty(index = 2)
// @ExcelProperty(value = "用户姓名")private String userName;@ExcelProperty(index = 3)private Integer userSexSid;}
4、编写对应下载的接口文件
(这里为固定的模版,不需要可以的去记录,大概了解执行流程即可,取即可用)
UserController层
@PostMapping("/uploadLocal") //本地测试 @RequestParam("files")参数key名字public JsonResult uploadLocal(@RequestParam("files") MultipartFile[] excelFiles) throws IOException {// System.out.println("excelFile:"+excelFiles);if (excelFiles.length != 0) {if (userService.testExcelLocal( excelFiles) == 0){return new JsonResult(Constant.SUCCESS_CODE, "上传成功",null);}else {return new JsonResult(Constant.ERROR1_CODE, "文件保存失败",null);}}else {return new JsonResult(Constant.ERROR1_CODE, "文件不能为空",null);}}@PostMapping("/uploadServer")//服务器测试 @RequestParam("files")参数key名字public JsonResult uploadServer(@RequestParam("files") MultipartFile[] excelFiles) throws IOException {// System.out.println("excelFile:"+excelFiles);if (excelFiles.length != 0) {if (userService.testExcelServer( excelFiles) == 0){return new JsonResult(Constant.SUCCESS_CODE, "上传成功",null);}else {return new JsonResult(Constant.ERROR1_CODE, "文件保存失败",null);}}else {return new JsonResult(Constant.ERROR1_CODE, "文件不能为空",null);}}
UserServiceImpl层
//将文件存储到后读取public int testExcelLocal(MultipartFile[] excelFiles){//将文件存储到当前机器的某个目录String localPath = "E:\\JavaProject\\wlfxxt\\src\\main\\java\\com\\ec\\wlfxxt\\excelfile";for (MultipartFile excelFile:excelFiles) {//获取上传的文件的文件名 (ordersetting_template.xlsx)String originalFilename = excelFile.getOriginalFilename();String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//生成一个唯一文件名String uniqueFilename = UUID.randomUUID().toString().replaceAll("-", "") + suffix;String dirPath = localPath ;//确保存放文件的目录是存在的File dirFile = new File(dirPath);if (!dirFile.exists()){dirFile.mkdirs();}//最终存放文件的文件路径String filePath = dirPath + "\\" + uniqueFilename;System.out.println(filePath);//保存文件try {excelFile.transferTo(new File(filePath));} catch (IOException e) {e.printStackTrace();return 1;}//读取上传后的文件中的内容,将数据添加/更新到ordersetting表中/*参数一File file: 要读取的目标文件参数二Class head :将目标文件中的行记录封装到java的那个类型对象参数三ReadListener readListener :读取过程中的回调对象(每读取一行,封装成一个对象后,都会触发这个对象的invoke方法)*/List<TestUser> testUsers = new ArrayList<>();EasyExcel.read(new File(filePath),TestUser.class,new SyncReadListener(){//读取每一行进行的操作@Overridepublic void invoke(Object object, AnalysisContext context) {testUsers.add((TestUser) object);}//读取表头@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头信息:"+headMap);}}).headRowNumber(3).doReadAll();//.headRowNumber(3)表示从第几行开始读取,有的文件title不在第一行System.out.println("===========");System.out.println(testUsers);
// //更新或者添加
// for (TestUser orderSetting : orderSettings) {
// userMapper.insert(orderSetting);
// }}return 0;}//将文件存储到后读取public int testExcelServer(MultipartFile[] excelFiles){//将文件存储到服务器的某个目录String localPath = "/usr/local/middleware/GIT_NTP_WLFXXT_Code_Mid/excleFile";for (MultipartFile excelFile:excelFiles) {//获取上传的文件的文件名 (ordersetting_template.xlsx)String originalFilename = excelFile.getOriginalFilename();String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//生成一个唯一文件名String uniqueFilename = UUID.randomUUID().toString().replaceAll("-", "") + suffix;String dirPath = localPath;//确保存放文件的目录是存在的File dirFile = new File(dirPath);if (!dirFile.exists()){dirFile.mkdirs();}//最终存放文件的文件路径String filePath = dirPath + "/" + uniqueFilename;System.out.println(filePath);//保存文件try {excelFile.transferTo(new File(filePath));} catch (IOException e) {e.printStackTrace();return 1;}//读取上传后的文件中的内容,将数据添加/更新到ordersetting表中/*参数一File file: 要读取的目标文件参数二Class head :将目标文件中的行记录封装到java的那个类型对象参数三ReadListener readListener :读取过程中的回调对象(每读取一行,封装成一个对象后,都会触发这个对象的invoke方法)*/List<TestUser> testUsers = new ArrayList<>();EasyExcel.read(new File(filePath),TestUser.class,new SyncReadListener(){//读取每一行进行的操作@Overridepublic void invoke(Object object, AnalysisContext context) {testUsers.add((TestUser) object);}//读取表头@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头信息:"+headMap);}}).headRowNumber(3).doReadAll();//.headRowNumber(3)表示从第几行开始读取,有的文件title不在第一行System.out.println("===========");System.out.println(testUsers);
// //更新或者添加
// for (TestUser orderSetting : orderSettings) {
// userMapper.insert(orderSetting);
// }}return 0;}
5、postman测试接口
单个和多个文件都可
key 的名字要和controller代码RequestParam里面的一致
public JsonResult uploadLocal(@RequestParam(“files”) MultipartFile[] excelFiles) throws IOException {
}
}return 0;
}
## 5、postman测试接口**单个和多个文件都可** key 的名字要和controller代码RequestParam里面的一致public JsonResult uploadLocal(**@RequestParam("files")** MultipartFile[] excelFiles) throws IOException {![image-20230315202239481](https://img-blog.csdnimg.cn/img_convert/bc111231dc8f7208ddaf965117b58167.png)