EasyExcel的实现记录

需求

Excel样例.png

Excel文件数据导入,即将表格中的数据存储到数据库中 ,我这里使用了阿里的 easyExcel 实现整个过程,使用Maven工具

思路

1.文件上传,将Excel表格上传
2.读取Excel数据
3.数据存入数据库中

操作

1.导入依赖



    com.alibaba
    easyexcel
    2.2.6

2.配置文件大小

spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=1MB

3.前端




    
    
    上传
    

    
    
    
    
    
    


上传表格

选取文件 上传文件
只能上传Excel文件


4.后端

  • 创建实体对象指定列下标号(也可以使用列名) 这里使用lombok简化
@Data
public class User{
    /*
     * 0 代表当前excel中的第一列,下面依次对应
     */
    @ExcelProperty(index = 0)
    private String username;
    @ExcelProperty(index = 1)
    private String password;
    @ExcelProperty(index = 2)
    private String dept;
}
  • UserMapper.xml




    
    
        insert into user(username, password, dept, upTime)
        values
        
            (
            #{user.username}, #{user.password},#{user.dept}, #{user.upTime}
            )
        
    

    
    
        delete from user where username in
        (
          
              #{username}
          
        )
    

  • 创建数据持久化层
@Mapper
@Repository
public interface UserDao {
  Integer insertList(List users);
}
  • 创建监听器
public class UserDataListener extends AnalysisEventListener {

    @Autowired
    UserDao userDao;
    /*
     * 创建一个List用来存放数据
     */
    List userList = new ArrayList<>();

    private UserDao UserDao;
    private String upTime;


    public UserDataListener(UserDao userDao, String upTime) {
        this.userDao = userDao;
        this.upTime = upTime;
    }

    /**
     * 每一条数据的解析都会调用
     * @param user
     * @param context
     */
    @Override
    public void invoke(User user, AnalysisContext context) {
        user.setUpTime(upTime);
        UserList.add(user);
        /**
         * 数据量超过一定量后存储数据库,防止过多数据在内存,容易OOM  
         */
        if (userList.size()>= 300) {
            saveData();
            userList.clear();
        }
        saveData();
    }

    /**
     * 所有数据解析完成后会调用此方法
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
    }

    /*
     * 存储数据
     */
    private void saveData() {
        userDao.insertList(userList);
    }
}

  • 创建服务层
public interface IUserService {

    /*
     * 上传接口
     */
    void doUpload(String upTime, MultipartFile file) throw IOException; 
}
@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    UserDao userDao;

    public void doUpload(String upTime, MultipartFile file) throw IOException {
        User user = new User();
        user.setUpTime(upTime);
        /*
         * headRowNumber 等于1 表示从excel第二行开始读取数据(标题忽略)
         */
        EasyExcel.read(file.getInputStream(), User.class, new UserDataListener(userDao, upTime)).sheet().headRowNumber(1).doRead();
    }
}
  • 创建控制器
@Controller
@RequestMapping(value = "/test")
public class TestController {

    @Autowired
    IUserService userService;

    // 去上传页面
    @GetMapping("toUpload")
    public String toUpload() {
        return "common/toUpload";
    }
    //上传
    @PostMapping("doUpload")
    @ResponseBody
    public String doUpload(@RequestParam String upTime, @RequestParam MultipartFile file) throws IOException {
        userService.doUpload(upTime, file);
        return "上传成功";
    }
}

不足

后端没有对文件进行相应的校验,如文件类型是否为xls 或 xlsx,是否是对应模板的数据......

你可能感兴趣的:(EasyExcel的实现记录)