树形结构数据处理方法、装置、电子设备及存储介质与流程

未命名 07-23 阅读:199 评论:0
1.本技术涉及计算机
技术领域
:,尤其涉及一种树形结构数据处理方法、装置、电子设备及存储介质。
背景技术
::2.在许多实际应用中,经常需要处理和操作树形结构的数据。例如,在进行在线配置文档目录的过程中,用户需要以类似脑图的形式,不断在根节点下添加平行节点或子节点。然而,现存的类脑图工具在追求功能丰富的过程中,界面元素过多,与内部用户的操作习惯不符,且在数据量大的场景下,频繁的数据交互导致界面卡顿,操作体验不佳。3.此外,针对不同的应用场景,可能会有特殊的需求,例如:限制节点树的深度(比如最多3级),限制节点的类型,以及限制每个节点下能添加的子节点的规则(例如,如果一个节点已经存在内容节点,则不能继续添加目录节点等)。因此,现有的脑图结构数据无法满足不同应用场景下的特殊需求。技术实现要素:4.有鉴于此,本技术实施例提供了一种树形结构数据处理方法、装置、电子设备及存储介质,以解决现有技术存在的在数据量大的场景下,频繁的数据交互导致界面卡顿,操作体验不佳,脑图结构数据无法满足不同应用场景下的特殊需求的问题。5.本技术实施例的第一方面,提供了一种树形结构数据处理方法,包括:依据用户通过客户端上传的excel文件获取文件流,基于文件流创建一个opc包,opc包提供用于访问和操作opc包中的文件流的接口;创建用于数据提取的表格阅读器对象,利用表格阅读器对象对opc包中的数据进行提取,得到共享字符串表、样式信息以及工作表数据;创建用于解析工作表数据的数据解析器,并为数据解析器设置事件处理器,将事件处理器的参数发送给事件驱动处理器,利用事件驱动处理器对工作表数据进行逐行读取并解析;在利用事件驱动处理器逐行读取并解析工作表数据的过程中,依据事件触发与事件相关联的事件处理器对工作表数据进行解析,将解析后的数据存储到事件处理器中,并生成数据列表;对预定的递归方法进行调用,递归方法用于对数据列表中的目录和内容数据进行查询,并且遍历目录和内容数据,以筛选出所有的根节点,对根节点进行排序,以确定树形结构的根节点顺序;利用预定的外层循环遍历根节点,以及利用预定的内层循环遍历数据列表中的全量数据,得到非叶子节点或叶子节点,对于每个非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据;将树形结构数据拆分成父子节点关系,将父子节点关系中的目录和内容数据按照层级进行排序,将排序后的目录和内容数据进行序列化处理后存储到数据库中。6.本技术实施例的第二方面,提供了一种树形结构数据处理装置,包括:创建模块,被配置为依据用户通过客户端上传的excel文件获取文件流,基于文件流创建一个opc包,opc包提供用于访问和操作opc包中的文件流的接口;提取模块,被配置为创建用于数据提取的表格阅读器对象,利用表格阅读器对象对opc包中的数据进行提取,得到共享字符串表、样式信息以及工作表数据;设置模块,被配置为创建用于解析工作表数据的数据解析器,并为数据解析器设置事件处理器,将事件处理器的参数发送给事件驱动处理器,利用事件驱动处理器对工作表数据进行逐行读取并解析;解析模块,被配置为在利用事件驱动处理器逐行读取并解析工作表数据的过程中,依据事件触发与事件相关联的事件处理器对工作表数据进行解析,将解析后的数据存储到事件处理器中,并生成数据列表;调用模块,被配置为对预定的递归方法进行调用,递归方法用于对数据列表中的目录和内容数据进行查询,并且遍历目录和内容数据,以筛选出所有的根节点,对根节点进行排序,以确定树形结构的根节点顺序;遍历模块,被配置为利用预定的外层循环遍历根节点,以及利用预定的内层循环遍历数据列表中的全量数据,得到非叶子节点或叶子节点,对于每个非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据;存储模块,被配置为将树形结构数据拆分成父子节点关系,将父子节点关系中的目录和内容数据按照层级进行排序,将排序后的目录和内容数据进行序列化处理后存储到数据库中。7.本技术实施例的第三方面,提供了一种电子设备,包括存储器,处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现上述方法的步骤。8.本技术实施例的第四方面,提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时实现上述方法的步骤。9.本技术实施例采用的上述至少一个技术方案能够达到以下有益效果:通过依据用户通过客户端上传的excel文件获取文件流,基于文件流创建一个opc包,opc包提供用于访问和操作opc包中的文件流的接口;创建用于数据提取的表格阅读器对象,利用表格阅读器对象对opc包中的数据进行提取,得到共享字符串表、样式信息以及工作表数据;创建用于解析工作表数据的数据解析器,并为数据解析器设置事件处理器,将事件处理器的参数发送给事件驱动处理器,利用事件驱动处理器对工作表数据进行逐行读取并解析;在利用事件驱动处理器逐行读取并解析工作表数据的过程中,依据事件触发与事件相关联的事件处理器对工作表数据进行解析,将解析后的数据存储到事件处理器中,并生成数据列表;对预定的递归方法进行调用,递归方法用于对数据列表中的目录和内容数据进行查询,并且遍历目录和内容数据,以筛选出所有的根节点,对根节点进行排序,以确定树形结构的根节点顺序;利用预定的外层循环遍历根节点,以及利用预定的内层循环遍历数据列表中的全量数据,得到非叶子节点或叶子节点,对于每个非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据;将树形结构数据拆分成父子节点关系,将父子节点关系中的目录和内容数据按照层级进行排序,将排序后的目录和内容数据进行序列化处理后存储到数据库中。本技术提供了一种精练的树形数据结构,避免客户端与服务端进行数据交互时出现界面卡顿的情况,提升用户操作体验,能够满足不同应用场景下的特殊需求,并且提高了树形结构数据生成及处理的效率。附图说明10.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。11.图1是本技术实施例提供的树形结构数据处理方法的流程示意图;图2是本技术实施例提供的另一种树形结构数据处理方法的流程示意图;图3是本技术实施例提供的树形结构数据处理装置的结构示意图;图4是本技术实施例提供的电子设备的结构示意图。具体实施方式12.以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本技术实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本技术。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本技术的描述。13.在实际项目里,涉及到在线配置文档目录,这是一种典型的树形结构数据,类似于脑图,允许用户不断地在根节点下为某节点添加平行节点或子节点。市面上现存的类脑图工具为了追求功能丰富,界面元素较多,不符合内部用户的操作习惯。另外在数据量较大场景下,频繁的数据交互导致界面卡顿。14.另外,需求方设置了一些特殊需求,例如:(1)节点树有深度限制(比如至多3级);(2)节点有不同类型;(3)每个节点下能添加的子节点有一定规则(例如,如果一个节点已经存在内容节点,则不能继续添加目录节点等),所以市面上的脑图结构已经不再适用,需要创造新的输入工具既能够实现树形结构数据的输入,同时要满足特殊的需求。15.树形结构数据的输入工具包括两个部分:用户操作界面和后台存储系统。需求方期望用户操作简单且响应快,这就要求前端界面与后台存储系统交互频率低且传输的数据包小。市面上现存的类脑图工具为了追求功能丰富,界面元素较多,不符合内部用户的操作习惯。另外在数据量较大场景下,频繁的数据交互导致界面卡顿。16.鉴于现有技术中存在的问题,如何设计出一种既能实现树形结构数据的输入,又能实现定制化规则控制,且与后台存储系统的交互效率高,数据传输包小的输入工具,是当前技术发展中的一个重要问题。17.图1是本技术实施例提供的树形结构数据处理方法的流程示意图。图1的树形结构数据处理方法可以由服务器执行。如图1所示,该树形结构数据处理方法具体可以包括:s101,依据用户通过客户端上传的excel文件获取文件流,基于文件流创建一个opc包,opc包提供用于访问和操作opc包中的文件流的接口;s102,创建用于数据提取的表格阅读器对象,利用表格阅读器对象对opc包中的数据进行提取,得到共享字符串表、样式信息以及工作表数据;s103,创建用于解析工作表数据的数据解析器,并为数据解析器设置事件处理器,将事件处理器的参数发送给事件驱动处理器,利用事件驱动处理器对工作表数据进行逐行读取并解析;s104,在利用事件驱动处理器逐行读取并解析工作表数据的过程中,依据事件触发与事件相关联的事件处理器对工作表数据进行解析,将解析后的数据存储到事件处理器中,并生成数据列表;s105,对预定的递归方法进行调用,递归方法用于对数据列表中的目录和内容数据进行查询,并且遍历目录和内容数据,以筛选出所有的根节点,对根节点进行排序,以确定树形结构的根节点顺序;s106,利用预定的外层循环遍历根节点,以及利用预定的内层循环遍历数据列表中的全量数据,得到非叶子节点或叶子节点,对于每个非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据;s107,将树形结构数据拆分成父子节点关系,将父子节点关系中的目录和内容数据按照层级进行排序,将排序后的目录和内容数据进行序列化处理后存储到数据库中。18.树形结构数据是一种非线性的数据结构,其中每个数据节点可以有多个子节点,但只有一个父节点(除了根节点,它没有父节点)。这种结构类似于一个倒置的树,所以被称为“树形”结构。在树形数据结构中,包括但不限于以下主要元素:节点(node):每个数据元素都是一个节点。19.根节点(rootnode):没有父节点的节点,是树的起始节点。20.子节点(childnodes):一个节点直接连接的下级节点。21.父节点(parentnode):一个节点直接连接的上级节点。22.叶节点(leafnodes):没有子节点的节点。23.兄弟节点(siblingnodes):有共同父节点的节点。24.树形数据结构在计算机科学和数据处理中有广泛的应用,例如文件系统、编程语言的语法分析、数据库索引等等。在处理层级关系、组织结构、分类信息等方面,树形数据结构具有优越性。25.本技术实施例中根据文件流创建opc包,创建表格阅读器对象,以及工作表数据的解析等操作,可以是基于二次开发的apachepoi库(简称poi库)来完成,apachepoi库是一个用于处理microsoftoffice文档的开源java库。在本技术中它主要用于读取和解析excel文件。在实际应用中,使用apachepoi库读取excel文件主要包括两个关键部分:使用poi库的关键点和sax解析方法。26.进一步地,使用poi库的关键点包括设置poi的时间模式以及读取excel文件,其中,设置poi的时间模式为了确保库正确处理日期和时间数据。读取excel文件时,通过excel文件获取文件流,然后,根据文件流创建一个opcpackage对象(即opc包),这个对象代表了整个excel文件。27.在一些实施例中,依据用户通过客户端上传的excel文件获取文件流,基于文件流创建一个opc包,包括:获取用户通过客户端上传的excel文件,将excel文件转换成文件流,将文件流作为参数输入到预设的opcpackage类的方法中,以使opcpackage类创建一个opc包;其中,excel文件中包含目录、内容以及内容类型,opc包为opcpackage对象。28.具体地,opcpackage对象(即opc包)可以看作是ooxml文件的一个抽象表示,它提供了一组api来访问和操作包含在这个包中的各种资源。比如,可以使用opcpackage来读取一个excel文件中的所有工作表,或者修改一个word文件中的某个段落。在实际应用中,根据文件流创建opc包的基本过程如下:首先,获取一个excel文件源(即客户端上传的excel文件),这里可以是存储在磁盘上的文件,或者是从网络上下载的文件。这个文件需要被转换成一个输入流(即excel文件流)。29.接下来,使用opcpackage类的open方法,将上一步获取到的文件流作为参数输入到opcpackage类的open方法中,这样就可以创建一个opcpackage对象(即opc包)。这个对象代表了整个excel文件,可以理解为是excel文件的一个抽象表达。在得到opc包之后,便可以使用它来访问和操作excel文件。因此,opc包提供了一系列的接口,通过接口能够读取或者写入excel文件中的数据。30.进一步地,在根据文件流创建opc包之后,本技术实施例还将创建一个xssfreader对象(即表格阅读器对象),利用xssfreader对象可以逐个访问excel文件中的各个部分,例如共享字符串表、样式信息以及工作表数据等。它提供了一种更底层、更灵活的方式来处理大型excel文件,特别是需要进行流式读取(streamingread)以节省内存时。31.需要说明的是,xssfreader对象是poi库中的一个类,用于读取excel文件(更准确地说,读取excel的.xlsx格式文件)。这个类提供了多种方法来读取excel文件的不同部分,包括共享字符串表(sharedstringstable),样式表(stylestable),以及各个工作表(sheets)的数据。通过创建一个xssfreader对象,利用它从opcpackage对象中读取excel文件的内容。在实际应用中,xssfreader对象也可以称为“xssf阅读器”。32.在本技术实施例的场景下,可以将xssfreader对象理解为一个工具,它能够从opcpackage(即excel文件的抽象表示)中提取出特定的数据,例如包括共享字符串表、样式信息以及工作表数据。33.在一个示例中,本技术利用poi读取用户上传的excel文件时,通过导入maven依赖实现,下面结合代码对maven依赖的具体添加方法进行详细说明,具体可以包括以下内容:《dependency》《groupid》org.apache.poi《/groupid》《artifactid》poi《/artifactid》《version》4.0.1《/version》《/dependency》《dependency》《groupid》org.apache.poi《/groupid》《artifactid》poi-ooxml《/artifactid》《version》4.0.1《/version》《/dependency》《dependency》《groupid》org.apache.poi《/groupid》《artifactid》poi-ooxml-schemas《/artifactid》《version》4.0.1《/version》《/dependency》这段代码是在maven项目中添加所需要的库依赖,这些库将会被用于处理excel文件。maven是一种项目管理工具,它可以自动下载和管理项目所需要的各种库。这些库就像是项目的一部分,项目的代码可以使用库中的功能。34.这里添加了三个库的依赖:《groupid》org.apache.poi《/groupid》《artifactid》poi《/artifactid》《version》4.0.1《/version》这个依赖是apachepoi库的主要部分,它提供了许多用于操作office文件(如excel、word等)的功能。35.《groupid》org.apache.poi《/groupid》《artifactid》poi-ooxml《/artifactid》《version》4.0.1《/version》这个依赖是apachepoi库的一个扩展,它提供了对office2007及以后版本(这些版本的文件格式通常被称为ooxml,即officeopenxml)的支持。36.《groupid》org.apache.poi《/groupid》《artifactid》poi-ooxml-schemas《/artifactid》《version》4.0.1《/version》这个依赖包含了ooxml文件格式所需要的各种xmlschema定义。这些schema定义了ooxml文件中的各种元素和属性的结构。37.在添加了这些依赖之后,项目的代码就可以使用poi库提供的各种功能来读取和处理excel文件了。38.在读取excel文件之后,本技术实施例将使用sax解析方法对读取到的数据进行解析,sax解析方法包括以下内容:自定义sheet处理器:创建一个处理器,用于处理excel表格中的数据。这个处理器需要根据具体需求编写,以便对数据进行特定的操作。39.创建sax的xmlreader:这个对象负责解析excel文件的xml结构,并将解析过程中的事件传递给sheet处理器。40.设置sheet事件处理器:将自定义的sheet处理器与xmlreader关联,确保在解析过程中,处理器能够接收并处理相应的事件。41.逐行读取:最后,通过xmlreader逐行读取excel表格中的数据,并根据自定义的sheet处理器进行处理。42.以上实施例介绍了如何利用apachepoi库和sax解析方法从excel文件中读取并解析数据的过程。通过创建自定义的sheet处理器和关联事件,程序员可以对数据进行所需的操作。43.可选地,在利用sax解析方法解析excel文件时,首先需要创建一个xmlreader对象(即数据解析器),这个对象用于解析xml文件。由于excel文件的内部结构实际上是xml格式,因此需要使用xmlreader来解析。xmlreader是javasax(simpleapiforxml)解析器的核心接口。sax解析器是一种基于事件驱动的解析方式,它在解析xml文档时会触发一系列的事件,比如文档开始、文档结束、标签开始、标签结束、文本读取等。开发者可以通过在这些事件上注册处理器来进行自定义处理。44.在实际应用中,创建数据解析器,并为数据解析器设置事件处理器(即sheethandler对象)。在解析xml文档的过程中,每遇到一个事件,sax解析器就会调用相应的处理器方法进行处理。在实际应用中,xmlreader也可以被称为“xml阅读器”或者“xml解析器”。45.在本技术实施例的场景中,可以将xmlreader理解为一个工具,它能够读取xml格式的excel工作表数据,并在遇到特定事件(比如开始新的行或新的单元格)时触发预设的事件处理器(即sheethandler对象)进行数据处理。46.在一些实施例中,在为数据解析器设置事件处理器之后,该方法还包括:将事件处理器注册到工作表的xml处理器对象中,并将工作表的xml处理器对象设置为数据解析器的内容处理器,当数据解析器在解析excel文件时,调用工作表的xml处理器对象,遍历excel文件中的所有工作表,并利用数据解析器逐行读取每个工作表中的数据。47.具体地,创建一个sheethandler对象(即事件处理器,也称为表格处理器),并把它注册到xssfsheetxmlhandler对象(即工作表的xml处理器对象)中。sheethandler对象是用户自定义的事件处理器,当xmlreader(数据解析器)在解析excel文件时遇到某些事件(如开始解析一个单元格、结束解析一个单元格等)时,会主动调用sheethandler对象中的相应方法来进行数据处理。48.在一个示例中,把xssfsheetxmlhandler(工作表的xml处理器对象)设置为xmlreader(数据解析器)的内容处理器,这样当xmlreader在解析excel文件时就会调用xssfsheetxmlhandler以及其内部的sheethandler(事件处理器)中的方法来进行处理。49.需要说明的是,xssfsheetxmlhandler是poi库中的一个类,用于处理或解析officeopenxml(ooxml)格式的excel文件(通常是.xlsx文件)中的工作表部分。因此,xssfsheetxmlhandler可以理解为用于处理ooxml格式的excel文件中的工作表部分的xml处理器。50.在一些实施例中,依据事件触发与事件相关联的事件处理器对工作表数据进行解析,包括:在依据事件触发逐行读取并解析工作表数据时,创建元素树数据对象,其中,元素树数据对象用于对excel文件中的每一行数据进行封装;在对每一行数据中的每一个单元格进行解析时,根据单元格的名称,将单元格对应的数据保存到元素树数据对象的相应属性中;在结束对一行数据的解析之后,将当前封装了一行数据的元素树数据对象添加到列表中,对列表的大小进行检查,当列表的大小达到预设阈值时,执行一次数据插入操作,并清空列表;其中,事件包括开始解析一行数据、结束解析一行数据、解析单元格以及结束解析单元格。51.具体地,在开始解析excel文件的每一行数据时,创建一个新的elementtreedata对象(即元素树数据对象,用于代表一行数据),元素树数据对象用来封装这一行的数据。这里的元素树数据对象可以认为是一个数据结构,它用于存储和管理与excel表格的一行数据相关的数据。在实际应用中,每个elementtreedata对象都代表excel表格中的一行数据。52.进一步地,在解析每一行数据中的每一个单元格时,根据单元格的名称(例如“a”、“b”等),将单元格对应的数据(即单元格对应的值)设置到当前elementtreedata对象(元素树数据对象)的相应属性中。53.在结束一行数据的解析之后,将封装了这一行数据的elementtreedata对象添加到一个列表中,并检查该列表的大小。判断该列表的大小是否达到了预设阈值(比如将阈值设置为1024),如果列表的大小达到了1024,则执行一次数据批量插入操作,然后清空列表。54.以上实施例对利用数据解析器对excel文件中的工作表数据进行解析的全过程做了描述。下面结合实际代码对excel文件中的工作表数据的分析处理方法进行说明,具体可以包括以下内容:packagecom.longfor.c2.classification.service;importcom.longfor.c2.classification.api.domain.response.element.elementtreedata;importlombok.data;importorg.apache.poi.xssf.eventusermodel.xssfsheetxmlhandler;importorg.apache.poi.xssf.usermodel.xssfcomment;importjava.util.arraylist;importjava.util.list;/***@author:hantao*@description自定义sheet基于sax的解析处理器*@date:上午11:002022/7/12*/@datapublicclasssheethandlerimplementsxssfsheetxmlhandler.sheetcontentshandler{//封装实体对象privateelementtreedataelementtreedata;//实体对象集合privatelist《elementtreedata》employeelist=newarraylist《》(max_employee);//集合最大容量privatestaticfinalintmax_employee=1024;//第几次插入数据,初始值为1privateinttimes=1;//总数据量privateintallcount=0;/***当开始解析某一行的时候出发**@parami行号*/@overridepublicvoidstartrow(inti){if(i》0){elementtreedata=newelementtreedata();}}/***当结束解析某一行的时候出发**@parami行号*/@overridepublicvoidendrow(inti){employeelist.add(elementtreedata);allcount++;if(employeelist.size()==max_employee){//假设有一个批量插入system.out.println("执行第"+times+"次插入");times++;employeelist.clear();}}/***对行中的每一个单元格进行处理**@paramcellname单元格名称*@paramvalue数据*@paramxssfcomment批注*/@overridepublicvoidcell(stringcellname,stringvalue,xssfcommentxssfcomment){if(elementtreedata!=null){stringprefix=cellname.substring(0,1);switch(prefix){case"a":elementtreedata.setid(long.valueof(value));break;case"b":elementtreedata.setname(value);break;case"c":elementtreedata.settype(integer.valueof(value));break;case"d":elementtreedata.setsort(integer.valueof(value));break;case"e":elementtreedata.setelementuuid(value);break;case"f":elementtreedata.setparentid(value);break;}}}}上述代码是用来解析用户上传的excel文件,并将解析后的数据以对象的形式保存在内存中的。以下是对这段代码的详细解释:首先,maven依赖项的导入,maven是一种项目管理工具,用来管理项目的构建、报告和文档等。这里导入了三个apachepoi库的依赖项,这些库用来处理office文档,特别是excel文档。55.然后,代码开始的部分定义了一个类sheethandler(事件处理器),这个类实现了poi库中的一个接口xssfsheetxmlhandler.sheetcontentshandler。这个接口提供了处理excel文件中的每一行数据的方法,当遇到特定的事件(例如,开始解析一行、结束解析一行、解析单元格等)时,这些方法将被调用。56.进一步地,具体到sheethandler这个类,事件处理器所执行的操作包括:在开始解析新的一行数据时,创建一个新的elementtreedata对象(元素树数据对象)。在解析单元格时,根据单元格的名称,将单元格的值设置到当前elementtreedata对象的对应属性中。在结束对一行数据的解析后,将当前的elementtreedata对象添加到一个列表中。并检查该列表的大小是否达到阈值(比如1024),如果达到阈值则执行一次批量插入操作,并清空列表。57.上述代码还提供了getemployeelist()方法,以便在调用解析处理器的代码处获取尚未插入的数据。记录总数据量和插入次数,以便进行统计和日志输出。因此,sheethandler类的主要作用是解析excel工作表的内容,并将其转换为应用程序可以使用的对象列表。58.在sheethandler类中,还定义了一些成员变量,包括一个elementtreedata对象(用来封装一行数据),一个list《elementtreedata》对象(用来保存多行数据),以及一些用来计数的变量。然后,sheethandler类重写了sheetcontentshandler接口中的三个方法:startrow、endrow和cell。59.其中,startrow方法在开始处理一行数据时被调用。这个方法中,创建了一个新的elementtreedata对象,准备用来封装这一行的数据。60.cell方法用来处理一行中的每一个单元格。这个方法中,根据单元格的名称,将单元格的数据保存到elementtreedata对象的相应属性中。61.endrow方法在结束处理一行数据时被调用。这个方法中,将封装了一行数据的elementtreedata对象添加到列表中,并检查列表的大小。如果列表的大小达到了阈值,则执行一次数据插入操作,然后清空列表。62.需要说明的是,上述代码只是一个示例,通过上述代码实现了利用基于sax的解析处理器对excel文件中的工作表数据进行分析处理操作的流程,在实际应用时,可以根据具体使用场景将上述代码替换成相应的数据库操作代码,因此,上述代码不构成对本技术技术方案的限制。63.在另一个示例中,本技术实施例还提供了excel文件读取以及对读取到的数据进行解析的完整过程的实现代码。下面结合具体的代码以及前述实施例的内容,对本技术树形结构数据处理方法中的excel文件读取以及数据解析处理的全过程进行详细描述,具体可以包括以下内容:packagecom.longfor.c2.classification.service;importcom.longfor.c2.classification.api.domain.response.element.elementtreedata;importlombok.extern.slf4j.slf4j;importorg.apache.poi.openxml4j.opc.opcpackage;importorg.apache.poi.openxml4j.opc.packageaccess;importorg.apache.poi.xssf.eventusermodel.xssfreader;importorg.apache.poi.xssf.eventusermodel.xssfsheetxmlhandler;importorg.apache.poi.xssf.model.sharedstringstable;importorg.apache.poi.xssf.model.stylestable;importorg.springframework.stereotype.service;importorg.xml.sax.inputsource;importorg.xml.sax.xmlreader;importorg.xml.sax.helpers.xmlreaderfactory;importjava.io.inputstream;importjava.util.list;/***@author:hantao*@description导入excel文件业务层*excel读取有两种方式*1.用户模式:使用系列封装好的api操作excel*2.事件驱动:基于sax的读取方式读取excel的xml文件*@date:上午11:132022/7/12*/@slf4j@servicepublicclassimportexcelservice{/***读取大数据量excel**@parampath文件路径*/publicvoidreadbigdataexcel(stringpath)throwsexception{//1.根据excel报表获取opcpackageopcpackageopcpackage=opcpackage.open(path,packageaccess.read);//2.创建xssfreaderxssfreaderxssfreader=newxssfreader(opcpackage);//3.获取sharedstringtable对象sharedstringstablesharedstringstable=xssfreader.getsharedstringstable();//4.获取styletable对象stylestablestylestable=xssfreader.getstylestable();//5.创建saxxmlreader对象xmlreaderxmlreader=xmlreaderfactory.createxmlreader();//6.注册事件驱动处理器sheethandlersheethandler=newsheethandler();xssfsheetxmlhandlerxssfsheetxmlhandler=newxssfsheetxmlhandler(stylestable,sharedstringstable,sheethandler,false);xmlreader.setcontenthandler(xssfsheetxmlhandler);//7.逐行读取xssfreader.sheetiteratorsheetiterator=(xssfreader.sheetiterator)xssfreader.getsheetsdata();while(sheetiterator.hasnext()){inputstreamin=sheetiterator.next();inputsourceis=newinputsource(in);xmlreader.parse(is);}list《elementtreedata》employeelist=sheethandler.getemployeelist();//剩余未插入的数据插入log.info("最后一次插入数据,本次数据量为{}",employeelist.size());log.info("共插入"+sheethandler.getallcount()+"条数据");}}上述这段代码的主要目的是读取excel文件并解析其中的数据。它使用的是sax解析方式(基于事件驱动的解析方式),excel文件读取以及数据解析处理的过程如下:opcpackageopcpackage=opcpackage.open(path,packageaccess.read);这一行代码表示打开一个excel文件,并返回一个opcpackage对象,这个对象代表了整个excel文件。64.xssfreaderxssfreader=newxssfreader(opcpackage);这一行代码表示创建一个xssfreader对象,这个对象用于从opcpackage对象中读取各种信息。65.sharedstringstablesharedstringstable=xssfreader.getsharedstringstable();和stylestablestylestable=xssfreader.getstylestable();这两行代码分别表示获取sharedstringstable和stylestable对象,这两个对象分别包含了excel文件中所有的共享字符串和样式信息。66.xmlreaderxmlreader=xmlreaderfactory.createxmlreader();这一行代码表示创建一个xmlreader对象,这个对象用于解析xml文件。由于excel文件的内部结构实际上是xml格式,所以需要使用xmlreader来解析。67.sheethandlersheethandler=newsheethandler();和xssfsheetxmlhandlerxssfsheetxmlhandler=newxssfsheetxmlhandler(stylestable,sharedstringstable,sheethandler,false);这两行代码表示创建一个sheethandler对象,并把它注册到xssfsheetxmlhandler中。sheethandler对象是用户自定义的事件处理器,当xmlreader在解析excel文件时遇到某些事件(如开始解析一个单元格、结束解析一个单元格等)时,它就会调用sheethandler中的相应方法。68.xmlreader.setcontenthandler(xssfsheetxmlhandler);这一行代码表示把xssfsheetxmlhandler设置为xmlreader的内容处理器,这样当xmlreader在解析excel文件时就会调用xssfsheetxmlhandler以及其内部的sheethandler中的方法。69.while(sheetiterator.hasnext()){...}这一段代码表示遍历excel文件中的所有工作表,并使用xmlreader逐行读取每个工作表中的数据。70.list《elementtreedata》employeelist=sheethandler.getemployeelist();这一行代码表示获取sheethandler中存储的数据列表。这个列表中的每个元素代表了excel文件中的一行数据。71.最后两行代码表示打印了一些统计信息,如插入的总数据量等。72.总体来说,上述代码所提供的方法是打开一个excel文件,并创建一个自定义的事件处理器,然后使用事件驱动的方式逐行解析excel文件中的数据,并把这些数据存储到事件处理器中。73.以上全部实施例对excel文件的读取以及数据解析处理的全过程做了详细描述,下面继续结合前述实施例对数据解析的结果,对利用递归方法构造树形结构数据的过程及原理进行详细说明。74.在使用递归算法将数据封装成树形结构的过程中。递归通过函数自身的调用来解决问题。在本技术实施例中,需要构建一个树形结构的数据,其中根节点和非叶子节点代表目录,叶子节点代表内容。以下是本技术实施例使用递归算法构造树形结构数据的基本原理:1.当递归方法被调用时,计算机会为这个方法分配一个新的独立空间(称为栈空间),用于存储方法中的局部变量和其他数据。75.2.递归方法中的局部变量是独立的,每次调用该方法时,都会创建一个新的空间,其中的局部变量与其他调用中的局部变量互不影响。76.3.如果递归方法使用了引用类型的变量(如数组、对象),那么不同调用之间会共享这些引用类型的数据。这意味着一个方法调用对引用类型数据的修改可能影响到其他调用。77.4.递归方法必须向终止条件靠近,以防止无限递归。换句话说,在设计递归方法时,需要确保存在一个可以停止递归的条件。78.5.当递归方法执行完毕或遇到return语句时,它会返回到调用它的地方(出栈),将结果传递给调用者。当方法返回时,它在栈空间的数据也会被清除,释放内存。79.由此可见,在使用递归方法构建树形结构的过程中,递归方法为每次调用分配独立的空间,但共享引用类型的数据。为防止无限递归,需要设定适当的终止条件。当递归方法完成任务或遇到return语句时,它会返回到调用它的地方,并将结果传递给调用者。80.基于以上使用递归算法构造树形结构数据的基本原理,本技术实施例使用递归方法将数据构造成树形结构的基本流程步骤包括:步骤一:将存储在数据表中的目录以及内容数据,全部都查询出来。81.步骤二:开始遍历第一步中的数据,筛选出所有的根节点(即parentid字段值为0的节点)。82.步骤三:将第二步中的数据,根据sort字段进行排序(这里根据sort字段值进行升序),这样树的根节点顺序就会被固定了。83.步骤四:使用双层循环,第一层循环(即外层循环)开始遍历第三步中的根节点数据,第二层循环(即内层循环)遍历全量数据,并筛选出parentid等于根节点主键值的数据,即非叶子节点或叶子节点数据。84.步骤五:重复执行内层循环,直到数据成为叶子节点(即children数据为空时)停止递归,这样树形结构的数据就被构造出来了。85.在一些实施例中,利用预定的外层循环遍历根节点,以及利用预定的内层循环遍历数据列表中的全量数据,得到非叶子节点或叶子节点,包括:对根节点按照预定的外层循环进行遍历,对全量数据按照预定的内层循环进行遍历,以便筛选出父节点id对应的字段值等于当前遍历到的根节点主键值的节点,将筛选出的节点作为非叶子节点或叶子节点。86.具体地,从数据表中获取所有的数据之后,这些数据中包含目录和内容数据。遍历这些数据,筛选出所有的根节点。根节点是指那些在树形结构中位于最顶层的节点,通常由某个字段(比如“parentid”字段)标记为0或某个特定值。对这些根节点根据某个字段(比如“sort”字段)进行排序,这样就可以决定树的根节点的顺序。这个操作是为了让树形结构有一个确定的顺序。87.进一步地,使用两层循环(即外层循环和内层循环)来构建树形结构的其他部分。利用外层循环遍历根节点,利用内层循环遍历所有数据,找出那些“parentid”字段值(即父节点id对应的字段值)等于当前根节点主键值的节点,将这些节点作为非叶子节点或叶子节点。88.在一些实施例中,对于每个非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据,包括:对于每个非叶子节点,重复执行内层循环,当判断子节点列表为空时,将当前节点作为非叶子节点对应的叶子节点,停止递归,依据根节点、根节点顺序、非叶子节点以及叶子节点,构造出树形结构数据。89.具体地,对于每个非叶子节点,重复执行内层循环,找出其子节点。当找不到子节点(即子节点列表“children”为空)时,说明该节点为叶子节点,停止递归。最后,利用根节点、根节点顺序、非叶子节点以及叶子节点,将树形结构的数据构造出来。90.根据本技术实施例提供的技术方案,本技术采用一种由上到下,由外到内的方式,将平铺的数据构造成一个树形结构。每个节点都包含一个指向其子节点的链接,而子节点又可能有自己的子节点,如此递归下去,直到叶子节点。91.进一步地,在构造出树形结构数据之后,将树形结构数据拆分成父子节点关系,将父子节点关系中的目录和内容数据按照层级进行排序,将排序后的目录和内容数据进行序列化处理后存储到数据库中。例如:服务端按照excel内数据的层级,将数据拆分成一级目录、二级目录…内容节点等,然后将目录和内容按照层级排序,最后,可以使用fastjson将排序后的目录和内容数据进行序列化,并将序列化后的数据持久化到mysql数据库中(即存储到数据库中)。92.在一个示例中,本技术将基础的格式校验放在客户端,不处理数据格式,服务端解析数据格式并且入库。本技术实施例采用以下简练的数据格式:列名列说明element_uuid元素唯一idparent_id父级idtype节点类型1:目录,2:内容name节点名称,type=1时不为空level节点级别:1,2,3sort排序在一些实施例中,在将排序后的目录和内容数据进行序列化处理后存储到数据库中之后,该方法还包括:接收用户通过客户端发起的目录结构查询请求,响应于目录结构查询请求,将序列化处理后的目录和内容数据封装成树形结构数据,将树形结构数据返回给客户端,以使用户对查询到的树形结构数据进行在线编辑,以调整目录结构。93.具体地,本技术实施例支持用户通过客户端发起目录结构查询请求,服务端在接收目录结构查询请求后,利用递归算法,将序列化处理后的目录和内容数据封装成树形结构数据,即将父子节点关系拆解成树形结构的数据,并返回给客户端。用户通过客户端对查询出来的数据进行在线新增、编辑等操作,完善整棵目录树结构。94.可选地,本技术实施例对目录内容做出如下限制:对每一个目录或内容,设置一个当前节点、父节点。创建除根节点外的节点,要去判断上级接点是目录还是内容。如果是目录,则可以创建目录或内容;如果是内容,则不再允许创建内容或目录。95.下面结合具体的代码,对本技术树形结构数据处理方法中使用递归方法将数据构造成树形结构的过程及原理进行详细描述,具体可以包括以下内容:1./**2.*@authorhantao013.*@version1.04.*@date2022/7/1215:185.*/6.@data7.@apimodel(value="组件树形结构返回实体")8.publicclasselementtreedata{{48.list《elementtreedata》rootlist=newarraylist《》();49.//查找所有父节点50.for(elementtreedatadata:alllist){51.if(businessconstants.business_string_number_zero.equals(data.getparentid())){52.rootlist.add(data);53.//对父节点进行排序54.rootlist.sort(comparator.comparingdouble(elementtreedata::getid));55.}56.}57.recursionastree(alllist,rootlist);58.returnrootlist;59.}60.61./**62.*用递归方法,将list转换为树结构63.*64.*@paramalllist65.*@paramrootlist66.*/67.publicvoidrecursionastree(list《elementtreedata》alllist,list《elementtreedata》rootlist){68.for(elementtreedatadata:rootlist){69.for(elementtreedatabody:alllist){70.if(data.getelementuuid().equals(body.getparentid())){71.data.getchildren().add(body);72.}73.}74.if(collectionutils.isnotempty(data.getchildren())){75.data.getchildren().sort(comparator.comparingdouble(elementtreedata::getid));76.}77.recursionastree(alllist,data.getchildren());78.}79.}在上述代码中首先定义了一个名为elementtreedata的类,它表示组件树形结构的数据。此类包含多个属性,如id、elementuuid、type等,以及一个名为children的列表,用于存储子节点。下面对上述代码的内容进行解释:代码行6-35定义了elementtreedata类的属性,这些属性使用了@apimodelproperty注解以添加对应的描述信息。例如,属性type的描述是“1:目录,2:内容”。96.代码行37定义了一个名为children的列表,它存储了当前节点的所有子节点。97.代码行47-59定义了一个名为gettree的方法,它将传入的所有元素列表alllist转换成树形结构。首先,该方法遍历alllist,找出所有根节点(其父节点id为0的节点),并将它们添加到名为rootlist的列表中。接着,根据节点的id对rootlist进行排序。最后,调用recursionastree方法将树形结构构建出来。98.代码行67-79定义了一个名为recursionastree的方法,它使用递归算法将列表转换为树形结构。这个方法接收两个参数:一个是所有元素列表alllist,另一个是根节点列表rootlist。该方法首先遍历rootlist中的每个节点,然后再遍历alllist,如果alllist中的某个元素的父节点id等于rootlist中节点的elementuuid,那么将该元素添加到rootlist节点的子节点列表children中。接着,如果children列表不为空,根据节点的id对children列表进行排序。最后,递归调用recursionastree方法处理children列表。99.根据本技术实施例提供的技术方案,本技术通过使用opc包,表格阅读器对象,数据解析器以及事件处理器对excel文件流进行处理,可以有效地提取并解析工作表数据,避免了频繁的数据交互,从而提高了数据处理的效率。另外,通过预定的递归方法以及外层和内层循环,可以快速地构建出树形结构数据,提高了数据处理的效率。本技术还通过对树形结构数据的父子节点关系的拆分和排序,以及序列化处理后的存储,可以提高数据的存储效率和数据查询的响应速度,提高了用户的操作体验。本技术的方法可以根据用户的特殊需求进行调整,满足不同应用场景下的特殊需求,提供了定制化的服务。100.图2是本技术实施例提供的另一种树形结构数据处理方法的流程示意图。图2涉及的交互主体为客户端、服务端和数据库。如图2所示,该树形结构数据处理方法包括:s201,客户端将excel文件发送至服务端;s202,服务端基于文件流创建opc包;s203,服务端对opc包中的数据进行提取;s204,服务端创建数据解析器,为数据解析器设置事件处理器;s205,服务端对工作表数据进行解析,并生成数据列表;s206,服务端调用递归方法,对目录和内容数据进行查询,筛选出根节点,确定树形结构的根节点顺序;s207,服务端利用外层循环遍历根节点,利用内层循环遍历全量数据,得到树形结构数据;s208,服务端将树形结构数据拆分成父子节点关系,将父子节点关系中的目录和内容数据按照层级进行排序;s209,数据库获取序列化处理后的数据进行持久化存储;s210,客户端将目录结构查询请求发送至服务端;s211,服务端将将树形结构数据返回给客户端。101.本技术实施例的一种树形结构数据处理方法能够实现精练高效的数据结构与交互方式,满足定制化规则控制,并提高用户的操作体验。具体来说,本技术的技术方案具有以下显著的技术效果:通过对excel文件流的处理,通过创建opc包、数据提取的表格阅读器对象、数据解析器以及事件处理器,实现对工作表数据的逐行读取与解析,大大提高了数据处理的效率。此外,通过预定的递归方法以及外层和内层循环,能够快速地构建出树形结构数据,从而提高数据处理效率。102.通过对树形结构数据的父子节点关系的拆分和排序,以及序列化处理后的存储,提高了数据的存储效率和数据查询的响应速度。在用户发起目录结构查询请求时,可以快速返回查询到的树形结构数据,以供用户进行在线编辑,从而提高了数据查询和操作的效率。103.根据用户的特殊需求,例如节点树的深度限制、节点的类型以及每个节点下能添加的子节点的规则等,本发明的方法可以进行相应的调整,以满足不同应用场景下的特殊需求。104.下述为本技术装置实施例,可以用于执行本技术方法实施例。对于本技术装置实施例中未披露的细节,请参照本技术方法实施例。105.图3是本技术实施例提供的树形结构数据处理装置的结构示意图。如图3所示,该树形结构数据处理装置包括:创建模块301,被配置为依据用户通过客户端上传的excel文件获取文件流,基于文件流创建一个opc包,opc包提供用于访问和操作opc包中的文件流的接口;提取模块302,被配置为创建用于数据提取的表格阅读器对象,利用表格阅读器对象对opc包中的数据进行提取,得到共享字符串表、样式信息以及工作表数据;设置模块303,被配置为创建用于解析工作表数据的数据解析器,并为数据解析器设置事件处理器,将事件处理器的参数发送给事件驱动处理器,利用事件驱动处理器对工作表数据进行逐行读取并解析;解析模块304,被配置为在利用事件驱动处理器逐行读取并解析工作表数据的过程中,依据事件触发与事件相关联的事件处理器对工作表数据进行解析,将解析后的数据存储到事件处理器中,并生成数据列表;调用模块305,被配置为对预定的递归方法进行调用,递归方法用于对数据列表中的目录和内容数据进行查询,并且遍历目录和内容数据,以筛选出所有的根节点,对根节点进行排序,以确定树形结构的根节点顺序;遍历模块306,被配置为利用预定的外层循环遍历根节点,以及利用预定的内层循环遍历数据列表中的全量数据,得到非叶子节点或叶子节点,对于每个非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据;存储模块307,被配置为将树形结构数据拆分成父子节点关系,将父子节点关系中的目录和内容数据按照层级进行排序,将排序后的目录和内容数据进行序列化处理后存储到数据库中。106.在一些实施例中,图3的创建模块301获取用户通过客户端上传的excel文件,将excel文件转换成文件流,将文件流作为参数输入到预设的opcpackage类的方法中,以使opcpackage类创建一个opc包;其中,excel文件中包含目录、内容以及内容类型,opc包为opcpackage对象。107.在一些实施例中,图3的设置模块303在为数据解析器设置事件处理器之后,将事件处理器注册到工作表的xml处理器对象中,并将工作表的xml处理器对象设置为数据解析器的内容处理器,当数据解析器在解析excel文件时,调用工作表的xml处理器对象,遍历excel文件中的所有工作表,并利用数据解析器逐行读取每个工作表中的数据。108.在一些实施例中,图3的解析模块304在依据事件触发逐行读取并解析工作表数据时,创建元素树数据对象,其中,元素树数据对象用于对excel文件中的每一行数据进行封装;在对每一行数据中的每一个单元格进行解析时,根据单元格的名称,将单元格对应的数据保存到元素树数据对象的相应属性中;在结束对一行数据的解析之后,将当前封装了一行数据的元素树数据对象添加到列表中,对列表的大小进行检查,当列表的大小达到预设阈值时,执行一次数据插入操作,并清空列表;其中,事件包括开始解析一行数据、结束解析一行数据、解析单元格以及结束解析单元格。109.在一些实施例中,图3的遍历模块306对根节点按照预定的外层循环进行遍历,对全量数据按照预定的内层循环进行遍历,以便筛选出父节点id对应的字段值等于当前遍历到的根节点主键值的节点,将筛选出的节点作为非叶子节点或叶子节点。110.在一些实施例中,图3的遍历模块306对于每个非叶子节点,重复执行内层循环,当判断子节点列表为空时,将当前节点作为非叶子节点对应的叶子节点,停止递归,依据根节点、根节点顺序、非叶子节点以及叶子节点,构造出树形结构数据。111.在一些实施例中,图3的封装模块308在将排序后的目录和内容数据进行序列化处理后存储到数据库中之后,接收用户通过客户端发起的目录结构查询请求,响应于目录结构查询请求,将序列化处理后的目录和内容数据封装成树形结构数据,将树形结构数据返回给客户端,以使用户对查询到的树形结构数据进行在线编辑,以调整目录结构。112.应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本技术实施例的实施过程构成任何限定。113.图4是本技术实施例提供的电子设备4的结构示意图。如图4所示,该实施例的电子设备4包括:处理器401、存储器402以及存储在该存储器402中并且可以在处理器401上运行的计算机程序403。处理器401执行计算机程序403时实现上述各个方法实施例中的步骤。或者,处理器401执行计算机程序403时实现上述各装置实施例中各模块/单元的功能。114.示例性地,计算机程序403可以被分割成一个或多个模块/单元,一个或多个模块/单元被存储在存储器402中,并由处理器401执行,以完成本技术。一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述计算机程序403在电子设备4中的执行过程。115.电子设备4可以是桌上型计算机、笔记本、掌上电脑及云端服务器等电子设备。电子设备4可以包括但不仅限于处理器401和存储器402。本领域技术人员可以理解,图4仅仅是电子设备4的示例,并不构成对电子设备4的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如,电子设备还可以包括输入输出设备、网络接入设备、总线等。116.处理器401可以是中央处理单元(centralprocessingunit,cpu),也可以是其它通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其它可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。117.存储器402可以是电子设备4的内部存储单元,例如,电子设备4的硬盘或内存。存储器402也可以是电子设备4的外部存储设备,例如,电子设备4上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,存储器402还可以既包括电子设备4的内部存储单元也包括外部存储设备。存储器402用于存储计算机程序以及电子设备所需的其它程序和数据。存储器402还可以用于暂时地存储已经输出或者将要输出的数据。118.所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本技术的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。119.在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。120.本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。121.在本技术所提供的实施例中,应该理解到,所揭露的装置/计算机设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/计算机设备实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。122.作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。123.另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。124.集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读存储介质中。基于这样的理解,本技术实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,计算机程序可以存储在计算机可读存储介质中,该计算机程序在被处理器执行时,可以实现上述各个方法实施例的步骤。计算机程序可以包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。计算机可读介质可以包括:能够携带计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、电载波信号、电信信号以及软件分发介质等。需要说明的是,计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如,在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。125.以上实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的精神和范围,均应包含在本技术的保护范围之内。当前第1页12当前第1页12
技术特征:
1.一种树形结构数据处理方法,其特征在于,包括:依据用户通过客户端上传的excel文件获取文件流,基于所述文件流创建一个opc包,所述opc包提供用于访问和操作opc包中的所述文件流的接口;创建用于数据提取的表格阅读器对象,利用所述表格阅读器对象对所述opc包中的数据进行提取,得到共享字符串表、样式信息以及工作表数据;创建用于解析所述工作表数据的数据解析器,并为所述数据解析器设置事件处理器,将所述事件处理器的参数发送给事件驱动处理器,利用所述事件驱动处理器对所述工作表数据进行逐行读取并解析;在利用所述事件驱动处理器逐行读取并解析所述工作表数据的过程中,依据事件触发与所述事件相关联的所述事件处理器对所述工作表数据进行解析,将解析后的数据存储到所述事件处理器中,并生成数据列表;对预定的递归方法进行调用,所述递归方法用于对所述数据列表中的目录和内容数据进行查询,并且遍历所述目录和内容数据,以筛选出所有的根节点,对所述根节点进行排序,以确定树形结构的根节点顺序;利用预定的外层循环遍历所述根节点,以及利用预定的内层循环遍历所述数据列表中的全量数据,得到非叶子节点或叶子节点,对于每个所述非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据;将所述树形结构数据拆分成父子节点关系,将所述父子节点关系中的所述目录和内容数据按照层级进行排序,将排序后的所述目录和内容数据进行序列化处理后存储到数据库中。2.根据权利要求1所述的方法,其特征在于,所述依据用户通过客户端上传的excel文件获取文件流,基于所述文件流创建一个opc包,包括:获取所述用户通过客户端上传的excel文件,将所述excel文件转换成所述文件流,将所述文件流作为参数输入到预设的opcpackage类的方法中,以使所述opcpackage类创建一个opc包;其中,所述excel文件中包含目录、内容以及内容类型,所述opc包为opcpackage对象。3.根据权利要求1所述的方法,其特征在于,在为所述数据解析器设置事件处理器之后,所述方法还包括:将所述事件处理器注册到工作表的xml处理器对象中,并将工作表的xml处理器对象设置为所述数据解析器的内容处理器,当所述数据解析器在解析excel文件时,调用工作表的xml处理器对象,遍历excel文件中的所有工作表,并利用所述数据解析器逐行读取每个工作表中的数据。4.根据权利要求3所述的方法,其特征在于,所述依据事件触发与所述事件相关联的所述事件处理器对所述工作表数据进行解析,包括:在依据所述事件触发逐行读取并解析所述工作表数据时,创建元素树数据对象,其中,所述元素树数据对象用于对excel文件中的每一行数据进行封装;在对每一行数据中的每一个单元格进行解析时,根据所述单元格的名称,将所述单元格对应的数据保存到所述元素树数据对象的相应属性中;在结束对一行数据的解析之后,将当前封装了一行数据的元素树数据对象添加到列表
中,对所述列表的大小进行检查,当所述列表的大小达到预设阈值时,执行一次数据插入操作,并清空列表;其中,所述事件包括开始解析一行数据、结束解析一行数据、解析单元格以及结束解析单元格。5.根据权利要求1所述的方法,其特征在于,所述利用预定的外层循环遍历所述根节点,以及利用预定的内层循环遍历所述数据列表中的全量数据,得到非叶子节点或叶子节点,包括:对所述根节点按照预定的所述外层循环进行遍历,对所述全量数据按照预定的所述内层循环进行遍历,以便筛选出父节点id对应的字段值等于当前遍历到的根节点主键值的节点,将筛选出的节点作为所述非叶子节点或叶子节点。6.根据权利要求5所述的方法,其特征在于,所述对于每个所述非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据,包括:对于每个所述非叶子节点,重复执行所述内层循环,当判断子节点列表为空时,将当前节点作为所述非叶子节点对应的叶子节点,停止递归,依据所述根节点、所述根节点顺序、所述非叶子节点以及所述叶子节点,构造出所述树形结构数据。7.根据权利要求1所述的方法,其特征在于,在所述将排序后的所述目录和内容数据进行序列化处理后存储到数据库中之后,所述方法还包括:接收所述用户通过客户端发起的目录结构查询请求,响应于所述目录结构查询请求,将序列化处理后的目录和内容数据封装成树形结构数据,将树形结构数据返回给客户端,以使所述用户对查询到的树形结构数据进行在线编辑,以调整目录结构。8.一种树形结构数据处理装置,其特征在于,包括:创建模块,被配置为依据用户通过客户端上传的excel文件获取文件流,基于所述文件流创建一个opc包,所述opc包提供用于访问和操作opc包中的所述文件流的接口;提取模块,被配置为创建用于数据提取的表格阅读器对象,利用所述表格阅读器对象对所述opc包中的数据进行提取,得到共享字符串表、样式信息以及工作表数据;设置模块,被配置为创建用于解析所述工作表数据的数据解析器,并为所述数据解析器设置事件处理器,将所述事件处理器的参数发送给事件驱动处理器,利用所述事件驱动处理器对所述工作表数据进行逐行读取并解析;解析模块,被配置为在利用所述事件驱动处理器逐行读取并解析所述工作表数据的过程中,依据事件触发与所述事件相关联的所述事件处理器对所述工作表数据进行解析,将解析后的数据存储到所述事件处理器中,并生成数据列表;调用模块,被配置为对预定的递归方法进行调用,所述递归方法用于对所述数据列表中的目录和内容数据进行查询,并且遍历所述目录和内容数据,以筛选出所有的根节点,对所述根节点进行排序,以确定树形结构的根节点顺序;遍历模块,被配置为利用预定的外层循环遍历所述根节点,以及利用预定的内层循环遍历所述数据列表中的全量数据,得到非叶子节点或叶子节点,对于每个所述非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据;存储模块,被配置为将所述树形结构数据拆分成父子节点关系,将所述父子节点关系中的所述目录和内容数据按照层级进行排序,将排序后的所述目录和内容数据进行序列化
处理后存储到数据库中。9.一种电子设备,包括存储器,处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如权利要求1至7中任一项所述的方法。10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7中任一项所述的方法。

技术总结
本申请提供一种树形结构数据处理方法、装置、电子设备及存储介质。该方法包括:基于文件流创建一个OPC包,创建表格阅读器对象,利用表格阅读器对象对OPC包中的数据进行提取;创建数据解析器,为数据解析器设置事件处理器,将事件处理器的参数发送给事件驱动处理器;依据事件触发事件处理器对工作表数据进行解析,将解析后的数据存储到事件处理器中;遍历数据列表中的目录和内容数据,筛选出根节点,确定树形结构的根节点顺序;利用外层循环遍历根节点,利用内层循环遍历全量数据,得到非叶子节点或叶子节点,对于每个非叶子节点,重复执行内层循环直至找到叶子节点,得到树形结构数据。本申请能够快速地构建出树形结构数据,从而提高数据处理效率。而提高数据处理效率。而提高数据处理效率。


技术研发人员:吴亚军 韩涛
受保护的技术使用者:深圳须弥云图空间科技有限公司
技术研发日:2023.06.14
技术公布日:2023/7/22
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐