CN110457376B - 基于jexl和poi的报表生成方法 - Google Patents
基于jexl和poi的报表生成方法 Download PDFInfo
- Publication number
- CN110457376B CN110457376B CN201910737693.5A CN201910737693A CN110457376B CN 110457376 B CN110457376 B CN 110457376B CN 201910737693 A CN201910737693 A CN 201910737693A CN 110457376 B CN110457376 B CN 110457376B
- Authority
- CN
- China
- Prior art keywords
- row
- cells
- column
- current
- content
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/248—Presentation of query results
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明提供了一种基于JEXL和POI的报表生成方法,包括:获取模板文档,所述模板文档具有多个单元格,至少部分单元格中记载有对应的指令;通过JEXL执行各单元格中记载的至少部分指令,得到对应的变量值,并利用所述变量值替换所述单元格中记载的指令;通过Apache POI对变量值替换后的模板文档进行文档结构的重构;所述文档结构用于表征所述模板文档中单元格的分布方式;根据重构后的模板文档,输出最终的报表。本发明可避免人为直接对报表进行填写、修改等处理,有效提高了处理效率。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种基于JEXL和POI的报表生成方法。
背景技术
报表,可理解为报表用表格、图表等格式来动态显示数据的方式。人们可利用计算机处理数据和界面设计的功能来生成、展示报表。计算机上的报表的主要特点是数据动态化,格式多样化,并且实现报表数据和报表格式的完全分离,用户可以只修改数据,或者只修改格式。
现有相关技术中,常用的报表具有很强的专业性,不同应用场景,会有差异化的报表需求,若仍由用户来执行修改,其工作量繁复,效率低下。
发明内容
本发明提供一种基于JEXL和POI的报表生成方法,以解决工作量繁复,效率低下的问题。
根据本发明的第一方面,提供了一种基于JEXL和POI的报表生成方法,包括:
获取模板文档,所述模板文档具有多个单元格,至少部分单元格中记载有对应的指令;
通过JEXL执行各单元格中记载的至少部分指令,得到对应的变量值,并利用所述变量值替换所述单元格中记载的指令;
通过Apache POI对变量值替换后的模板文档进行文档结构的重构;所述文档结构用于表征所述模板文档中单元格的分布方式;
根据重构后的模板文档,输出最终的报表。
可选的,所述变量值是通过以下至少之一方式得到的:
通过对应指令的执行,直接获取到的;
通过对应指令的执行,在预设的条件达成时获取到的;
通过对应指令的执行,循环式变化而确定的;
通过对应指令的执行,根据该指令对应的自定义函数获取到的。
可选的,若所述变量值是通过对应指令的执行,根据自定义函数而获取到的,则:
通过JEXL执行各单元格中记载的指令,得到对应的当前变量值,包括:
自所述模板文档中提取所述自定义函数的函数表达式;
根据存储于预设的Jexl Context对象中的函数输入值,利用JEXL执行对应的函数表达式的逻辑,得到对应的函数返回值作为所述当前变量值。
可选的,通过Apache POI对当前变量值替换后的模板文档进行文档结构的重构,包括:
通过所述Apache POI将图片填充至所述模板文档中的对应位置;
通过所述Apache POI对所述模板文档中的至少部分单元格进行合并。
可选的,通过所述Apache POI对所述模板文档中的至少部分单元格进行合并,包括:
若单元格中的内容中记载有合并指令,则将该单元格的列号记录于待垂直合并列号集合中;
根据所述待垂直合并列号集合,通过所述Apache POI进行单元格的垂直合并。
可选的,根据所述待垂直合并列号集合,通过所述Apache POI进行单元格的垂直合并,包括:
根据所述待垂直合并列号集合中的列号,逐列遍历各列单元格;
针对每一个当前列,逐行遍历各行单元格;
若需合并所述当前列的部分单元格,则根据当前的起始行号与截止行号,通过所述Apache POI对所述当前列的部分单元格进行合并。
可选的,针对每一个当前列,逐行遍历各行单元格时,包括:
若第N行中单元格的数量不小于所述当前列的列号,且所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号不为预设值,则确定所述起始行号保持不变,且所述截止行号加一;
若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号为预设值,则将所述起始行号与所述截止行号置为N;
若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI对所述当前列中对应的多个单元格进行合并,然后将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号为所述预设值,则将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
若第N行单元格的数量小于所述当前列的列号,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI对所述当前列中对应的多个单元格进行合并,并在合并后将所述起始行号与所述截止行号置为所述预设值;
若第N行中单元格的数量小于所述当前列的列号,且当前的起始行号不小于截止行号,则继续遍历下一行单元格。
可选的,针对每一个当前列,逐行遍历各行单元格时,还包括:
针对所述当前列遍历完所有行时,若当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过所述Apache POI对所述当前列中对应的多个单元格进行合并。
可选的,针对每一个当前列,逐行遍历各行单元格时,还包括:
针对于所述当前行,若第M行单元格的内容为null,则将所述第M行单元格的内容赋值为空,以使得连续的多个赋值为空的单元格能够通过所述Apache POI被合并。
可选的,所述预设值为-1。
本发明提供的基于JEXL和POI的报表生成方法中,基于模板文档,能够通过设置的指令进行数据替换和文档结构重构来生成最终的报表,其中的数据替换可利用JEXL实现,其中的文档重构可利用Apache POI实现,进而,本发明可避免人为直接对报表进行填写、修改等处理,有效提高了处理效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一实施例中基于JEXL和POI的报表生成方法的流程示意图;
图2是本发明一实施例中步骤S2的流程示意图;
图3是本发明一实施例中步骤S3的流程示意图;
图4是本发明一实施例中步骤S32的流程示意图;
图5是本发明一实施例中步骤S322的流程示意图;
图6是本发明一实施例中步骤S3223的流程示意图;
图7a是本发明一实施例中部分单元格的垂直合并前的示意图;
图7b是本发明一实施例中部分单元格的垂直合并后的示意图;
图8是本发明一实施例中电子设备的构造示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
下面以具体地实施例对本发明的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。
图1是本发明一实施例中基于JEXL和POI的报表生成方法的流程示意图。
请参考图1,基于JEXL和POI的报表生成方法,包括:
S1:获取模板文档。
所述模板文档可理解为其结构与最终所需的报表相关联,其中可具有多个单元格,例如可形成为表格,至少部分单元格中记载有对应的指令;其中部分单元格的内容可以是不变的,一行或一列中的第一个单元格,其可记录该行的含义,故而无需做数据的替换或合并,进而可以未记载有指令。
具体实施过程中,在步骤S1之后,还可根据实际需求,制定该报表的模板文档,该模板文档可以为word报表模板,其中一种实施方式中,该报表可以为测试报告的报表,故而,模板文档也可理解为用于生成最终的作为测试报告的报表,进而,通过模板文档可将测试系统的中测试结果格式化为定义的WordTable结构数据,便于后续将测试结果填充到测试报告中,形成最终的报表。进而,步骤S1的过程可理解为对模板文档的读取。
以上所涉及的WordTable结构数据可参照申请号为CN201710864170.8的专利中相关描述理解。例如:WordTable可包括name、desc、head、body四个关键属性,其中name用来索引的关键字必须为符合程序变量命名规范的字母或者数字组合,desc为数据的描述,head对应字符串数组,内容为列块信息的具体说明描述,body为表格数据。
具体实施过程中,可对各单元格中的指令进行分类处理,进而分别构建普通指令集合与循环指令集合,通过指令集合的构建,可便于基于指令集合分别执行各集合的指令。
步骤S12之后,还可实施步骤S13:通过JEXL执行各单元格中记载的至少部分指令,得到对应的变量值,并利用所述变量值替换所述单元格中记载的指令。
其中的JEXL,具体为Java Expression Language,其可理解为是一个表达式语言引擎,本实施例通过对该JEXL的应用,可实现指令的执行。
具体实施过程中,可通过Apache POI接口将模板文档中的内容实例化到内存中,进而基于以上所涉及的指令集合对指令进行执行。
其中的变量值,可以是通过以下至少之一方式得到的:
通过对应指令的执行,直接获取到的;基于该类变量值替换单元格中记载的指令的过程,可理解为直接的变量值替换;
通过对应指令的执行,在预设的条件达成时获取到的;基于该类变量值替换单元格中记载的指令的过程,可理解为条件判断式的变量值替换;
通过对应指令的执行,循环式变化而确定的;基于该类变量值替换单元格中记载的指令的过程,可理解为循环式变量值替换;
通过对应指令的执行,根据该指令对应的自定义函数获取到的;基于该类变量值替换单元格中记载的指令的过程,可理解为基于自定义函数的变量值替换。
对于以上各类变量值替换,均可通过JEXL来实现,针对于直接的变量值替换、条件判断式的变量值替换与循环式变量值替换,本领域技术人员在已知以上描述的情况下,可得到所需的方案,故而在此不做展开描述。以下主要针对于基于自定义函数的变量值替换进行描述。
图2是本发明一实施例中步骤S2的流程示意图。
请参考图2,其中对以上所涉及的基于自定义函数的变量值替换进行了具体的描述。
其中一种实施方式中,步骤S2可以包括:
S21:自所述模板文档中提取所述自定义函数的函数表达式。
具体实施过程中,可以通过正则表达式提取模板文件中函数表达式,进而可对提取的函数表达式进行存储,以便于逐一或并行进行计算。
步骤S21之后,可包括:S22:根据存储于预设的Jexl Context对象中的函数输入值,利用JEXL执行对应的函数表达式的逻辑,得到对应的函数返回值作为所述当前变量值。
在步骤S22之后,可用函数返回值替换模板文档中的函数表达式。
步骤S2之后,还可包括:
S3:通过Apache POI对变量值替换后的模板文档进行文档结构的重构。
其中的文档结构用于表征所述模板文档中单元格的分布方式,还可用于表征其中图片、段落、单元格间的分布方式。
其中的Apache POI,可理解为:是用Java编写的免费开源的跨平台的Java API,Apache POI提供了用于操作Microsoft Office的API接口。本实施例可利用其对word进行所需的操作。
图3是本发明一实施例中步骤S3的流程示意图。
请参考图3,其中一种实施方式中,步骤S3可以包括:
S31:通过所述Apache POI将图片填充至所述模板文档中的对应位置。
具体可通过图片替换的方式将存储于特定对象中的图片替换至模板文档的对应位置。
步骤S31之后,可包括:S32:通过所述Apache POI对所述模板文档中的至少部分单元格进行合并。
以上合并的逻辑,可理解为将垂直的连续多个单元格中相同内容的部分合并为一个单元格,进而,该单元格中可记该相同的内容。
图4是本发明一实施例中步骤S32的流程示意图:
请参考图4,其中一种实施方式中,步骤S32可以包括:
S321:若单元格中的内容中记载有合并指令,则将该单元格的列号记录于待垂直合并列号集合中。
其中的合并指令可理解为任意的能将其所处的一列标识为待垂直合并的一列的数据,其可例如记载于该列中的任意一个单元格中,例如可利用单独一行表征该列是否需执行垂直合并的一列。
具体实施过程中,合并指令可例如为${m}指令。进而,在步骤S321中,可判断单元格中是否有${m}指令,如果有则记录相应单元格所在的列号到待垂直合并列号集合中。
步骤S321之后,可包括:S322:根据所述待垂直合并列号集合,通过所述ApachePOI进行单元格的垂直合并。
以上的垂直合并,可理解为在一列中,对于任意的多个内容相同的单元格,可将其进行合并。通过垂直合并,可便于使得表格整体更为逻辑清晰与美观,以使得最终的报表能更清楚地罗列数据。
其中,垂直合并的具体处理逻辑可以是多样的,只要完成了垂直合并,就不脱离本实施例的描述。
图5是本发明一实施例中步骤S322的流程示意图。
请参考图5,其中一种实施方式中,步骤S322可以包括:
S3221:根据所述待垂直合并列号集合中的列号,逐列遍历各列单元格;
S3222:针对每一个当前列,逐行遍历各行单元格;
S3223:若需合并所述当前列的部分单元格,则根据当前的起始行号与截止行号,通过所述Apache POI对所述当前列的部分单元格进行合并。
其中的步骤S3222可理解为步骤S3221中遍历每一列时均需实施的,其中的步骤S3223可理解为步骤S3222中遍历各行时所需实施的。
可见,本实施方式可通过对当前的起始行号与截止行号这两个数据的维护更新,为单元格的合并提供依据,保障了合并的有效实现。
同时,对起始行号与截止行号的维护可通过任意的方式,以下图6可对其进行具体的举例。
图6是本发明一实施例中步骤S3223的流程示意图。图7a是本发明一实施例中部分单元格的垂直合并前的示意图;图7b是本发明一实施例中部分单元格的垂直合并后的示意图。
请参考图6,其中以第N行为示例进行描述,其中的N可以为任意整数,进而,其表示的是任意一行均可实施以下步骤。
其中一种实施方式中,步骤S3223包括:
S322301:第N行中单元格的数量是否不小于当前列号。
若步骤S322301的判断结果为否,则表示该列的第N行无相应的匹配的单元格可供合并,进而可实施步骤S322302,否则,可实施步骤S322305。
以图7a与图7b为例,若第2列为当前列,则第3行的单元格的数量为1个,其小于当前列的列号2,故而,其无相应的匹配的单元格可供合并,进而需实施步骤S322302。
S322302:当前的起始行号是否小于截止行号。
若步骤S322302的判断结果为是,则表示在第N行之前,已经具有多个可实施合并的单元格。进而可实施步骤S322303实施合并。
以图7a与图7b为例,若N为3,第3行之前的第1行与第2行的行号可通过其他步骤被确定是起始行号与截止行号,进而,可对其进行合并。
S322303:根据当前的起始行号与截止行号,通过ApachePOI对所述当前列中对应的多个单元格进行合并。此时的截止行号可理解为N-1行,起始行号可以为N-1行之前的任意一行,其中的合并即为将当前列中自起始行号至截止行号的各行的单元格合并为一个单元格。
在合并之后,由于原来将第1行与第2行分别看做是起始行号与截止行号的过程已经不适用了,故而,可将起始行号与截止行号置为一个不会造成混淆的数值,其可理解为预设值,该预设值可例如为-1。
故而,在步骤S322303之后,还可实施步骤S322304:将所述起始行号与所述截止行号置为所述预设值(例如-1),在步骤S322304之后,可继续遍历下一行。
同时,若步骤S322302的判断结果为否,则其可能如第11行,因第10行已经将起始行号与截止行号均置为了-1,故而两者相同,从而起始行号不小于截止行号;还可能如第10行所示,因第9行已经将起始行号与截止行号均置为了9,故而两者相同,从而起始行号不小于截止行号,不论是何种情况,均可直接继续遍历下一行。另一实施方式中,也可在步骤S322302判断为否时将起始行号与截止行号均置为了-1。
若步骤S322301的判断结果为是,则可实施步骤S322305:所述当前列中第N行单元格的内容是否与当前的初始值的内容相同。
由于初始值表示的是垂直连续多个相同内容单元格中该相同的内容,其可通过后文所涉及的步骤S322311具体配置。即在针对第N行实施步骤S322305之前,可通过针对于其他行实施步骤S322311确定当前的初始值。
若步骤S322305的判断结果为是,则可实施步骤S322306:当前的起始行号是否为预设值(例如-1)。
通过步骤S322305与步骤S322306,若起始行号为-1,则表示第N-1行是经步骤S32204处理过的,进而,当前列第N行的单元格之前并无可供合并的单元格,故而,若步骤S322306的判断结果为是,则可实施步骤S322307:将所述起始行号与所述截止行号置为N,即将其从-1置为N,表示从第N行开始。
其可例如图7a与图7b所示,若N为4,则遍历到第4行时,由于第1行与第2行的内容为A,则初始值此时还是A,第4行的内容与初始值相同,然而,由于在遍历到第3行的处理中已将起始行号与截止行号置为了-1,故而,可判断无需与之前的单元格合并。进而,起始行号与截止行号可均变化置为4,从而便于后续的判断与处理。
反之,若起始行号并非-1,则表示当前列的第N-1行的单元格与当前列的第N行的单元格是相同的,进而是需要合并在一起的,进而,第N行则是已经在起算需合并的单元格时的其中之一单元格,进而,只需对截止行号进行累加即可,故而,若步骤S322306的判断结果为否,则可实施步骤S322308:确定所述起始行号保持不变,且所述截止行号加一。
其可例如图7a与图7b所示,若N为5,则遍历到第5行时,由于初始值依旧是A,第4行的内容与初始值相同,同时,起始行号并非-1,进而,可在保持起始行号为3的情况下,将截止行号加1,从而变化为4。
若步骤S322305的判断结果为否,则可实施步骤S322309:当前的起始行号是否小于截止行号。
若步骤S322309判断结果为是,则表示在第N行之前,已经具有多个可合并的单元格,需对其进行合并,故而,若步骤S322309的判断结果为是,则可实施步骤S322310与步骤S322311。
S322310:根据当前的起始行号与截止行号,通过ApachePOI对所述当前列中对应的多个单元格进行合并。
此时的截止行号可理解为N-1行,起始行号可以为N-1行之前的任意一行,其中的合并即为将当前列中自起始行号至截止行号的各行的单元格合并为一个单元格。
S322311:将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容。
可见,在合并之后,又可将该第N行作为起始行号与截止行号,将初始值确定为该第N行单元格的内容,从而便于将后面产生的相同内容的单元格合并。
其可例如图7a与图7b所示,若N为6,则遍历到第6行时,由于第六行的内容为B,其与之前所确定的初始值A不同,故而可将第4行与第5行合并,在合并后,原来的起始行号第4行、原来的截止行号第5行,以及原来的初始值A均已不再适用,故而,将起始行号与截止行号均变化为6,并将初始值变化为了B。
若步骤S322309的判断结果为否,则表示在第N行之前,并未形成大于两个内容相同的可合并的单元格,故而,可直接执行步骤S322311。
其可例如图7a与图7b所示,若N为7,则遍历到第7行时,由于经第6行处理后,初始值被设置为了B,然而,其起始行号与截止行号是相同的,均为6,故而不需合并。此时,原来的起始行号第6行、原来的截止行号第6行,以及原来的初始值B均已不再适用,故而,将起始行号与截止行号均变化为7,并将初始值变化为了C。
此外,图7a与图7b中所示第8行与第9行的起始行号、截止行号与初始值的变化,可参照第5行与第6行的变化理解。遍历到第9行时,可对第7行与第8行进行合并,并将起始行号与截止行号变化为第9行,将初始值变化为D。
通过以上步骤的循环实施,可实现所有所需的合并。
其中一种实施方式中,步骤S3223还包括:
针对所述当前列遍历完所有行时,若当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过所述Apache POI对所述当前列中对应的多个单元格进行合并。
其中一种实施方式中,步骤S3223还包括:
针对于所述当前行,若第M行单元格的内容为null,则将所述第M行单元格的内容赋值为空,以使得连续的多个赋值为空的单元格能够通过所述Apache POI被合并。
进而,垂直的连续多个赋值为空的单元格也可看做是相同内容的单元格,进而可应用于前文所涉及的方式实现合并。
在完成步骤S3的所有过程后,可实施步骤S4:根据重构后的模板文档,输出最终的报表。
具体实施过程中,可基于替换、重构后的模板文档,将结果以报告的形式输出。
综上所述,本发明提供的基于JEXL和POI的报表生成方法中,基于模板文档,能够通过设置的指令进行数据替换和文档结构重构来生成最终的报表,其中的数据替换可利用JEXL实现,其中的文档重构可利用Apache POI实现,进而,本发明可避免人为直接对报表进行填写、修改等处理,有效提高了处理效率。
图8是本发明一实施例中电子设备的结构示意图。
请参考图8,提供了一种电子设备50,包括:
处理器51,以及,
存储器52,用于存储所述处理器的可执行指令;
其中,所述处理器51配置为经由执行所述可执行指令来执行以上所涉及的方法。
处理器51能够通过总线53与存储器52通讯。
本发明一实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现以上所涉及的方法。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (6)
1.一种基于JEXL和POI的报表生成方法,其特征在于,包括:
获取模板文档,所述模板文档具有多个单元格,至少部分单元格中记载有对应的指令;
通过JEXL执行各单元格中记载的至少部分指令,得到对应的变量值,并利用所述变量值替换所述单元格中记载的指令;
通过Apache POI对变量值替换后的模板文档进行文档结构的重构;所述文档结构用于表征所述模板文档中单元格的分布方式;
根据重构后的模板文档,输出最终的报表;
其中,所述通过Apache POI对当前变量值替换后的模板文档进行文档结构的重构,包括:
通过所述Apache POI将图片填充至所述模板文档中的对应位置;
通过所述Apache POI对所述模板文档中的至少部分单元格进行合并;
其中,通过所述Apache POI对所述模板文档中的至少部分单元格进行合并,包括:
若单元格中的内容中记载有合并指令,则将该单元格的列号记录于待垂直合并列号集合中;
根据所述待垂直合并列号集合,通过所述Apache POI进行单元格的垂直合并;
其中,根据所述待垂直合并列号集合,通过所述Apache POI进行单元格的垂直合并,包括:
根据所述待垂直合并列号集合中的列号,逐列遍历各列单元格;
针对每一个当前列,逐行遍历各行单元格;
若需合并所述当前列的部分单元格,则根据当前的起始行号与截止行号,通过所述Apache POI对所述当前列的部分单元格进行合并;其中,所述针对每一个当前列,逐行遍历各行单元格时,包括:
若第N行中单元格的数量不小于所述当前列的列号,且所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号不为预设值,则确定所述起始行号保持不变,且所述截止行号加一;
若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号为预设值,则将所述起始行号与所述截止行号置为N;
若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI对所述当前列中对应的多个单元格进行合并,然后将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号为所述预设值,则将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
若第N行单元格的数量小于所述当前列的列号,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI对所述当前列中对应的多个单元格进行合并,并在合并后将所述起始行号与所述截止行号置为所述预设值;
若第N行中单元格的数量小于所述当前列的列号,且当前的起始行号不小于截止行号,则继续遍历下一行单元格。
2.根据权利要求1所述的方法,其特征在于,所述变量值是通过以下至少之一方式得到的:
通过对应指令的执行,直接获取到的;
通过对应指令的执行,在预设的条件达成时获取到的;
通过对应指令的执行,循环式变化而确定的;
通过对应指令的执行,根据该指令对应的自定义函数获取到的。
3.根据权利要求2所述的方法,其特征在于,若所述变量值是通过对应指令的执行,根据自定义函数而获取到的,则:
通过JEXL执行各单元格中记载的指令,得到对应的当前变量值,包括:
自所述模板文档中提取所述自定义函数的函数表达式;
根据存储于预设的Jexl Context对象中的函数输入值,利用JEXL执行对应的函数表达式的逻辑,得到对应的函数返回值作为所述当前变量值。
4.根据权利要求1至3任意一项所述的方法,其特征在于,针对每一个当前列,逐行遍历各行单元格时,还包括:
针对所述当前列遍历完所有行时,若当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过所述Apache POI对所述当前列中对应的多个单元格进行合并。
5.根据权利要求4所述的方法,其特征在于,针对每一个当前列,逐行遍历各行单元格时,还包括:
针对于所述当前列,若第M行单元格的内容为null,则将所述第M行单元格的内容赋值为空,以使得连续的多个赋值为空的单元格能够通过所述Apache POI被合并。
6.根据权利要求5所述的方法,其特征在于,所述预设值为-1。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910737693.5A CN110457376B (zh) | 2019-08-07 | 2019-08-07 | 基于jexl和poi的报表生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910737693.5A CN110457376B (zh) | 2019-08-07 | 2019-08-07 | 基于jexl和poi的报表生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110457376A CN110457376A (zh) | 2019-11-15 |
CN110457376B true CN110457376B (zh) | 2023-08-04 |
Family
ID=68485910
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910737693.5A Active CN110457376B (zh) | 2019-08-07 | 2019-08-07 | 基于jexl和poi的报表生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110457376B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103324731A (zh) * | 2013-06-28 | 2013-09-25 | 中国农业银行股份有限公司 | 将电子表格文件转换为网页格式文件的方法和装置 |
CN107608951A (zh) * | 2017-09-22 | 2018-01-19 | 上海金智晟东电力科技有限公司 | 报表生成方法和系统 |
-
2019
- 2019-08-07 CN CN201910737693.5A patent/CN110457376B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103324731A (zh) * | 2013-06-28 | 2013-09-25 | 中国农业银行股份有限公司 | 将电子表格文件转换为网页格式文件的方法和装置 |
CN107608951A (zh) * | 2017-09-22 | 2018-01-19 | 上海金智晟东电力科技有限公司 | 报表生成方法和系统 |
Non-Patent Citations (1)
Title |
---|
结合JXLS和POI技术开发Web报表;张古月等;《电脑知识与技术》;20090805(第22期);第6306-6308页 * |
Also Published As
Publication number | Publication date |
---|---|
CN110457376A (zh) | 2019-11-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9678969B2 (en) | Metadata updating method and apparatus based on columnar storage in distributed file system, and host | |
CN107526743A (zh) | 用于压缩文件系统元数据的方法和设备 | |
CN111124379B (zh) | 页面生成方法、装置、电子设备及存储介质 | |
JP2015118609A (ja) | 予め決められた複数のビット幅のデータに対して操作を行う命令を使用してツリーの検索を行うための方法、並びに、当該命令を使用してツリーの検索を行うためのコンピュータ及びそのコンピュータ・プログラム | |
CN112860264B (zh) | 一种抽象语法树重构方法及装置 | |
CN110457376B (zh) | 基于jexl和poi的报表生成方法 | |
CN111581219B (zh) | 监控数据获取方法及装置 | |
CN116301813B (zh) | 低代码平台开发方法及系统 | |
WO2015062035A1 (zh) | 一种列式数据库处理方法及装置 | |
CN107632880B (zh) | 导出excel数据的方法、存储介质及电子设备 | |
CN111079933A (zh) | 量子线路的图形化显示方法、系统、存储介质和电子装置 | |
CN116127932A (zh) | 一种业务报表生成方法、设备及介质 | |
CN113570464B (zh) | 一种数字货币交易社区识别方法、系统、设备及存储介质 | |
CN110968538A (zh) | 一种数据缓冲方法和装置 | |
CN107730572A (zh) | 一种图表渲染方法及装置 | |
US9552347B1 (en) | Data grid cell styling systems and methods | |
CN113128184A (zh) | 针对多人协同编辑文档的文档内容筛选方法及装置 | |
CN107515867A (zh) | 一种NoSQL数据库的数据存储、查询方法和装置以及一种rowKey全组合的生成方法和装置 | |
CN110428453A (zh) | 数据处理方法、装置、数据处理设备及存储介质 | |
CN111708572B (zh) | 一种基于Clang程序结构的控制流程图自动生成方法 | |
CN112925564B (zh) | 一种源代码的冗余导入类清理方法及装置 | |
JP5966801B2 (ja) | 言語変換装置、プログラム | |
CN115729557B (zh) | 脚本处理方法和装置 | |
CN116611418B (zh) | 基于在线编辑的报告处理方法、装置、电子设备及介质 | |
CN116954622B (zh) | 抽象语法树和源代码坐标的关联方法、电子设备和介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |