数据导出通用方案——异步导出

4,238 阅读3分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

在管理后台系统中,基本都有一个功能:数据导出。一般数据导出就是将系统数据导出Excel文件,给到运营、财务人员,更方便他们对数据进行分析、对账等。导出的数据相对于系统的分页查看数据,它数据量有可能很大,所以导出有时是一个非常耗时的操作,如果是同步导出,用户将要在浏览器等待一段时间才有响应,甚至响应超时,无数据返回。采用异步导出,就可以解决这样的问题。

所谓异步导出就是数据导出时,异步生成文件,然后在系统提供下载页面,供用户在数据导出完成时下载。

基本设计思路

  1. 按条件筛选数据
  2. 将数据写入Excel格式文件
  3. 将Excel格式文件上传至文件服务器,并生成文件记录
  4. 提供导出记录,用户下载已上传的文件

表数据设计

CREATE TABLE `export_log` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `file_sn` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '文件记录sn',
  `user_sn` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用户sn',
  `file_type` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '文件类型',
  `file_name` varchar(50) NOT NULL DEFAULT '' COMMENT '文件名称',
  `status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '异步导出文件状态, 0-导出中,1-导出成功,2-导出失败',
  `message` varchar(255) NOT NULL DEFAULT '' COMMENT '失败详情',
  `file_url` varchar(255) NOT NULL DEFAULT '' COMMENT '文件下载地址',
  `platform` varchar(20) NOT NULL DEFAULT '' COMMENT '文件所属平台',
  `start_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '导出开始时间',
  `end_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '导出结束时间',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_file_sn` (`file_sn`) USING BTREE COMMENT '文件记录sn',
  KEY `idx_start_time` (`start_time`) USING BTREE COMMENT '导出开始时间',
  KEY `idx_user_sn` (`user_sn`) USING BTREE COMMENT '用户sn'
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COMMENT='导出记录';

Java解析生成Excel的工具类

Apache POI

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。官方文档:poi.apache.org/

easyexcel

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

官方文档:github.com/alibaba/eas…

easypoi

easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法(摘自官方文档)

官方文档:easypoi.mydoc.io/