基于SAX解析Excel文件至多表并提高数据精度的方法与流程

文档序号:26837084发布日期:2021-10-07 09:38阅读:366来源:国知局
基于SAX解析Excel文件至多表并提高数据精度的方法与流程

本发明涉及数据处理技术领域,具体的说是一种基于SAX解析Excel文件至多表并提高数据精度的方法。

背景技术

对于excel文件解析导入数据库表,传统的方式存在以下几个问题:

(1)传统DOM解析方式一个几M的excel文件,解析的结果将会占用几百M的内存,导致JVM内存溢出;

(2)每一个excel文件仅能有一个表头信息,当一个excel文件中存在多个表头信息时,必须将该excel拆分为多个不同表头的excel(一个表头对应一个excel 数据文件),逐个导入;

(3)excel表头与数据表的映射关系必须完全匹配,不能按照指定的需求,进行部分匹配;

(4)SAX解析数据会丢失精度和时间格式无法正常转换。

对于上述的四点问题,设计研发一种基于SAX解析Excel文件至多表并提高数据精度的方法,以通过将解析excel的传统方式转化为SAX方式进行解析,并通过配置多个不同的excel表头与数据表的映射关系,和重写SAX抽象类,成功解决上述四点问题,使得excel文件的导入变得高效便捷。



技术实现要素:

本发明针对目前技术发展的需求和不足之处,提供一种基于SAX解析Excel文件至多表并提高数据精度的方法,旨在将excel文件通过SAX解析方式导入多个数据库表中,同时解决数据会丢失精度问题、时间格式无法正常转换问题和传统DOM解析方式带来的问题。

本发明的一种基于SAX解析Excel文件至多表并提高数据精度的方法,解决上述技术问题采用的技术方案如下:

一种基于SAX解析Excel文件至多表并提高数据精度的方法,首先获取excel文件,excel文件包含多个映射,每个映射为excel文件的表头,配置目标数据表与表头的映射关系;然后比对excel文件中表头信息与配置目标数据表的映射关系,通过 SAX解析excel文件每一个数据单元,并进行映射关系匹配验证,最后将excel文件按照匹配成功的映射关系进行数据导入拆分,当遍历数据到达设定的数据阈值或为新表头时,启动多线程和数据源的连接池进行数据导入处理。

可选的,获取的excel文件包括03版本和07版本两种。

进一步可选的,针对03版本的excel文件,需要编写实现HSSFListener接口的抽象类XLSReader,实现processRecord方法,用于读取行列,且针对每种单元格数据类型根据record.getSid()进行处理。

进一步可选的,针对07版本的excel文件,需要编写继承DefaultHandler的抽象类XLSXReader,重写startElement和endElement,用于读取行列。

优选的,读取行列的过程中,将数字中日期类型的默认转为yyyy-MM-dd HH:mm:ss:SSS格式进行统一处理。

可选的,比对excel文件中表头信息与配置目标数据表的映射关系之前,需要根据部署机器的线程数、内存和EXCEL行数据大小,设置数据阈值。

可选的,比对excel文件中表头信息与配置目标数据表的映射关系,通过SAX解析excel文件每一个数据单元,并进行映射关系匹配验证,具体为:

采用SAX方式遍历excel文件的每行并与映射关系进行匹配,确认该excel文件中匹配的映射关系的相关信息,统计满足映射的表头个数,并记录满足匹配成功的映射的sheet页和行列信息。

进一步可选的,一个映射关系包括多个表头与数据列的映射。

本发明的一种基于SAX解析Excel文件至多表并提高数据精度的方法,与现有技术相比具有的有益效果是:

(1)本发明旨在将excel文件通过SAX解析方式导入多个数据库表中,同时解决数据会丢失精度问题、时间格式无法正常转换问题和传统DOM解析方式带来的问题;

(2)本发明采用SAX方式解析excel文件,并配置excel表头与数据表的多个映射关系,重写SAX抽象类,来提高excel文件导入的灵活性、效率和准确性;另外,还通过抽象类XLSXReader和XLSReader数据处理提高数据精度和日期数据处理能力。

附图说明

附图1是本发明的方法流程图。

具体实施方式

为使本发明的技术方案、解决的技术问题和技术效果更加清楚明白,以下结合具体实施例,对本发明的技术方案进行清楚、完整的描述。

实施例一:

本实施例提出一种基于SAX解析Excel文件至多表并提高数据精度的方法,包括:

首先,获取excel文件,excel文件包含多个映射,每个映射为excel文件的表头,配置目标数据表与表头的映射关系。

根据部署机器的线程数、内存和EXCEL行数据大小,设置数据阈值。

然后,比对excel文件中表头信息与配置目标数据表的映射关系,通过SAX解析 excel文件每一个数据单元,并进行映射关系匹配验证,具体为:

采用SAX方式遍历excel文件的每行并与映射关系进行匹配,确认该excel文件中匹配的映射关系的相关信息,一个映射关系包括多个表头与数据列的映射;统计满足映射的表头个数,并记录满足匹配成功的映射的sheet页和行列信息。

最后,将excel文件按照匹配成功的映射关系进行数据导入拆分,当遍历数据到达设定的数据阈值或为新表头时,启动多线程和数据源的连接池进行数据导入处理。

本实施例中,获取的excel文件为03版本,此时,需要编写实现HSSFListener 接口的抽象类XLSReader,实现processRecord方法,用于读取行列,且针对每种单元格数据类型根据record.getSid()进行处理。读取行列的过程中,将数字中日期类型的默认转为yyyy-MM-dd HH:mm:ss:SSS格式进行统一处理,尤其是个性化的m/d/yy、 yy、/yy、/m、m/、/d、d/、/年、年/、/月、月/、/日、日/等。

编写抽象类XLSReader的具体实现代码如下:

实施例二:

本实施例提出一种基于SAX解析Excel文件至多表并提高数据精度的方法,包括:

首先,获取excel文件,excel文件包含多个映射,每个映射为excel文件的表头,配置目标数据表与表头的映射关系。

根据部署机器的线程数、内存和EXCEL行数据大小,设置数据阈值。

然后,比对excel文件中表头信息与配置目标数据表的映射关系,通过SAX解析 excel文件每一个数据单元,并进行映射关系匹配验证,具体为:

采用SAX方式遍历excel文件的每行并与映射关系进行匹配,确认该excel文件中匹配的映射关系的相关信息,一个映射关系包括多个表头与数据列的映射;统计满足映射的表头个数,并记录满足匹配成功的映射的sheet页和行列信息。

最后,将excel文件按照匹配成功的映射关系进行数据导入拆分,当遍历数据到达设定的数据阈值或为新表头时,启动多线程和数据源的连接池进行数据导入处理。

本实施例中,获取的excel文件为07版本,此时,需要需要编写继承 DefaultHandler的抽象类XLSXReader,重写startElement和endElement,用于读取行列。读取行列的过程中,将数字中日期类型的默认转为yyyy-MM-dd HH:mm:ss:SSS 格式进行统一处理,尤其是个性化的m/d/yy、yy、/yy、/m、m/、/d、d/、/年、年/、 /月、月/、/日、日/等。

编写抽象类XLSXReader的具体实现代码如下:

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1