CN107608951A - 报表生成方法和系统 - Google Patents
报表生成方法和系统 Download PDFInfo
- Publication number
- CN107608951A CN107608951A CN201710864170.8A CN201710864170A CN107608951A CN 107608951 A CN107608951 A CN 107608951A CN 201710864170 A CN201710864170 A CN 201710864170A CN 107608951 A CN107608951 A CN 107608951A
- Authority
- CN
- China
- Prior art keywords
- variable
- instruction
- character
- xwpfrun
- report
- 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.)
- Granted
Links
Landscapes
- Devices For Executing Special Programs (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种报表生成方法和系统,该方法,包括:加载测试数据和word制定的报表模板;对所述测试数据进行规格化和缓存,并从所述word制定的报表模板中解析出指令、公式、变量以及替换的处理逻辑;其中,所有解析出的指令构成相应的指令集;所有解析出的公式构成相应的公式集;所有解析出的变量构成相应的变量集;将所述测试数据按照所述指令集、公式集、变量集以及替换的处理逻辑生成可视化报表。本发明利用word可视化定制报表模板,效率高,直观可靠,不易出错,易于推广使用。
Description
技术领域
本发明涉及计算机技术领域,具体地,涉及一种报表生成方法和系统。
背景技术
目前开发者设计了许多专业的报表应用软件,但是这些报表应用软件一般基于特定领域或者用户特定需求而设计,专业性强,对用户操作的专业度要求高。Office软件是目前使用最为普遍的办公软件,其中的word模板中就自带有报表引擎。word模板的报表引擎的实质是实现对变量表达式的计算和对带有word排版格式的变量表达式进行替换,从而生成用户需求的报表。
但是,在通过word制定模板实现可视化编辑模板时,由于段落中的文本由若干XWPFRun(XWPFRun是XWPFDocument中的一段文本对象)构成,其中文本内容随机分布在XWPFRun集合中,因此造成无法正确提取计算表达式或者非表达式部分被错误替换的情况出现,并最终影响可视化编辑模板的正确生成。
发明内容
针对现有技术中的缺陷,本发明的目的是提供一种报表生成方法和系统。
第一方面,本发明提供一种报表生成方法,包括:
加载测试数据和word制定的报表模板;
对所述测试数据进行规格化和缓存,并从所述word制定的报表模板中解析出指令、公式、变量以及替换的处理逻辑;其中,所有解析出的指令构成相应的指令集;所有解析出的公式构成相应的公式集;所有解析出的变量构成相应的变量集;
将所述测试数据按照所述指令集、公式集、变量集以及替换的处理逻辑生成可视化报表。
可选地,所述对所述测试数据进行规格化和缓存,包括:
将所述测试数据转化为WordTable数据结构,并采用JSON编码格式存储,对于所述测试数据中的二进制图片数据采用Base64编码进行处理以及标识属性;所述WordTable数据结构包括name、desc、head、body四个关键属性,其中:
name用于索引关键字,所述关键字为符合程序变量命名规范的字母或者数字组合;
desc用于进行数据的描述;
head为对应字符串数组,所述head的内容为列块信息描述;
body为表格数据。
可选地,所述从所述word制定的报表模板中解析出指令、公式、变量以及替换的处理逻辑,包括:
从所述word制定的报表模板的最后段落中解析出指令,并生成指令集;
从所述word制定的报表模板的段落和表格中解析出变量,并生成变量集;
从所述word制定的报表模板的段落和表格中解析出公式,并生成公式集和替换的处理逻辑。
可选地,所述从所述word制定的报表模板的最后段落中解析出指令,并生成指令集,包括:
读取所述word制定的报表模板中的指令内容,通过正则表达式提取指令,并删除所述指令对应段落,通过指令关键字生成指令集;
剔除所述指令集中符合指令格式且非指令关键字的指令。
可选地,所述从所述word制定的报表模板的段落和表格中解析出公式,并生成公式集和替换的处理逻辑,包括:
按照预设的表达式提取规则分别从段落、图片、表格中提取出表达式,并标记表达式的位置,所述预设的表达式提取规则为正则表达式分组方式;
将所述测试数据代入所述表达式中,得到与所述表达式对应的数值;
将所述数值替换对应位置的表达式,并用预设的字符替换无法计算出数值的表达式。
可选地,所述按照预设的表达式提取规则分别从段落、图片中提取出表达式,包括:
A1:判断所述word制定的报表模板中的段落是否包含有变量,若未包含有变量,则结束流程;否则执行步骤A2;
A2:判断所述段落中是否包含有文本命令,若是,则执行步骤A3,若否,则执行步骤A5;
A3:通过循环函数getRuns()获取所有XWPFRun集合;
A4:使用正则表达式(?<=\\$\\{)([\\s\\S]*?)(?=\\})分组提取变量,替换变量采用${item2[0]#"ff0000"}格式表示,其中字符#左侧的字符串表示计算表达式,字符#右侧的字符串表示字体颜色的RGB值;
A5:判断所述段落中是否包含有图片命令,若是,则执行步骤A6;若否,则结束流程;
A6:使用正则表达式(?<=\\#\\{)([\\s\\S]*?)(?=\\})分组提取图片表达式,图片格式采用json格式表示:#{"height":200,"width":600,"data":"img"},其中height表示图片显示的高度,width表示图片显示的宽度,data表示图像数据变量关键字,img表示base64编码的图像数据变量。
可选地,所述步骤A3包括:
A3.1:设定循环函数getRuns()中初始化循环变量i的值为0,状态量status赋值-1,并定义head、body为两个字符串缓冲区,定义strList为字符串集合;
判断i的大小,若i小于XWPFRun集合长度,则将XWPFRun集合中第i个元素赋值给变量text,提取所述第i个元素的文本内容,初始化变量j=0;若i大于或等于XWPFRun集合长度,则执行步骤A3.7;
A3.2:判断j的大小,若j小于text长度,取text第j个字符赋值给ch,否则令i加1,返回执行步骤A3.1;
A3.3:判断ch是否满足第一条件,若满足第一条件,则将字符ch放入head缓冲,并将status赋值为0,返回执行步骤A3.2;若不满足第一条件,则执行步骤A3.4;
其中:第一条件为:ch的值等于字符$或者字符#的值,且status的值等于-1;
A3.4:判断ch是否满足第二条件,若满足第二条件,则标记所述XWPFRun为参考XWPFRun,删除head最后一个字符,根据删除的最后一个字符决定body放入字符${还是字符#{;并将status赋值为1,返回执行步骤A3.2;若不满足第二条件,则执行步骤A3.5;
其中,第二条件为:ch的值等于字符{,且status的值等于0;
A3.5:判断ch是否满足第三条件,若满足第三条件,则删除head中的最后一个字符,并在body放入字符};
判断head长度是否大于0,若大于0,则将head中所有字符组成字符串放入strList集合并清空head;
判断body长度是否大于0,若大于0,则将body中所有字符组成字符串放入strList集合并清空body,将status赋值为-1,返回执行步骤A3.2;
其中,第三条件为:ch的值等于字符{,且status的值等于1;
A3.6:判断status的值是否等于1,若是,则将ch放入body中,返回执行步骤A3.2;若否,则将ch放入head中,返回执行步骤A3.2;
A3.7:按照所述参考XWPFRun的样式生成strList中所有字符串对应的XWPFRun,并将所述XWPFRun增加到段落的头部,从段落中删除遍历过的XWPFRun集合。
可选地,所述按照预设的表达式提取规则,从表格中提取出表达式,包括:
执行步骤B和/或步骤C;其中:
所述步骤B包括:
B1:遍历所有表格单元格,通过getParagraphs()API取出单元格中的所有段落;并在确定表格跨行${mergeH}、表格跨列${mergeV}对应的全局关键字存在时,记录下表格的行号和/或列号;
B2:加载指令集,按照指令的类型分别处理段落中的变量和公式;
B2.1:判断段落是否存在指令var对应表达式中所对应的变量,若存在,则遍历所有XWPFRun集合,采用JexlEngine计算含有待替换变量的表达式;并判断指令的类型,若为循环指令,则执行步骤B2.2;若为条件指令,则执行步骤B2.3;
B2.2:判断本次循环是否为最后一次循环,若非最后一次循环,则追加XWPFRun至XWPFRun集合中;若是最后一次循环,则替换XWPFRun集合中的内容;
B2.3:判断预设条件是否满足,若满足,则替换匹配的XWPFRun中的内容,若不满足,则将匹配的XWPFRun内容置空;
B3:替换段落中的非指令变量;
所述步骤C包括:
C1:遍历所有表格单元格,通过getParagraphs()API取出单元格中的所有段落;并确定表格跨行${mergeH}、表格跨列${mergeV}对应的全局关键字存在时,记录下表格的行号和/或列号;
C2:加载指令集,按照指令的类型分别处理表格中的变量和公式;
C2.1:判定表格中是否存在指令var对应表达式对应的变量,若存在,则遍历所有XWPFTableCell集合,计算含有待替换变量的的表达式的值;并判断指令的类型,若为循环指令,则执行步骤C2.2;若为条件指令,则执行步骤C2.3;
C2.2:判断是否是最后一次循环,若是,则替换含有变量的单元格中内容,若否,则增加一行表格,并替换含有变量的单元格中内容;
C2.3:判断预设条件是否满足,若满足,则替换含有变量的单元格中内容,若不满足,则删除对应行的单元格;
C3:替换表格中的非指令变量。
第二方面,本发明提供一种报表生成系统,包括:
加载模块,用于加载测试数据和word制定的报表模板;
报表引擎模块,用于对所述测试数据进行规格化和缓存,并从所述word制定的报表模板中解析出指令、公式、变量以及替换的处理逻辑;其中,所有解析出的指令构成相应的指令集;所有解析出的公式构成相应的公式集;所有解析出的变量构成相应的变量集;
所述报表引擎模块,还用于将所述测试数据按照所述指令集、公式集、变量集以及替换的处理逻辑生成可视化报表。
可选地,所述表引擎模块,具体用于:
将所述测试数据转化为WordTable数据结构,并采用JSON编码格式存储,对于所述测试数据中的二进制图片数据采用Base64编码进行处理以及标识属性;所述WordTable数据结构包括name、desc、head、body四个关键属性,其中:
name用于索引关键字,所述关键字为符合程序变量命名规范的字母或者数字组合;
desc用于进行数据的描述;
head为对应字符串数组,所述head的内容为列块信息描述;
body为表格数据。
可选地,所述从报表引擎模块,具体用于:
从所述word制定的报表模板的最后段落中解析出指令,并生成指令集;
从所述word制定的报表模板的段落和表格中解析出变量,并生成变量集;
从所述word制定的报表模板的段落和表格中解析出公式,并生成公式集和替换的处理逻辑。
可选地,所述从报表引擎模块,具体用于:
读取所述word制定的报表模板中的指令内容,通过正则表达式提取指令,并删除所述指令对应段落,通过指令关键字生成指令集;
剔除所述指令集中符合指令格式且非指令关键字的指令。
可选地,所述从报表引擎模块,具体用于:
按照预设的表达式提取规则分别从段落、图片、表格中提取出表达式,并标记表达式的位置,所述预设的表达式提取规则为正则表达式分组方式;
将所述测试数据代入所述表达式中,得到与所述表达式对应的数值;
将所述数值替换对应位置的表达式,并用预设的字符替换无法计算出数值的表达式。
可选地,所述按照预设的表达式提取规则分别从段落、图片中提取出表达式,包括:
A1:判断所述word制定的报表模板中的段落是否包含有变量,若未包含有变量,则结束流程;否则执行步骤A2;
A2:判断所述段落中是否包含有文本命令,若是,则执行步骤A3,若否,则执行步骤A5;
A3:通过循环函数getRuns()获取所有XWPFRun集合;
A4:使用正则表达式(?<=\\$\\{)([\\s\\S]*?)(?=\\})分组提取变量,替换变量采用${item2[0]#"ff0000"}格式表示,其中字符#左侧的字符串表示计算表达式,字符#右侧的字符串表示字体颜色的RGB值;
A5:判断所述段落中是否包含有图片命令,若是,则执行步骤A6;若否,则结束流程;
A6:使用正则表达式(?<=\\#\\{)([\\s\\S]*?)(?=\\})分组提取图片表达式,图片格式采用json格式表示:#{"height":200,"width":600,"data":"img"},其中height表示图片显示的高度,width表示图片显示的宽度,data表示图像数据变量关键字,img表示base64编码的图像数据变量。
可选地,所述步骤A3包括:
A3.1:设定循环函数getRuns()中初始化循环变量i的值为0,状态量status赋值-1,并定义head、body为两个字符串缓冲区,定义strList为字符串集合;
判断i的大小,若i小于XWPFRun集合长度,则将XWPFRun集合中第i个元素赋值给变量text,提取所述第i个元素的文本内容,初始化变量j=0;若i大于或等于XWPFRun集合长度,则执行步骤A3.7;
A3.2:判断j的大小,若j小于text长度,取text第j个字符赋值给ch,否则令i加1,返回执行步骤A3.1;
A3.3:判断ch是否满足第一条件,若满足第一条件,则将字符ch放入head缓冲,并将status赋值为0,返回执行步骤A3.2;若不满足第一条件,则执行步骤A3.4;
其中:第一条件为:ch的值等于字符$或者字符#的值,且status的值等于-1;
A3.4:判断ch是否满足第二条件,若满足第二条件,则标记所述XWPFRun为参考XWPFRun,删除head最后一个字符,根据删除的最后一个字符决定body放入字符${还是字符#{;并将status赋值为1,返回执行步骤A3.2;若不满足第二条件,则执行步骤A3.5;
其中,第二条件为:ch的值等于字符{,且status的值等于0;
A3.5:判断ch是否满足第三条件,若满足第三条件,则删除head中的最后一个字符,并在body放入字符};
判断head长度是否大于0,若大于0,则将head中所有字符组成字符串放入strList集合并清空head;
判断body长度是否大于0,若大于0,则将body中所有字符组成字符串放入strList集合并清空body,将status赋值为-1,返回执行步骤A3.2;
其中,第三条件为:ch的值等于字符{,且status的值等于1;
A3.6:判断status的值是否等于1,若是,则将ch放入body中,返回执行步骤A3.2;若否,则将ch放入head中,返回执行步骤A3.2;
A3.7:按照所述参考XWPFRun的样式生成strList中所有字符串对应的XWPFRun,并将所述XWPFRun增加到段落的头部,从段落中删除遍历过的XWPFRun集合。
可选地,所述按照预设的表达式提取规则,从表格中提取出表达式,包括:
执行步骤B和/或步骤C;其中:
所述步骤B包括:
B1:遍历所有表格单元格,通过getParagraphs()API取出单元格中的所有段落;并在确定表格跨行${mergeH}、表格跨列${mergeV}对应的全局关键字存在时,记录下表格的行号和/或列号;
B2:加载指令集,按照指令的类型分别处理段落中的变量和公式;
B2.1:判断段落是否存在指令var对应表达式中所对应的变量,若存在,则遍历所有XWPFRun集合,采用JexlEngine计算含有待替换变量的表达式;并判断指令的类型,若为循环指令,则执行步骤B2.2;若为条件指令,则执行步骤B2.3;
B2.2:判断本次循环是否为最后一次循环,若非最后一次循环,则追加XWPFRun至XWPFRun集合中;若是最后一次循环,则替换XWPFRun集合中的内容;
B2.3:判断预设条件是否满足,若满足,则替换匹配的XWPFRun中的内容,若不满足,则将匹配的XWPFRun内容置空;
B3:替换段落中的非指令变量;
所述步骤C包括:
C1:遍历所有表格单元格,通过getParagraphs()API取出单元格中的所有段落;并确定表格跨行${mergeH}、表格跨列${mergeV}对应的全局关键字存在时,记录下表格的行号和/或列号;
C2:加载指令集,按照指令的类型分别处理表格中的变量和公式;
C2.1:判定表格中是否存在指令var对应表达式对应的变量,若存在,则遍历所有XWPFTableCell集合,计算含有待替换变量的的表达式的值;并判断指令的类型,若为循环指令,则执行步骤C2.2;若为条件指令,则执行步骤C2.3;
C2.2:判断是否是最后一次循环,若是,则替换含有变量的单元格中内容,若否,则增加一行表格,并替换含有变量的单元格中内容;
C2.3:判断预设条件是否满足,若满足,则替换含有变量的单元格中内容,若不满足,则删除对应行的单元格;
C3:替换表格中的非指令变量。
与现有技术相比,本发明具有如下的有益效果:
本发明提供的报表生成方法和系统,利用word制定的报表模板,并从所述word制定的报表模板中解析出指令、公式、变量以及替换的处理逻辑;最后将所述测试数据按照所述指令集、公式集、变量集以及替换的处理逻辑生成可视化报表。从而有效地抽象出报表引擎中的段落、表格、图片等处理逻辑,实现了动态提取指令、变量、公式和静态文本的拆分与合并,为报表引擎加载报表模板及生成报表提供算法支持,生成的报表更加直观,不易出错。
附图说明
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1为本发明提供的报表生成方法的原理框图;
图2为本发明提供的报表生成方法的流程示意图;
图3为本发明中有限状态图的处理逻辑示意图。
具体实施方式
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
本发明提供的报表生成方法,可以应用在配电自动化测试系统的测试数据上,根据该测试数据的特性生成可视化报表。
图1为本发明提供的报表生成方法的原理框图,如图1所示,以配电自动化测试系统的测试数据作为报表数据的数据源,包括如下步骤:
加载用于生成报表的配电终端或故障指示器的测试数据;选择通过word制定的报表模板;
将报表数据和模板发送到报表引擎进行处理;
报表引擎首先将报表数据规格化,并缓存规格化后的测试数据;
加载模板并从模板最后段落解析报表模板中的指令,并生成指令集;
然后解析段落和表格中的变量生成变量集,解析段落和表格中的公式生成公式集,并生成替换处理逻辑。在生成变量集和公式集过程中,采用本文拆分合并算法实现静态文本、变量和公式的分离;
根据指令集、变量集、公式集、对应的替换处理逻辑以及数据,生成报表。
具体的,基于word模板的报表引擎本质是变量表达式的计算和带有word排版格式的变量表达式的替换,针对段落、表格、图片需要分类替换原则,从段落、图片、表格中提取出表达式。本实施例中采用正则表达式分组方式进行提取,并在在提取过程中标记表达式位置。最后使用计算出的值替换对应位置的表达式,对于无法计算表达式值则使用“/”替换对应位置表达式。
参见图2、图3,本实施例中采用有限状态图处理逻辑实现保持格式的计算表达式和普通文本的分离。具体的实现步骤如下:
S1:本文针对报表数据设计WordTable数据结构,采用JSON编码格式存储,WordTable包括name、desc、head、body四个关键属性,其中name用来索引的关键字必须为符合程序变量命名规范的字母或者数字组合,desc为数据的描述,head对应字符串数组,内容为列块信息的具体说明描述,body为表格数据,此外,对于二进制图片数据采用Base64编码处理后标识属性。
S2:指令处理负责读取模板中指令内容,通过正则表达式提取指令并删除对应段落,通过指令关键字生成指令集,指令格式如$:指令名(参数……)。其中根据指令要求,参数可以从1到多个。对于符合指令格式但不是指令关键字的指令丢弃处理。
S3:读取指令结束后,加载所有段落,结合图3有限状态机,将每个段落分别调用段落处理过程S31~S34,此目的是将${…}或者#{…}内容合并到一个XWPFRun中。
S4:段落处理结束后,加载所有表格,遍历所有表格单元格,通过getParagraphs()API取出单元所有段落,处理每个段落,处理流程S31~S34相同。处理过程中判断${mergeH}、${mergeV}表格跨行和跨列等全局关键字是否存在,如果存在则记录行号或者列号;
S5:通过S2过程载入的指令集,动态处理段落的变量和公式;若不存在指令集,则执行步骤S7。
S6:通过S2过程载入的指令集,动态处理表格的变量和公式,若不存在指令集,则执行步骤S7。
S7:替换段落中非指令变量;
S8:替换表格中非指令变量。
具体的,步骤S3包括:
S31:确认是否含有变量,如果没有,直接跳过不做处理。如果含有文本命令则进入S32,如果含有图片命令则进入S33;
S32:通过getRuns()获取所有XWPFRun集合,初始化循环变量i赋值0,状态量status赋值-1,head、body为两个字符串缓冲区,strList为字符串集合。
S33:使用"(?<=\\$\\{)([\\s\\S]*?)(?=\\})"正则表达式分组提取变量,替换变量采用${item2[0]#"ff0000"}格式表示,#前边是计算表达式,#后边为字体颜色RGB表示。
S34:使用"(?<=\\#\\{)([\\s\\S]*?)(?=\\})"正则表达式分组提取图片表达式,图片格式采用json格式表示,height表示图片显示的高度,width表示图片显示的宽度,data表示base64编码的计算表达式,#{"height":200,"width":600,"data":"img[2]"}。
具体的,所述步骤S32包括:
S321:若i小于XWPFRun集合长度,则将XWPFRun集合中第i个元素赋值给变量text,取该元素的文本内容,初始化变量j=0,否则进入S327;
S322:若j小于text长度,取text第j个字符赋值给ch,否则i+1,执行S321;
S323:判断ch是否等于’$’或者’#’且status等于-1,若条件为真,则将字符ch放入head缓冲,status赋值0,执行S322,否则执行S324;
S324:判断ch是否等于’{’且status等于0,若条件为真,标记此XWPFRun用于后续克隆样式,删除head最后一个字符,根据删除最后一个字符决定body放入字符’${’还是’#{’,status赋值1,执行S322,否则执行S325;
S325:判断ch是否等于’}’且status等于1,若条件为真,则head删除最后一个字符,body放入字符’}’,判断head长度是否大于0,若真则将head中所有字符组成字符串放入strList集合并清空head,判断body长度是否大于0,若真则将body中所有字符组成字符串放入strList集合并清空body,status赋值-1,执行S322,否则执行S326;
S326:判断status是否等于1,若真将ch放入body,执行S322,否者将ch放入head,执行S322;
S327:克隆标记XWPFRun样式生成strList中所有字符串对应XWPFRun并增加到段落的头部,从段落中删除遍历过的XWPFRun集合。
具体的,所述步骤S5包括:
S51:判定段落中是否存在指令var对应表达式中对应的变量,如果存在,遍历所有XWPFRun集合,对于含有待替换变量的计算表达式,计算过程采用JexlEngine;
结合Java反射求出,在此不做过多描述,判断指令类型,若循环执行S52,若条件指令执行S53;
S52:若循环指令,判断是否是最后一次循环,若非最后一次采用追加XWPFRun至XWPFRun集合的方法,此过程为方便循环进行定位替换位置,若是最后一次循环则替换XWPFRun集合中内容;
S53:若条件指令,判断条件是否满足,若满足则替换匹配的XWPFRun中的内容,否则将匹配的XWPFRun内容置空。
具体的,所述步骤S6包括:
S61:判定表格中是否存在指令var对应表达式对应的变量,如果存在,遍历所有XWPFTableCell集合,对于含有待替换变量的,计算表达式计算值,计算过程如S51描述,判断指令类型,若循环执行S62,若条件指令执行S63;
S62:若循环指令,判断是否是最后一次循环,若最后一次则直接替换含有变量的单元格中内容,若不是最后一次循环则增加一行表格,并替换含有变量的单元格中内容,此过程为方便循环进行定位替换位置;
S63:若条件指令,判断条件是否满足,若满足则替换含有变量的单元格中内容,否则删除此行单元格。
需要说明的是,本发明提供的所述报表生成方法中的步骤,可以利用所述报表生成系统中对应的模块、装置、单元等予以实现,本领域技术人员可以参照所述系统的技术方案实现所述方法的步骤流程,即,所述系统中的实施例可理解为实现所述方法的优选例,在此不予赘述。
本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统及其各个装置以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统及其各个装置以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同功能。所以,本发明提供的系统及其各项装置可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构;也可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。
Claims (10)
1.一种报表生成方法,其特征在于,包括:
加载测试数据和word制定的报表模板;
对所述测试数据进行规格化和缓存,并从所述word制定的报表模板中解析出指令、公式、变量以及替换的处理逻辑;其中,所有解析出的指令构成相应的指令集;所有解析出的公式构成相应的公式集;所有解析出的变量构成相应的变量集;
将所述测试数据按照所述指令集、公式集、变量集以及替换的处理逻辑生成可视化报表。
2.根据权利要求1所述的报表生成方法,其特征在于,所述对所述测试数据进行规格化和缓存,包括:
将所述测试数据转化为WordTable数据结构,并采用JSON编码格式存储,对于所述测试数据中的二进制图片数据采用Base64编码进行处理以及标识属性;所述WordTable数据结构包括name、desc、head、body四个关键属性,其中:
name用于索引关键字,所述关键字为符合程序变量命名规范的字母或者数字组合;
desc用于进行数据的描述;
head为对应字符串数组,所述head的内容为列块信息描述;
body为表格数据。
3.根据权利要求1所述的报表生成方法,其特征在于,所述从所述word制定的报表模板中解析出指令、公式、变量以及替换的处理逻辑,包括:
从所述word制定的报表模板的最后段落中解析出指令,并生成指令集;
从所述word制定的报表模板的段落和表格中解析出变量,并生成变量集;
从所述word制定的报表模板的段落和表格中解析出公式,并生成公式集和替换的处理逻辑。
4.根据权利要求3所述的报表生成方法,其特征在于,所述从所述word制定的报表模板的最后段落中解析出指令,并生成指令集,包括:
读取所述word制定的报表模板中的指令内容,通过正则表达式提取指令,并删除所述指令对应段落,通过指令关键字生成指令集;
剔除所述指令集中符合指令格式且非指令关键字的指令。
5.根据权利要求3所述的报表生成方法,其特征在于,所述从所述word制定的报表模板的段落和表格中解析出公式,并生成公式集和替换的处理逻辑,包括:
按照预设的表达式提取规则分别从段落、图片、表格中提取出表达式,并标记表达式的位置,所述预设的表达式提取规则为正则表达式分组方式;
将所述测试数据代入所述表达式中,得到与所述表达式对应的数值;
将所述数值替换对应位置的表达式,并用预设的字符替换无法计算出数值的表达式。
6.根据权利要求5所述的报表生成方法,其特征在于,所述按照预设的表达式提取规则分别从段落、图片中提取出表达式,包括:
A1:判断所述word制定的报表模板中的段落是否包含有变量,若未包含有变量,则结束流程;否则执行步骤A2;
A2:判断所述段落中是否包含有文本命令,若是,则执行步骤A3,若否,则执行步骤A5;
A3:通过循环函数getRuns()获取所有XWPFRun集合;
A4:使用正则表达式(?<=\\$\\{)([\\s\\S]*?)(?=\\})分组提取变量,替换变量采用${item2[0]#"ff0000"}格式表示,其中字符#左侧的字符串表示计算表达式,字符#右侧的字符串表示字体颜色的RGB值;
A5:判断所述段落中是否包含有图片命令,若是,则执行步骤A6;若否,则结束流程;
A6:使用正则表达式(?<=\\#\\{)([\\s\\S]*?)(?=\\})分组提取图片表达式,图片格式采用json格式表示:#{"height":200,"width":600,"data":"img"},其中height表示图片显示的高度,width表示图片显示的宽度,data表示图像数据变量关键字,img表示base64编码的图像数据变量。
7.根据权利要求6所述的报表生成方法,其特征在于,所述步骤A3包括:
A3.1:设定循环函数getRuns()中初始化循环变量i的值为0,状态量status赋值-1,并定义head、body为两个字符串缓冲区,定义strList为字符串集合;
判断i的大小,若i小于XWPFRun集合长度,则将XWPFRun集合中第i个元素赋值给变量text,提取所述第i个元素的文本内容,初始化变量j=0;若i大于或等于XWPFRun集合长度,则执行步骤A3.7;
A3.2:判断j的大小,若j小于text长度,取text第j个字符赋值给ch,否则令i加1,返回执行步骤A3.1;
A3.3:判断ch是否满足第一条件,若满足第一条件,则将字符ch放入head缓冲,并将status赋值为0,返回执行步骤A3.2;若不满足第一条件,则执行步骤A3.4;
其中:第一条件为:ch的值等于字符$或者字符#的值,且status的值等于-1;
A3.4:判断ch是否满足第二条件,若满足第二条件,则标记所述XWPFRun为参考XWPFRun,删除head最后一个字符,根据删除的最后一个字符决定body放入字符${还是字符#{;并将status赋值为1,返回执行步骤A3.2;若不满足第二条件,则执行步骤A3.5;
其中,第二条件为:ch的值等于字符{,且status的值等于0;
A3.5:判断ch是否满足第三条件,若满足第三条件,则删除head中的最后一个字符,并在body放入字符};
判断head长度是否大于0,若大于0,则将head中所有字符组成字符串放入strList集合并清空head;
判断body长度是否大于0,若大于0,则将body中所有字符组成字符串放入strList集合并清空body,将status赋值为-1,返回执行步骤A3.2;
其中,第三条件为:ch的值等于字符{,且status的值等于1;
A3.6:判断status的值是否等于1,若是,则将ch放入body中,返回执行步骤A3.2;若否,则将ch放入head中,返回执行步骤A3.2;
A3.7:按照所述参考XWPFRun的样式生成strList中所有字符串对应的XWPFRun,并将所述XWPFRun增加到段落的头部,从段落中删除遍历过的XWPFRun集合。
8.根据权利要求5所述的报表生成方法,其特征在于,所述按照预设的表达式提取规则,从表格中提取出表达式,包括:
执行步骤B和/或步骤C;其中:
所述步骤B包括:
B1:遍历所有表格单元格,通过getParagraphs()API取出单元格中的所有段落;并在确定表格跨行${mergeH}、表格跨列${mergeV}对应的全局关键字存在时,记录下表格的行号和/或列号;
B2:加载指令集,按照指令的类型分别处理段落中的变量和公式;
B2.1:判断段落是否存在指令var对应表达式中所对应的变量,若存在,则遍历所有XWPFRun集合,采用JexlEngine计算含有待替换变量的表达式;并判断指令的类型,若为循环指令,则执行步骤B2.2;若为条件指令,则执行步骤B2.3;
B2.2:判断本次循环是否为最后一次循环,若非最后一次循环,则追加XWPFRun至XWPFRun集合中;若是最后一次循环,则替换XWPFRun集合中的内容;
B2.3:判断预设条件是否满足,若满足,则替换匹配的XWPFRun中的内容,若不满足,则将匹配的XWPFRun内容置空;
B3:替换段落中的非指令变量;
所述步骤C包括:
C1:遍历所有表格单元格,通过getParagraphs()API取出单元格中的所有段落;并确定表格跨行${mergeH}、表格跨列${mergeV}对应的全局关键字存在时,记录下表格的行号和/或列号;
C2:加载指令集,按照指令的类型分别处理表格中的变量和公式;
C2.1:判定表格中是否存在指令var对应表达式对应的变量,若存在,则遍历所有XWPFTableCell集合,计算含有待替换变量的的表达式的值;并判断指令的类型,若为循环指令,则执行步骤C2.2;若为条件指令,则执行步骤C2.3;
C2.2:判断是否是最后一次循环,若是,则替换含有变量的单元格中内容,若否,则增加一行表格,并替换含有变量的单元格中内容;
C2.3:判断预设条件是否满足,若满足,则替换含有变量的单元格中内容,若不满足,则删除对应行的单元格;
C3:替换表格中的非指令变量。
9.一种报表生成系统,其特征在于,包括:
加载模块,用于加载测试数据和word制定的报表模板;
报表引擎模块,用于对所述测试数据进行规格化和缓存,并从所述word制定的报表模板中解析出指令、公式、变量以及替换的处理逻辑;其中,所有解析出的指令构成相应的指令集;所有解析出的公式构成相应的公式集;所有解析出的变量构成相应的变量集;
所述报表引擎模块,还用于将所述测试数据按照所述指令集、公式集、变量集以及替换的处理逻辑生成可视化报表。
10.根据权利要求9所述的报表生成系统,其特征在于,所述表引擎模块,具体用于:
将所述测试数据转化为WordTable数据结构,并采用JSON编码格式存储,对于所述测试数据中的二进制图片数据采用Base64编码进行处理以及标识属性;所述WordTable数据结构包括name、desc、head、body四个关键属性,其中:
name用于索引关键字,所述关键字为符合程序变量命名规范的字母或者数字组合;
desc用于进行数据的描述;
head为对应字符串数组,所述head的内容为列块信息描述;
body为表格数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710864170.8A CN107608951B (zh) | 2017-09-22 | 2017-09-22 | 报表生成方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710864170.8A CN107608951B (zh) | 2017-09-22 | 2017-09-22 | 报表生成方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107608951A true CN107608951A (zh) | 2018-01-19 |
CN107608951B CN107608951B (zh) | 2021-12-21 |
Family
ID=61061815
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710864170.8A Active CN107608951B (zh) | 2017-09-22 | 2017-09-22 | 报表生成方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107608951B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108804401A (zh) * | 2018-06-14 | 2018-11-13 | 南京云帐房网络科技有限公司 | 一种报表模板的合并方法及装置 |
CN108804327A (zh) * | 2018-06-12 | 2018-11-13 | 北京京东金融科技控股有限公司 | 一种自动生成测试数据的方法和装置 |
CN109522216A (zh) * | 2018-10-15 | 2019-03-26 | 杭州安恒信息技术股份有限公司 | 基于api测试工具导出数据的团队接口开发协作系统及方法 |
CN110457376A (zh) * | 2019-08-07 | 2019-11-15 | 上海金智晟东电力科技有限公司 | 基于jexl和poi的报表生成方法 |
CN111159995A (zh) * | 2020-01-16 | 2020-05-15 | 江西金格科技股份有限公司 | 一种模板化生成word文档的方法 |
CN112036140A (zh) * | 2020-09-01 | 2020-12-04 | 中国银行股份有限公司 | 前端表格数据分组统计方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060265357A1 (en) * | 2005-04-26 | 2006-11-23 | Potts Matthew P | Method of efficiently parsing a file for a plurality of strings |
CN106021220A (zh) * | 2016-06-01 | 2016-10-12 | 网易(杭州)网络有限公司 | 表格检测方法及装置 |
CN107122344A (zh) * | 2017-05-24 | 2017-09-01 | 中国农业银行股份有限公司 | 一种报告生成方法及系统 |
-
2017
- 2017-09-22 CN CN201710864170.8A patent/CN107608951B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060265357A1 (en) * | 2005-04-26 | 2006-11-23 | Potts Matthew P | Method of efficiently parsing a file for a plurality of strings |
CN106021220A (zh) * | 2016-06-01 | 2016-10-12 | 网易(杭州)网络有限公司 | 表格检测方法及装置 |
CN107122344A (zh) * | 2017-05-24 | 2017-09-01 | 中国农业银行股份有限公司 | 一种报告生成方法及系统 |
Non-Patent Citations (2)
Title |
---|
PANTHEON: ""Apache POI XWPF 爬坑指南之——文本替换"", 《HTTPS://WWW.JIANSHU.COM/P/1355FAD12EAD》 * |
春江花夜月: ""Poi之Word文档结构介绍"", 《HTTPS://WWW.CNBLOGS.COM/SPRINGMOON-VENN/P/5494602.HTML》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108804327A (zh) * | 2018-06-12 | 2018-11-13 | 北京京东金融科技控股有限公司 | 一种自动生成测试数据的方法和装置 |
CN108804401A (zh) * | 2018-06-14 | 2018-11-13 | 南京云帐房网络科技有限公司 | 一种报表模板的合并方法及装置 |
CN108804401B (zh) * | 2018-06-14 | 2022-06-21 | 南京云帐房网络科技有限公司 | 一种报表模板的合并方法及装置 |
CN109522216A (zh) * | 2018-10-15 | 2019-03-26 | 杭州安恒信息技术股份有限公司 | 基于api测试工具导出数据的团队接口开发协作系统及方法 |
CN110457376A (zh) * | 2019-08-07 | 2019-11-15 | 上海金智晟东电力科技有限公司 | 基于jexl和poi的报表生成方法 |
CN110457376B (zh) * | 2019-08-07 | 2023-08-04 | 上海金智晟东电力科技有限公司 | 基于jexl和poi的报表生成方法 |
CN111159995A (zh) * | 2020-01-16 | 2020-05-15 | 江西金格科技股份有限公司 | 一种模板化生成word文档的方法 |
CN112036140A (zh) * | 2020-09-01 | 2020-12-04 | 中国银行股份有限公司 | 前端表格数据分组统计方法及装置 |
CN112036140B (zh) * | 2020-09-01 | 2023-08-18 | 中国银行股份有限公司 | 前端表格数据分组统计方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107608951B (zh) | 2021-12-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107608951A (zh) | 报表生成方法和系统 | |
CN107025676B (zh) | 一种图片模板以及图片的生成方法及相关装置 | |
CN104267947B (zh) | 一种编辑弹窗图片的方法及弹窗图片编辑装置 | |
CN103970863B (zh) | 基于lda主题模型的微博用户兴趣的挖掘方法及系统 | |
CN107578292B (zh) | 一种用户画像构建系统 | |
US9122664B2 (en) | Method for automatically creating transforms | |
CN108572819A (zh) | 页面更新方法、装置、终端及计算机可读存储介质 | |
CN103246733A (zh) | 一种基于元数据的动态表单系统及其生成方法 | |
CN107291450A (zh) | 一种编程友好型的敏捷代码自动生成方法 | |
CN108647025A (zh) | 文档对象模型中节点的处理方法及装置、电子和存储设备 | |
CN106469140A (zh) | 一种报表生成系统及其方法 | |
BRPI1000577B1 (pt) | método e sistema para extração e gerenciamento de informações contidas em documentos eletrônicos | |
CN111309313A (zh) | 一种快速生成html以及存储表单数据的方法 | |
CN108536745A (zh) | 基于Shell的数据表提取方法、终端、设备及存储介质 | |
CN110162297A (zh) | 一种源代码段自然语言描述自动生成方法及系统 | |
CN103870583A (zh) | 一种基于关系型数据库的在线可控浏览pdf文档的方法 | |
CN107977357A (zh) | 基于用户反馈的纠错方法、装置及其设备 | |
CN105426350B (zh) | Scd文件中提取电压等级、间隔及ied信息的方法 | |
Joshi et al. | Web document text and images extraction using DOM analysis and natural language processing | |
CN108536683A (zh) | 一种基于机器学习的论文碎片化信息抽取方法 | |
CN114090653A (zh) | 一种资源数据统计方法、装置、元平台设备及存储介质 | |
CN110765402A (zh) | 一种基于网络资源的可视化采集系统及采集方法 | |
CN106843891A (zh) | 一种基于增量的表单分层扩展方法 | |
CN104268163A (zh) | 一种网管网元配置界面的实现方法及系统 | |
van den Brand et al. | Generic tool for visualization of model differences |
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 |