EasyExcel进行导入导出excel表

EasyExcel进行导入导出excel表

1、添加依赖

      <!-- EasyExcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>

2、编写实体类(即excel表数据格式)

@Data
public class UserData {
    @ExcelProperty("账号")
    private String account;
    @ExcelProperty("姓名")
    private String userName;
    @ExcelProperty("密码")
    private String password;
}

3、编写监听器

上传文件时,监听器会自动触发,调用相关方法进行数据的处理,如果需要对数据进行数据库的相关操作,可以引入 private UserService userService;业务,在saveData()方法进行操作

package com.example.poi.easyExcel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.poi.easyExcel.entity.UserData;
import com.example.poi.easyExcel.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

public class UserDataListener extends AnalysisEventListener<UserData> {
    private static final Logger LOGGER = LoggerFactory.getLogger(UserDataListener.class);

    private static final int BATCH_COUNT = 5;
    private boolean hasAccountRepeat = false;
    List<UserData> list = new ArrayList<UserData>(); // 待存储数据

    private UserService userService;

//    public UserDataListener() {
//        lsysUserService = new LsysUserServiceImpl();
//    }

    /** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来*/
    public UserDataListener(UserService userService) {
        this.userService = userService;
    }
    public boolean getHasAccountRepeat() {
        return this.hasAccountRepeat;
    }
    @Override
    public void invoke(UserData data, AnalysisContext analysisContext) {
//        LOGGER.info("解析到一条数据:{}", JSONUtils.toJSONString(data));
        System.out.println("解析到一条数据");
        System.out.println(data.toString());
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        LOGGER.info("所有数据解析完成!");
    }

    // 加入数据库操作
    private void saveData() {
        LOGGER.info("{}条数据,开始存储数据库!", list.size());
        System.out.println(list);
//        for (UserData user: list) {
//            // 查询该用户是否已注册
//            if (lsysUserService.selectUserByAccount(user.getAccount())==null){
//                LsysUser lsysUser = new LsysUser();
//                lsysUser.setAccount(user.getAccount());
//                lsysUser.setUsername(user.getUserName());
//                String pwdmd5 = SerialUtil.encoderByMd5(user.getPassword()); // 密码加密
//                lsysUser.setMd5password(pwdmd5);
//                lsysUserService.addOne(lsysUser);
//                LOGGER.info("存储数据库成功!");
//            } else {
//                hasAccountRepeat = true;
//                LOGGER.info("存储数据库失败!");
//            }
//        }
    }
}

4、excle表上传下载业务层

package com.example.poi.easyExcel.service;


import com.alibaba.excel.EasyExcel;
import com.example.poi.easyExcel.entity.UserData;
import com.example.poi.easyExcel.listener.UserDataListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;


@Service
public class EasyExcelServiceImpl implements EasyExcelService{
    @Autowired
    private UserService userService;

    @Override
    public void downloadUserTemplete(HttpServletResponse response) {
        try {
            // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("UTF-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("用户注册表模板","UTF-8");
            // 设置以下载方式打开文件
            response.addHeader("Content-Disposition","attachment;filename*=''" + fileName +".xlsx");
            List<UserData> list = new ArrayList<>();
            UserData data = new UserData();
            data.setAccount("zhangsan");
            data.setUserName("张三");
            data.setPassword("123456");
            list.add(data);
            // 改用传递
            simpleWrite(response.getOutputStream(),fileName, UserData.class,list);

        } catch (IOException e) {
            System.out.println(e);
        }
    }

    @Override
    public String uploadUserExcle(MultipartFile file) {
        try {
            UserDataListener userDataListener = new UserDataListener(userService);
            EasyExcel.read(file.getInputStream(), UserData.class, userDataListener)
                    .sheet().doRead();
            String msg = userDataListener.getHasAccountRepeat()?"部分添加完成,有重复账号,重复账号将不会被添加":"全部添加成功";
            return msg;
        } catch (IOException e) {
            System.out.println(e);
            return "失败";
        }
    }

    // 写
    public static void simpleWrite(OutputStream outputStream,String sheetName, Class<?> clazz, List<?> list) {
        // 写法1
        // String fileName =  "E:\\test2.xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(outputStream, clazz).sheet(sheetName).doWrite(list);
    }
    // 流方式写
    public void simpleWrite(String pathFileName, Class<?> clazz, List<?> list) {
        // 写法1
        // String fileName =  "E:\\test2.xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(pathFileName, clazz).sheet("模板").doWrite(list);
    }

}

6、控制层

package com.example.poi.easyExcel.controller;


import com.example.poi.easyExcel.service.EasyExcelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/easyExcel")
public class EasyExcelController {

    @Autowired
    private EasyExcelService easyExcelService;

    // 下载用户表模板
    @GetMapping("/download")
    public void downloadUserTemplete(HttpServletResponse response) {
        easyExcelService.downloadUserTemplete(response);
    }

    @PostMapping("/upload")
    public String  uploadUsernExcle(MultipartFile file) {
        System.out.println(file);
        if (file==null) {
            return null;
        }
        return easyExcelService.uploadUserExcle(file);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值