一种导出excel文件的方法、装置、电子设备及存储介质
文献发布时间:2023-06-19 11:29:13
技术领域
本发明涉及计算机技术领域,特别涉及一种导出excel文件的方法、装置、电子设备及计算机可读存储介质。
背景技术
许多系统都有数据导出excel文件的功能,在导出的数据量较小的情况下,资源消耗以及处理耗时并没有很明显的瓶颈,但是当导出的数据量达到量百兆以上,性能问题就显得十分突出。
相关技术中是通过JXLS类库的方式,先将所有数据加载到内存,然后再将内存里面的数据生成文件,由于内存资源有限,且数据量过大,导致无法及时回收系统内存,使系统内存耗尽,导致计算机宕机,用户使用体验较差。
发明内容
有鉴于此,本发明的目的在于提供一种导出excel文件的方法、装置、电子设备及计算机可读存储介质,能够有效减小占用的系统内存,减少了内存资源消耗,同时提高了导出excel文件的效率。其具体方案如下:
第一方面,本申请公开了一种导出excel文件的方法,包括:
创建工作表,并设置所述工作表的最大数据行数为指定行数;
将获取的用户工作表的数据加载至所述指定行数的工作表,并渲染所述数据;
将渲染好的所述数据刷新至磁盘,并动态更新所述工作表;
当所述用户工作表的所有数据刷新结束后,从所述磁盘中导出excel文件。
可选的,将渲染好的所述数据刷新至磁盘,并动态更新所述工作表,包括:
若当前所述工作表中的数据行数达到所述指定行数时,按照索引值从低到高的行顺序,将渲染好的行数据刷新至所述磁盘;
删除已刷新的所述行数据,并加载所述用户工作表的下一行数据至所述工作表。
可选的,所述将渲染好的所述数据刷新至磁盘,并动态更新所述工作表之前,还包括:
判断当前所述工作表中的数据行数是否达到所述指定行数;
若是,则执行所述将渲染好的所述数据刷新至磁盘,并动态更新所述工作表的步骤;
若否,则继续加载所述用户工作表的数据至所述工作表。
可选的,若当前所述工作表的数据行数未达到所述指定行数时,则继续加载所述用户工作表的数据至所述工作表之前,还包括:
判断所述用户工作表的数据是否全部渲染结束;
若是,则执行所述将渲染好的所述数据刷新至磁盘,并动态更新所述工作表的步骤;
若否,则执行所述若当前所述工作表的数据行数未达到所述指定行数,则继续加载所述用户工作表的数据至所述工作表的步骤。
可选的,所述将获取的用户工作表的数据加载至所述指定行数的工作表,并渲染所述数据,包括:
将所述用户工作表的数据加载至所述指定行数的工作表,并识别所述数据加载至所述工作表的单元格;
对所述单元格进行格式渲染。
可选的,从所述磁盘中导出excel文件之前,还包括:
判断获取的所述用户工作表中是否有待渲染的用户工作表;
若是,则继续创建工作表,并执行后续操作;
若否,则执行所述从所述磁盘中导出excel文件的步骤。
第二方面,本申请公开了一种导出excel文件的装置,包括:
创建模块,用于创建工作表,并设置所述工作表的最大数据行数为指定行数;
渲染模块,用于将获取的用户工作表的数据加载至所述指定行数的工作表,并渲染所述数据;
刷新模块,用于将渲染好的所述数据刷新至磁盘,并动态更新所述工作表;
导出模块,用于当所述用户工作表的所有数据刷新结束后,从所述磁盘中导出excel文件。
可选的,所述刷新模块,包括:
刷新单元,用于若当前所述工作表中的数据行数达到所述指定行数时,按照索引值从低到高的行顺序,将渲染好的行数据刷新至所述磁盘;
删除单元,用于删除已刷新的所述行数据,并加载所述用户工作表的下一行数据至所述工作表。
第三方面,本申请公开了一种电子设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现如上述导出excel文件的方法的步骤。
第四方面,本申请公开一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上述导出excel文件的方法的步骤。
本申请提供一种导出excel文件的方法,包括:创建工作表,并设置所述工作表的最大数据行数为指定行数;将获取的用户工作表的数据加载至所述指定行数的工作表,并渲染所述数据;将渲染好的所述数据刷新至磁盘,并动态更新所述工作表;当所述用户工作表的所有数据刷新结束后,从所述磁盘中导出excel文件。
可见,本申请通过设置工作表的最大行数为指定行数,将用户工作表的数据加载到该工作表,并进行渲染,再将渲染好的数据刷新至磁盘,当用户工作表的所有数据刷新结束后,就可导出excel文件;即当前内存中的工作表最大数据行数为指定行数,当用户工作表的数据加载并渲染后占用内存的最大数据量仅为指定行数,占用内存有限,能够有效减小占用的系统内存,避免了相关技术中将所有数据加载至内存并全部渲染,内存占用巨大,导致宕机的现象,减少了内存资源消耗,同时提高了导出excel文件的效率。本申请同时还提供了一种导出excel文件的装置、一种电子设备和计算机可读存储介质,具有上述有益效果,在此不再赘述。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例所提供的一种导出excel文件的方法的流程图;
图2为本申请实施例所提供的一种具体的导出excel文件的工作流程图;
图3为本申请实施例提供的一种导出excel文件的装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在常见的导出excel文件的方法中,大多通过JXLS类库,使用特殊标记在Excel模板中定义输出格式和数据布局进行数据导出为Excel,其中,JXLS是用于生成Excel报表的小型Java类库。这种通过JXLS模板导出excel文件的方式主要存在两个严重问题:一是计算机处理过程中对内存资源的消耗非常的大。每个进程在写Excel文件时,都是先将数据加载到内存,然后再将内存里面的数据生成文件;由于计算机的内存资源是有限的,因此在单个进程任务的数据量过大,将导致无法及时回收系统内存,最终导致系统内存耗尽。二是处理的数据数据量较大时耗时太久。JXLS模板导出Excel过程中经常会对单元格设置属性以及各种样式。当数据量很大,Excel行数很多(比如百兆以上、几十万行)的时候,每次对单元格进行样式、属性设置的时候会耗费很长的时间。而且在使用过程中经常会对无关的单元格设置属性。例如:一个EXCEL工作表的最大列数为256,仅使用10列,但是编程时经常会将256列全部渲染,在格式渲染的时候不仅造成额外的时间开销,还造成很大的资源浪费。
基于上述技术问题,本实施例提供一种导出excel文件的方法,减少了内存资源消耗,同时提高了导出excel文件的效率,具体请参考图1,图1为本申请实施例所提供的一种导出excel文件的流程图,具体包括:
S101:创建工作表,并设置工作表的最大数据行数为指定行数。
本实施例中创建工作表,并初始化设置该工作表的最大数据行数为指定行数,本实施例并不限定指定行数的具体大小,可以是100行,可以是200行,可根据实际需求进行设定。本实施例并不限定上述创建工作表并初始化指定行数的具体过程,可以是先通过工作簿模型创建一个工作簿,然后初始化该工作表的最大数据行数为指定行数,在该工作簿中创建工作表,该工作表的最大数据行数即为指定行数。
S102、将获取的用户工作表的数据加载至指定行数的工作表,并渲染数据。
可以理解的是,将用户工作表中的数据加载到指定行数的工作表,加载的数据行数可以达到指定行数,也可以未达到指定行数,根据用户工作表的数据量大小而定。本实施例并不限定用户工作表的具体个数,可以是一个,可以是多个,根据实际情况而定。本实施例中的渲染即为格式渲染,对数据所在单元格设置属性和样式,如单元格宽度、高度等。可以理解的是,本实施例中将用户工作表的数据加载到工作表并进行渲染的过程可以是,创建行,将用户工作表的数据加载到行,并进行渲染;创建行,加载下一行用户工作表的数据,进行渲染,依次类推,直到存储的数据行数达到指定行数。本实施例并不限定渲染的范围,可以是将指定行数的所有单元格全部进行渲染,也可以是只渲染存在数据的单元格,可根据实际情况进行设定。
在一种具体的实施例中,为了节省非必要单元格进行格式渲染的时间开销,本实施例中将获取的用户工作表的数据加载至指定行数的工作表,并渲染数据,可以包括:
将用户工作表的数据加载至指定行数的工作表,并识别数据加载至工作表的单元格;
对单元格进行格式渲染。
即,本实施例中将用户工作表的数据加载到指定行数的工作表后,识别数据所在单元格,只对存在数据的单元格进行格式渲染,不对非必要的单元格进行格式渲染,节省了非必要单元格进行格式渲染的时间开销。
S103、将渲染好的数据刷新至磁盘,并动态更新工作表。
本实施例中将渲染好的数据刷新到磁盘,也就是将渲染好的数据写入磁盘。并实施例并不限定动态更新工作表的具体过程,可根据实际情况进行动态更新。例如,当用户工作表的数据加载到指定行数的工作表的数据量达到指定行数时,此时将最先加载到工作表的行数据即索引值最低的行数据刷新到磁盘,并删除该行数据,剩余行数据向上移动一行,即对应的索引值减1,并将用户工作表的下一行数据继续加载到工作表,并进行渲染,即完成一次动态更新,循环上述过程直到用户工作表中的数据全部渲染刷新结束。还可以是,当用户工作表的数据量较小时,即加载到工作表的数据的行数还未达到指定行数时,已全部加载完毕,此时,只需要按照索引值从小到大的顺序,一次将渲染好的数据刷新到磁盘,并依次删除各个行的数据即可。
在一种具体的实施例中,将渲染好的数据刷新至磁盘,并动态更新工作表,可以包括:
若当前工作表中的数据行数达到指定行数时,按照索引值从低到高的行顺序,将渲染好的行数据刷新至磁盘;
删除已刷新的行数据,并加载用户工作表的下一行数据至工作表。
即本实施例中当前加载到工作表的数据行数达到指定行数时,按照索引值从小到大的行顺序,将渲染好的行数据刷新到磁盘,并删除已刷新的行数据,然后,继续加载用户工作表的下一行数据到工作表。可以得出当前内存存储的最大数据行数为指定行数,即限制了当前占用内存的最大数据量,有效减小了内存占用,避免了相关技术中将用户工作表的所有数据均加载到内存并进行渲染,占用内存量巨大,导致计算机产生宕机的情况。
在一种具体的实施例中,为了提高了数据刷新效率,提高了导出excel文件的速率,本实施例中将渲染好的数据刷新至磁盘,并动态更新工作表之前,还可以包括:
判断当前工作表中的数据行数是否达到指定行数;
若是,则执行将渲染好的数据刷新至磁盘,并动态更新工作表的步骤;
若否,则继续加载用户工作表的数据至工作表。
即,将用户工作表的数据加载到工作表并进行渲染后,先判断当前工作表的数据行数是否达到指定行数,若达到时,再执行将渲染好的数据刷新到磁盘,并动态更新工作表的步骤;若未达到指定行数时,则继续加载用户工作表的数据到工作表,直到达到工作表的最大数据行数。即可以使计算机按照这种机制即达到指定行数时,再刷新数据到磁盘,可以避免因未设定小数据刷新的时机而导致混乱的现象,提高了数据刷新效率,提高了导出excel文件的速率。
在一种具体的实施例中,为了减少不必要的时间消耗,提升数据刷新的效率,本实施例中若当前工作表的数据行数未达到指定行数时,则继续加载用户工作表的数据至工作表之前,还可以包括:
判断用户工作表的数据是否全部渲染结束;
若是,则执行将渲染好的数据刷新至磁盘,并动态更新工作表的步骤;
若否,则执行若当前工作表的数据行数未达到指定行数,则继续加载用户工作表的数据至工作表的步骤。
即,若当前工作表的数据行数未达到指定行数时,再继续加载用户工作表的数据到工作表之前,还需判断用户工作表的数据是否全部渲染完毕,若用户工作表的数据已经全部加载并渲染结束,则直接将渲染好的数据刷新到磁盘,并动态更新工作表;若用户工作表的数据未全部渲染结束,再执行继续加载用户工作表的数据到工作表的步骤。通过加入用户工作表的数据是否全部渲染结束的判断过程,可以避免虽然当前工作表的数据行数未达到指定行数,但是用户工作表的数据已全部渲染结束,再进行不必要的数据加载渲染的过程,减少了不必要的时间消耗,提升了数据刷新的效率。
S104、当用户工作表的所有数据刷新结束后,从磁盘中导出excel文件。
可以理解的是,当用户工作表中的所有数据均刷新到磁盘后,即可从磁盘中导出excel文件。在一种具体的实施例中,为了保证导出excel文件的完整性,本实施例中从磁盘中导出excel文件之前,还可以包括:
判断获取的用户工作表中是否有待渲染的用户工作表;
若是,则继续创建工作表,并执行后续操作;
若否,则执行从磁盘中导出excel文件的步骤。
即,通过判断用户工作表中是否还有遗漏的即待渲染的用户工作表,若有,则继续创建工作表,并执行后续的操作;若没有,即所有的用户工作表均已刷新到磁盘,即可执行从磁盘中导出excel文件的步骤。可以防止出现遗漏用户工作表而导致生产的excel文件不完整的现象,保证了导出excel文件的完整性。
基于上述技术方案,本实施例通过设置工作表的最大行数为指定行数,可使当前内存中的工作表最大数据行数为指定行数,当用户工作表的数据加载并渲染后占用内存的最大数据量仅为指定行数,占用内存有限,能够有效减小占用的系统内存,避免了相关技术中将所有数据加载至内存并全部渲染,内存占用巨大,导致宕机的现象,减少了内存资源消耗,同时提高了导出excel文件的效率。
以下提供一种具体的实施例,基于Apache POI提供的函数库基础,一种超大量数据导出excel文件的方法,其中,Apache POI是Apache软件基金会的开放源码函数库,POI提供API给Java程序对Microsoft Excel格式文案读和写的功能。能够在保存渲染格式的基础上节省计算机内存资源,并提高处理效率。图2为本实施例所提供的一种具体的导出excel文件的流程图,具体工作流程如下:
1、通过工作簿模型创建一个工作簿,初始化工作簿即设置内存中存储的数据行数为指定行数。
工作簿模型是工作簿的高级表现形式,是工作表的上级对象。一个excel就是一个工作簿,一个工作簿含有多个工作表。其中,工作表由表头单元格列表、表体内容数据以及一些基本样式(冻结表头行等)组成。表头单元格模型是excel文件中的一个工作表表头的基本组成单位,一个表头单元格模型存储着这个单元格的数据内容、表头的基本样式(隐藏该表头单元格所在列等)以及精确的位置信息(行、列坐标以及行合并、列合并单元格信息),可以唯一表示当前工作表的该单元格。表头单元格列表是一个工作表表头单元格的集合,由它们组成了一个工作表的表头各行。表体内容数据列表与表头行对应,存储了一个工作表表头代表的一列数据内容。
在创建工作簿时,设定存储在内存中的最大数据行数为指定行数,即该模型通过设定数据行数来限制存储在内存中的数据量,即每次最多只存储内存指定行数的数据,这样内存的占用就极大减少。
2、根据用户上传的用户工作表列表循环创建工作表,其中,工作表列表中包含多个工作表。
3、为工作表创建表头、创建行,并判断当前内存中存储的数据行数是否达到初始的限制即指定行数;若达到指定行数,则将内存中最先创建的行数据刷新到磁盘中,若未超过则继续创建行。
用户通过代码在创建行,并加载新的行数据到内存并完成渲染,当前内存的数据行数达到指定行数,那么从索引值最低的行被刷新到磁盘,不再占用内存,通过这样的机制始终保证内存的占用为较小的值即最多占用指定行数的内存。比如指定行数为100的工作表。当数据行数达到101时,rownum=0的行被刷新到磁盘并从内存中删除,当rownum达到102时,rownum=1的行被刷新,以此类推。
4、判断该工作表的数据是否渲染完成,若未渲染完成则继续创建行;若渲染完毕,则判断工作表列表是否还有待渲染的用户工作表,若仍有待渲染的用户工作表,则继续执行步骤2;若无待渲染的用户工作表,则用户工作表列表的所有数据全部渲染完成。
5、导出excel文件。
基于上述技术方案,本实施例中舍弃JXLS模板,通过自定义格式及数据模型来实现。在写excel文件时,不把用户工作表的所有数据同时加载到内存中,通过I/O流进行边读边写,始终保持只有部分数据在内存中,前边写操作完成的数据渲染到磁盘中。这种处理方式相较于,JXLS模板导出excel方案中将所有数据都加载到内存并渲染的实现方式,大大的节省了内存开销。且在生成Excel文件时,只对存在数据的单元格进行格式渲染,节省对非必要的单元格进行格式渲染所造成的时间开销。
下面对本申请实施例提供的一种导出excel文件的装置进行介绍,下文描述的导出excel文件的装置与上文描述的导出excel文件的方法可相互对应参照,相关模块均设置于中,参考图3,图3为本申请实施例所提供的一种导出excel文件的装置的结构示意图,包括:
在一些具体的实施例中,具体包括:
创建模块301,用于创建工作表,并设置工作表的最大数据行数为指定行数;
渲染模块302,用于将获取的用户工作表的数据加载至指定行数的工作表,并渲染数据;
刷新模块303,用于将渲染好的数据刷新至磁盘,并动态更新工作表;
导出模块304,用于当用户工作表的所有数据刷新结束后,从磁盘中导出excel文件。
在一些具体的实施例中,刷新模块303,包括:
刷新单元,用于若当前工作表中的数据行数达到指定行数时,按照索引值从低到高的行顺序,将渲染好的行数据刷新至磁盘;
删除单元,用于删除已刷新的行数据,并加载用户工作表的下一行数据至工作表。
在一些具体的实施例中,还包括:
第一判断模块,用于判断当前工作表中的数据行数是否达到指定行数。
在一些具体的实施例中,还包括:
第二判断模块,用于判断用户工作表的数据是否全部渲染结束;
在一些具体的实施例中,渲染模块302,包括:
识别单元,用于将用户工作表的数据加载至指定行数的工作表,并识别数据加载至工作表的单元格;
渲染单元,用于对单元格进行格式渲染。
在一些具体的实施例中,还包括:
第三判断模块,用于判断获取的用户工作表中是否有待渲染的用户工作表。
由于导出excel文件的装置部分的实施例与导出excel文件的方法部分的实施例相互对应,因此导出excel文件的装置部分的实施例请参见导出excel文件的方法部分的实施例的描述,这里暂不赘述。
下面对本申请实施例提供的一种电子设备进行介绍,下文描述的电子设备与上文描述的特征量化方法可相互对应参照。
本申请提供一种电子设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行计算机程序时实现如上述导出excel文件的方法的步骤。
由于电子设备部分的实施例与导出excel文件的方法部分的实施例相互对应,因此电子设备部分的实施例请参见导出excel文件的方法部分的实施例的描述,这里暂不赘述。
本申请还公开了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述导出excel文件的方法的步骤。
由于计算机可读存储介质部分的实施例与特征量化方法部分的实施例相互对应,因此计算机可读存储介质部分的实施例请参见导出excel文件的方法部分的实施例的描述,这里暂不赘述。
说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上对本申请所提供的一种导出excel文件的方法、装置、电子设备及计算机可读存储介质进行了详细介绍。本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。
- 一种导出excel文件的方法、装置、电子设备及存储介质
- 大数据量Excel文件导出方法、装置、计算机设备及存储介质