法律状态公告日
法律状态信息
法律状态
2023-05-09
未缴年费专利权终止 IPC(主分类):G06F 9/451 专利号:ZL2017103029768 申请日:20170503 授权公告日:20200703
专利权的终止
2020-07-03
授权
授权
2017-10-27
实质审查的生效 IPC(主分类):G06F9/44 申请日:20170503
实质审查的生效
2017-09-29
公开
公开
技术领域
本发明涉及报表处理技术领域,特别涉及一种使用WPF界面生成报表的方法及报表引擎。
背景技术
在WPF程序中,常常有生成大量格式不同报表的应用场景。当前WPF程序生成报表的常用方法有两种:一种是将数据导出到excel中生成报表;另一种是使用第三方控件生成报表。
将数据导出到excel中生成报表,优点是可以方便的修改报表,但是缺点是修改的数据不能保存到数据库中,导致修改的报表和数据库中的数据不匹配,另外自己修改报表,报表统计数据有可能计算错误。
使用第三方控件生成报表的优点为打印报表严格按照程序设定打印,但是缺点是第三方控件编辑功能薄弱,无法实现报表修改的“所见即所得”,当报表不符合要求时,需要返回到修改页面重新修改;另一个缺点是数据库中保存的是报表中每个字段的数据,报表的样式不能保存。当软件中的报表模板发生变化时,软件中再次打印的报表样式可能与原有样式不同。
发明内容
为了克服现有技术的不足,本发明提供一种使用WPF界面生成报表的方法及报表引擎,抽象了报表和报表管理的常用操作,WPF作为界面的软件项目使用该方法和引擎创建报表,可实现报表创建和修改“所见即所得”的设计效果,并且实现报表创建、加载、编辑、打印、统计等功能更加简单快速。
为了达到上述目的,本发明采用以下技术方案实现:
一种使用WPF界面生成报表的报表引擎,报表引擎的结构包括报表模板基类、报表管理模块两个类。
其中,所述的报表模板基类继承于System.Windows.Controls.UserControl类,抽象了报表模板的公共方法,所有报表模板都继承于报表模板基类。公共方法包括:初次加载操作,加载操作,验证操作,统计操作,查找操作,获取打印报表对象操作。
所述的报表模板是指创建具体报表对象的报表类,报表模板针对各个不同报表实现报表特有的样式、操作,报表模板需要继承报表模板基类后单独实现,并根据实际需求重写基类的公有方法。
报表模板基类中的“初次加载操作”,“加载操作”,“验证操作”,“统计操作”四个方法均为虚方法并且方法体为空方法体,主要由继承基类的实现类根据具体需求重写方法;“初次加载操作”用于报表内容填写初始化提示操作,仅在第一次新建报表时,由报表管理模块调用;“加载操作”用于加载报表时的内容初始化操作,每次加载报表都由报表管理模块调用;“验证操作”用于判断报表填写内容是否符合报表填写规范;“统计操作”用于统计和分析填写的报表内容,并将统计分析结果显示在报表上或者传递给报表管理模块。
所述的报表模板基类中的“查找操作”是虚方法,用于通过报表模板中的WPF元素tag标签查找指定WPF控件,该方法可以由子类重写,但是该方法的方法体中提供了一个默认的实现算法,该实现算法为一个递归查找算法,实现步骤如下:
1)设置要查找的WPF元素控件c为空值;
2)查找指定WPF元素控件的tag标签,如果tag值为指定的值,则将该控件赋值给c,查找结束;
3)否则判断该WPF元素控件是否为容器,如果为容器,则遍历容器内的子控件,对每一个子控件调用“查找操作”,如果查找结果不为空,将子控件的结果赋值给c;如果不是容器,则查找结束;
4)返回要查找的WPF元素控件。
所述的报表模板基类中的“获取打印报表对象操作”是一个虚方法,用于克隆报表,并将报表中不符合打印要求的控件按照某种格式替换为符合打印要求的控件,该方法可以由子类重写,但是基类中提供了一种默认的实现算法,默认实现算法步骤如下:
1)使用System.Windows.Markup命名空间中的XamlReader类、XamlWriter类和XamlDesignerSerializationManager类的将报表序列化,再反序列化,完成报表的克隆;
2)递归遍历报表中的所有控件,如果控件是DatePicker,提取其中的日期,并使用TextBlock替换;如果控件是CheckBox和RadioButton,选项使用TextBlock替换,并在选中项前面加符号“√”;如果控件是ComboBox,将选中的选项用TextBlock替换;如果控件是Button,则隐藏控件。
其中,所述的报表管理模块,定义了针对常用的报表功能抽象出四种基本操作,包括:新建报表,加载报表,序列化报表,打印报表。这四项操作的操作对象都是报表模板基类的对象,报表模板的对象在上转型为报表模板基类对象后,实现操作的多态。
所述的报表管理模块中“新建报表”的实现步骤如下:
1)根据希望创建的报表,查找对应的报表模板的定义类型;
2)利用.Net中的类型反射技术创建指定定义类型报表类的报表对象;
3)清空用于显示报表的报表容器,并将报表对象添加到容器中,用于显示;
4)调用报表对象的“初次加载操作”;
5)调用报表对象的“加载操作”;
6)调用报表对象的“验证操作”,判断报表内容是否填写正确;
7)如果报表内容填写正确,调用报表对象的“统计操作”,否则不进行统计操作。
所述的报表管理模块中“加载报表”的实现步骤如下:
1)读取指定报表序列化后的XAML文件;
2)利用System.Windows.Markup.XamlReader类解析XAML文件,并反序列化为报表类型的对象;
3)清空用于显示报表的报表容器,并将报表对象添加到容器中,用于显示;
4)调用报表对象的“加载操作”;
5)调用报表对象的“验证操作”,判断报表内容是否填写正确;
6)如果报表内容是否填写正确,调用报表对象的“统计操作”,否则不进行统计操作。
所述的报表管理模块中“序列化报表”的实现步骤如下:
1)获取需要序列化的报表对象;
2)调用报表对象的“验证操作”验证报表内容是否规范,如果规范继续执行下一步骤,否则返回内容不规范原因,序列化方法结束;
3)调用报表对象的“统计操作”;
4)使用System.Windows.Markup命名空间中的XamlWriter类和XamlDesignerSerializationManager类的对象,将报表对象序列化为XAML类型的字符串;
5)返回XAML类型的字符串给调用方法的用户。
所述的报表管理模块中“打印报表”的实现步骤如下:
1)获取需要打印的报表对象;
2)调用报表对象的“验证操作”验证报表内容是否规范如果规范继续执行下一步骤,否则返回内容不规范原因,打印方法结束;
3)调用报表对象的“统计操作”;
4)调用报表对象的“获取打印报表对象操作”获得原报表对象的可打印对象;
5)调用命名空间System.Windows.Controls中的PrintDialog类的对象显示打印对话框;如果调用成功,继续下一步骤,否则抛出打印异常,方法结束;
6)调用System.Windows.Xps.Serialization.XpsSerializationManager类型对象的SaveAsXaml方法,将可打印对象转为XpsDocument类型对象;
7)使用命名空间System.Windows.Xps.Packaging中的IXpsFixedDocumentSequenceReader类型的对象和XamlReader类型的对象,将XpsDocument类型对象转为FlowDocument类型对象;
8)调用FlowDocument类型对象的DocumentPaginator属性获取内容分页对象,将内容分页对象传递给PrintDialog类对象的PrintDocument方法,执行打印操作。
利用所述的报表引擎的一种使用WPF界面生成报表模板的方法步骤如下:
1)在代码集成开发环境中创建UserControl类型的类,并将基类改为报表模板基类,该类即为报表模板类;
2)根据报表的需求,在报表模板类中,利用XAML或WPF控件对象实现报表样式;
3)根据报表需求,选择报表模板基类中的虚方法重写。
当应用程序需要生成报表时,将报表模板类传递给报表管理模块类对象,由报表管理模块类对象负责完成报表的各项操作。
与现有技术相比,本发明的有益效果是:
1、本发明提出的方法将WPF界面作为报表新建、加载、编辑、保存和打印的统一界面,实现了报表“所见即所得”的设计效果。
2、本发明提出的方法抽象了报表和报表管理的主要操作,开发人员使用本发明,可以规范报表开发流程,实现报表应用的快速开发。
3、本发明提出的方法使用WPF界面作为报表的布局模板,可以使用丰富的WPF布局控件,不仅方便了用户的操作,而且方便开发人员对报表进行样式布局及统计、校验等控制操作,降低了开发人员的学习门槛。
4、本发明提出的方法,报表保存时,不仅保存了报表的主要数据,还可以保存XAML文件,即报表的布局样式,当报表布局模板改变后,原有的报表布局样式不会改变,实现了报表数据和报表样式的完全保存。
5、本发明报表保存后的序列化文件为XML文件,具有跨平台跨系统的特性,方便系统的扩展和数据的交换。
附图说明
图1是本发明的报表引擎类图;
图2是本发明的查找操作流程图;
图3是本发明的获取打印报表对象操作流程图;
图4是本发明的新建报表流程图;
图5是本发明的加载报表流程图;
图6是本发明的序列化报表流程图;
图7是本发明的打印报表流程图;
图8是本发明的使用WPF界面生成报表模板的方法流程图;
图9是本发明的具体实施例效果“施工单位自评表”。
具体实施方式
以下结合附图对本发明提供的具体实施方式进行详细说明。
如图1所示,一种使用WPF界面生成报表的报表引擎,报表引擎的结构包括报表模板基类、报表管理模块两个类。
其中,所述的报表模板基类继承于System.Windows.Controls.UserControl类,抽象了报表模板的公共方法,所有报表模板都继承于报表模板基类。公共方法包括:初次加载操作,加载操作,验证操作,统计操作,查找操作,获取打印报表对象操作。
所述的报表模板是指实现具体报表的报表类,报表模板针对各个不同报表实现报表特有的样式、操作,报表模板需要继承报表模板基类后单独实现,并可以根据实际需求重写基类的公有方法。
报表模板基类中的“初次加载操作”,“加载操作”,“验证操作”,“统计操作”四个方法均为虚方法,主要由继承基类的实现类根据具体需求重写方法,基类的方法体为空方法体;“初次加载操作”用于报表内容填写初始化提示操作,仅在第一次新建报表时,由报表管理模块调用;“加载操作”用于加载报表时的内容初始化操作,每次加载报表都由报表管理模块调用;“验证操作”用于判断报表填写内容是否符合报表填写规范;“统计操作”用于统计和分析填写的报表内容,并将统计分析结果显示在报表上或者传递给报表管理模块。
如图2所示,所述的报表模板基类中的“查找操作”是虚方法,用于通过报表模板中的WPF元素tag标签查找指定WPF控件,该方法可以由子类重写,但是该方法的方法体中提供了一个默认的实现算法,该实现算法为一个递归查找算法,实现步骤如下:
1)设置要查找的WPF元素控件c为空值;
2)查找指定WPF元素控件的tag标签,如果tag值为指定的值,则将该控件赋值给c,查找结束;
3)否则判断该WPF元素控件是否为容器,如果为容器,则遍历容器内的子控件,对每一个子控件调用“查找操作”,如果查找结果不为空,将子控件的结果赋值给c;如果不是容器,则查找结束;
4)返回要查找的WPF元素控件。
如图3所示,所述的报表模板基类中的“获取打印报表对象操作”是一个虚方法,用于克隆报表,并将报表中不符合打印要求的控件按照某种格式替换为符合打印要求的控件,该方法可以由子类重写,但是基类中提供了一种默认的操作方法,默认操作步骤如下:
1)使用System.Windows.Markup命名空间中的XamlReader类、XamlWriter类和XamlDesignerSerializationManager类的将报表序列化,再反序列化,完成报表的克隆;
2)递归遍历报表中的所有控件,如果控件是DatePicker,提取其中的日期,并使用TextBlock替换;如果控件是CheckBox和RadioButton,选项使用TextBlock替换,并在选中项前面加符号“√”;如果控件是ComboBox,将选中的选项用TextBlock替换;如果控件是Button,则隐藏控件。
其中,所述的报表管理模块,定义了针对常用的报表功能抽象出四种基本操作,包括:新建报表,加载报表,序列化报表,打印报表。这四项操作的操作对象都是报表模板基类的对象,报表模板对象在上转型为报表模板基类对象后,实现操作的多态。
如图4所示,所述的报表管理模块中“新建报表”的实现步骤如下:
1)根据希望创建的报表,查找对应的报表模板的定义类型;
2)利用.Net中的类型反射技术创建指定定义类型报表类的报表对象;
3)清空用于显示报表的报表容器,并将报表对象添加到容器中,用于显示;
4)调用报表对象的“初次加载操作”;
5)调用报表对象的“加载操作”;
6)调用报表对象的“验证操作”,判断报表内容是否填写正确;
7)如果报表内容填写正确,调用报表对象的“统计操作”,否则不进行统计操作。
如图5所示,所述的报表管理模块中“加载报表”的实现步骤如下:
1)读取指定报表序列化后的XAML文件;
2)利用System.Windows.Markup.XamlReader类解析XAML文件,并反序列化为报表类型的对象;
3)清空用于显示报表的报表容器,并将报表对象添加到容器中,用于显示;
4)调用报表对象的“加载操作”;
5)调用报表对象的“验证操作”,判断报表内容是否填写正确;
6)如果报表内容是否填写正确,调用报表对象的“统计操作”,否则不进行统计操作。
如图6所示,所述的报表管理模块中“序列化报表”的实现步骤如下:
1)获取需要序列化的报表对象;
2)调用报表对象的“验证操作”验证报表内容是否规范,如果规范继续执行下一步骤,否则返回内容不规范原因,序列化方法结束;
3)调用报表对象的“统计操作”;
4)使用System.Windows.Markup命名空间中的XamlWriter类和XamlDesignerSerializationManager类的对象,将报表对象序列化为XAML类型的字符串;
5)返回XAML类型的字符串给调用方法的用户。
如图7所示,所述的报表管理模块中“打印报表”的实现步骤如下:
1)获取需要打印的报表对象;
2)调用报表对象的“验证操作”验证报表内容是否规范如果规范继续执行下一步骤,否则返回内容不规范原因,打印方法结束;
3)调用报表对象的“统计操作”;
4)调用报表对象的“获取打印报表对象操作”获得原报表对象的可打印对象;
5)调用命名空间System.Windows.Controls中的PrintDialog类的对象显示打印对话框;如果调用成功,继续下一步骤,否则抛出打印异常,方法结束;
6)调用System.Windows.Xps.Serialization.XpsSerializationManager类型对象的SaveAsXaml方法,将可打印对象转为XpsDocument类型对象;
7)使用命名空间System.Windows.Xps.Packaging中的IXpsFixedDocumentSequenceReader类型的对象和XamlReader类型的对象,将XpsDocument类型对象转为FlowDocument类型对象;
8)调用FlowDocument类型对象的DocumentPaginator属性获取内容分页对象,将内容分页对象传递给PrintDialog类对象的PrintDocument方法,执行打印操作。
如图8所示,利用所述的报表引擎的一种使用WPF界面生成报表模板类的方法步骤如下:
1)在代码集成开发环境中创建UserControl类型的类,并将基类改为报表模板基类,该类即为报表模板类;
2)根据报表的需求,在报表模板类中,利用XAML或WPF控件对象实现报表样式;
3)根据报表需求,选择报表模板基类中的虚方法重写。
将报表模板类传递给报表管理模块类对象,由报表管理模块类对象负责完成报表的各项操作。
具体实施例1:以报表“施工单位自评表”的各项操作为例。“施工单位自评表”的界面如图9。
新建“施工单位自评表”报表模板的步骤如下:
1)在代码集成开发环境中创建UserControl类型的代码文件,并将基类改为报表模板基类。
2)根据报表的需求,实现报表样式。报表使用grid对页面进行切分布局,并在需要录入信息的地方放入相应控件。如果后台代码需要调用该控件,在控件的tag标签中输入控件的标识符字符串。例如单位工程名称、分部工程名称放置TextBox控件,工序编号放置TextBox控件,标识符为“txtProcessID”,施工单位放置ComboBox控件,标识符为“cmbConstructionUnit”,施工日期放置两个DatePicker控件,标识符分别是“dpStart”和“dpEnd”,代表开始和结束日期。主控项目检验点合格率放置TextBox控件,标识符为“txtMain”,一般项目点合格率放置TextBox控件,标识符为“txtCommon”。工程质量评定等级处放置TextBlock控件,标识符为“tbLevel”。
根据报表需求,选择基类中的虚方法重写。重写“初次加载操作”:使用“查找操作”查找标识符“dpStart”和“dpEnd”对应的控件,并把时间设置为当前时间。重写“加载操作”:使用“查找操作”查找标识符“cmbConstructionUnit”对应的ComboBox控件,从数据库中找到施工单位列表,并加载到ComboBox控件的下拉列表中。重写“验证操作”:查找标识符“txtProcessID”,验证输入的工序编号是否是六位数字,如果验证失败,返回假值,并提示错误信息;查找标识符“txtMain”和“txtCommon”的控件,验证输入的文字是否为0-100以内的数字,如果验证失败,返回假值,并提示错误信息;如果验证成功,返回真值。重写“统计操作”:查找标识符“txtMain”和“txtCommon”的控件,并取出主要项目和一般项目的合格率,根据形参中传递的计算公式,计算工序质量等级。查找标识符“tbLevel”,并将工序质量等级结果赋值给“tbLevel”控件,将评定等级结果作为返回值返回。利用报表管理模块类的对象实现新建“施工单位自评表”的实现步骤:
1)查找“施工单位自评表”模板的类型。
2)利用.Net中的类型反射技术创建“施工单位自评表”模板的报表对象。
3)清空用于显示报表的报表容器,并将报表对象添加到容器中,用于显示。
4)调用报表对象的“初次加载操作”。
5)调用报表对象的“加载操作”。
6)调用报表对象的“验证操作”,判断报表内容是否填写正确。由于是初次加载,报表中的数据没有填写,因此“验证操作”返回值为假值。
7)如果报表内容填写正确,调用报表对象的“统计操作”,否则不进行统计操作。
利用报表管理模块类的对象实现施工单位自评表“加载报表”的实现步骤如下:
1)查找指定的需加载的施工单位自评表的XAML文件。
2)利用System.Windows.Markup.XamlReader类解析XAML文件,并反序列化为施工单位自评表模板类型的对象。
3)清空用于显示报表的报表容器,并将报表对象添加到容器中,用于显示。
4)调用报表对象的“加载操作”。
5)调用报表对象的“验证操作”,判断报表内容是否填写正确。
6)如果报表内容是否填写正确,调用报表对象的“统计操作”,否则不进行统计操作。
利用报表管理模块类的对象实现施工单位自评表中“序列化报表”的实现步骤如下:
1)获取需要施工单位自评表报表对象。
2)调用报表对象的“验证操作”验证报表内容是否规范,如果规范继续执行下一步骤,否则返回内容不规范原因,序列化方法结束。
3)调用报表对象的“统计操作”,并通过返回值获取报表的评定等级。
4)使用System.Windows.Markup命名空间中的XamlWriter类和XamlDesignerSerializationManager类的对象,将报表对象序列化为XAML类型的字符串。
5)返回XAML类型的字符串给调用方法的用户,完成序列化。
利用报表管理模块类的对象实现施工单位自评表中“打印报表”的实现步骤如下:
1)获取施工单位自评表报表对象。
2)调用报表对象的“验证操作”验证报表内容是否规范,如果规范继续执行下一步骤,否则返回内容不规范原因,序列化方法结束。
3)调用报表对象的“统计操作”,计算工序质量等级。
4)调用报表对象的“获取打印报表对象操作”获得原报表对象的可打印对象。在“获取打印报表对象操作”中,DatePicker和ComboBox控件都被TextBlock控件代替,用于打印操作。
5)调用命名空间System.Windows.Controls中的PrintDialog类的对象显示打印对话框。如果调用成功,继续下一步骤,否则抛出打印异常,方法结束。
6)调用System.Windows.Xps.Serialization.XpsSerializationManager类型对象的SaveAsXaml方法,将可打印对象转为XpsDocument类型对象。
7)使用命名空间System.Windows.Xps.Packaging中的IXpsFixedDocumentSequenceReader类型的对象和XamlReader类型的对象,将XpsDocument类型对象转为FlowDocument类型对象。
8)调用FlowDocument类型对象的DocumentPaginator属性获取内容分页对象,将内容分页对象传递给PrintDialog类对象的PrintDocument方法,执行打印操作。
以上实施例在以本发明技术方案为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于上述的实施例。上述实施例中所用方法如无特别说明均为常规方法。
机译: 报表条件输入界面的生成方法和装置
机译: 一种含磷的溶液,一种使用该过程生成的溶液生成金属磷酸盐的步骤,该过程使用生成的溶液,一种成分润滑液包含该溶液,一种使用该溶液形成对流表面的方法
机译: 生成用户界面的方法和使用该界面生成用户界面的装置