栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot整合EasyExcel进行报表导入导出

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot整合EasyExcel进行报表导入导出

引入

为什么使用EasyExcel?

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。

EasyExcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用EasyExcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

官网GitHub地址:

https://github.com/alibaba/easyexcel

官方文档地址:

https://www.yuque.com/easyexcel/doc/easyexcel

实例 创建初始数据
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
​
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROp TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NULL DEFAULT NULL,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `create_time` date NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
​
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 1, 'banq', '13588888888', '2021-11-19');
​
SET FOREIGN_KEY_CHECKS = 1;

创建SpringBoot项目

导入EasyExcel依赖


    com.alibaba
    easyexcel
    2.2.10

User

@Data
public class User {
    @ExcelIgnore  //生成报表时忽略
    private Long id;
​
    @ExcelProperty(value = "用户ID",index = 0)  // 定义表头名称和位置,0代表第一列
    private Long userId;
​
    @ExcelProperty(value = "用户名称",index = 1)
    private String username;
​
    @ExcelProperty(value = "电话号码",index = 2)
    private String phone;
​
    @ExcelProperty(value = "创建日期",index = 3)
    @DateTimeFormat("yyyy年MM月dd日")
    private Date createTime;
}

监听器

@Slf4j
public class UserDataListener extends AnalysisEventListener {
​
    private UserService userService;
​
    public UserDataListener(UserService userService) {
        this.userService = userService;
    }
​
    
    private static final int BATCH_COUNT = 5;
    List list = new ArrayList();
​
    @Override
    public void invoke(User data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSonString(data));
        list.add(data);
        if (list.size() >= BATCH_COUNT) {
            saveData();
            list.clear();
        }
    }
​
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData();
        log.info("所有数据解析完成!");
    }
​
    
    private void saveData() {
        log.info("{}条数据,开始存储数据库!", list.size());
        if (!CollectionUtils.isEmpty(list)) {
            userService.saveBatch(list);
        }
        log.info("存储数据库成功!");
    }
}

Dao层

@Mapper
@Repository
public interface UserMapper {
    void batchInsert(List list);
    List queryAll();
}

    insert into user (user_id,username,phone,create_time) values
    
        (#{user.userId},#{user.username},#{user.phone},#{user.createTime})
    

Service层

public interface UserService {
    void saveBatch(List list);
    List selectAll();
}


@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
​
    @Override
    public void saveBatch(List list) {
        userMapper.batchInsert(list);
    }
​
    @Override
    public List selectAll() {
        return userMapper.queryAll();
    }
}

Controller层

@RestController
public class OperateExcelController {
    @Autowired
    private UserService userService;

    
    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), User.class, new UserDataListener(userService)).sheet().doRead();
        return "success";
    }

    
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 设置上下文类型
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        // 设置编码
        response.setCharacterEncoding("utf-8");
        // 防止中文乱码
        String fileName = URLEncoder.encode("文件名称", "UTF-8").replaceAll("\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream()).sheet("模板").doWrite(userService.selectAll());
    }

}

启动类

@MapperScan("ink.banq.demo.mapper")
@SpringBootApplication
public class ExcelApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExcelApplication.class,args);
    }
}

测试

(1)测试导入功能,使用Postman测试,如下图所示:

 

(2)测试导出功能,浏览器访问:http://localhost:8080/download

 

最后附上完整代码:SpringBoot整合EasyExcel进行报表导入导出实例Demo

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571283.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号