目录
- 一、前言
- 二、EasyExcel解析文件
- 2.1、EasyExcel选型
- 2.2、如何存储excel解析的文件
- 2.3、解析格式规则的excel文件
- 2.4、解析未知格式规则的excel文件
一、前言
最近项目中,需要对excel、csv等文件进行解析,并做相关的业务功能。在实际业务中,遇到不少难题:
(1)、excel、csv格式未知,如果解析并合理存储数据?
(2)、对于大文件上传或多文件上传,如何保证系统性能和提高效率?
…
本篇文章,我们主要介绍的是EasyExcel如何解析各类格式的文档,并合理存储数据的技术方案思路。
二、EasyExcel解析文件
2.1、EasyExcel选型
EasyExcel类是一套基于Java的开源Excel解析工具类,相较于传统的框架如Apache poi、jxl等更加快速、简洁,还可以解决大文件内存溢出问题,即能让使用者在不用考虑性能、内存的等因素的情况下,快速完成Excel的读(导入)、写(导出)等功能。
针对excel、csv文件进行解析,这里介绍EasyExcel来解析。参考
https://easyexcel.opensource.alibaba.com/docs/current/
主要有四类监听器:
名称 说明
AnalysisEventListener < T > 分析事件侦听器:接收解析的每条数据的返回。
SyncReadListener 同步读取侦听器。
AbstractIgnoreExceptionReadListener 抽象忽略异常读取侦听器。
ModelBuildEventListener 模型构建事件侦听器。
2.2、如何存储excel解析的文件
大部分excel形式如上是n*m的矩阵。那么解析的数据也准备按照这里的规则解析出,并且可以有效的查询需要的数据。因此,对应的设计两个表:file_info表、sheet_file表。
file_info表主要生成一个文件id【这个文件id可以关联到上传存储到mongodb,以便下载】,sheet_list还是对这个文件的每个sheet的详细介绍。
sheet_file表记录的是每个sheet的每一行数据,因此数据量会较大。
2.3、解析格式规则的excel文件
一般是定义一个Bean对象,通过@ExcelProperty(value = “名称”,index = 0)来解析识别对应列。
这里定义一个Bean对象,来对照具体的Excel文件的列
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExcelImportVo implements Serializable {private static final long serialVersionUID = -3029432587804941376L;@ExcelProperty(value = "名称",index = 0)private String name;@ExcelProperty(value = "手机号",index = 1)private String phone;@ExcelProperty(value = "公司",index = 2)private String corporation;
}
/*** 默认某个sheet,一行行的读取excel*/
@Slf4j
public class EasyReadListener implements ReadListener<ExcelImportVo> {public EasyReadListener(){}@Overridepublic void invokeHead(Map<Integer, ReadCellData<?>