在这节中,主要说明,如何设计的?整个word生成过程是如何运转的?
我在本项目中采用这个技术架构确定之后,开始考虑采用properties文件来定义相关的标签什么的,但是最后放弃了这个决定,采用了XML文件的形式,主要的原因是:XML文件能很好的表现层次、层级关系,这样就为我在报告中定义层次结构什么的来的实在,而properties 更多使用于做(key,value)的定义,比如咱们的spring配置文件---数据库连接定义,log4j配置文件等。由此采用了 XML文件来定义相关的标签内容!
在实际项目中,可能会出现很多中报告的定义,所以我采用每一种报告定一个XML文件,这样以后只要增加一个报告类型,只需要再定义一个XML文件就能搞定。
下面主要复制一段我项目中的XML文件定义,下面会做详细的解释:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 主要定义XXX报告的相关标签 -->
<!DOCTYPE dataGroup SYSTEM "tag.dtd">
<dataGroup name="ISO27001">
<dataSets name="dataSets">
<!-- 总体分析结论-->
<dataSet name="ztfxjl" type="F">
<queryString><![CDATA[SELECT t.recommend_desc FROM t_27001_evtcase_recommended t WHERE t.evtcase_inst_id = $P{evtcase_inst_id} AND t.project_id = $P{project_id}]]></queryString>
<field key="$recommend_desc$" name="$[总体分析结论]" column="recommend_desc" ctype="f"></field>
</dataSet>
<!-- 安全方针列表 -->
<dataSet name="aqfz_list" type="T">
<queryString><![CDATA[SELECT t3.name AS thridName,t2.name AS fourName, t2.name as conformName,t.result FROM t_evtcase_inst_struct t2
LEFT JOIN t_evtcase_inst_struct t3
ON t2.evtcase_inst_id = t3.evtcase_inst_id
AND t2.layer_id = t3.parent_layer_id
WHERE 1=1
AND t2.evtcase_inst_id = $P{evtcase_inst_id}
AND t3.evtcase_inst_id = $P{evtcase_inst_id}
AND t2.name LIKE '%安全方针']]></queryString>
<field key="$rownum$" name="$[序号]" ctype="f"></field>
<field key="$thridName$" name="$[安全目标]" column="thridName" ctype="f"></field>
<field key="$fourName$" name="$[安全措施]" column="fourName" ctype="f"></field>
<field key="$conformName$" name="$[符合情况]" column="conformName" ctype="f"></field>
<field key="$result$" name="$[结果记录图片]" column="result" ctype="i"></field>
</dataSet>
</dataSets>
<dataTranstor name="dataTranstor">
<!--综合差距分析雷达图 -->
<dataSet name="image$zhcjfxldt" cnName="差距分析结果" type="CI-PolarChart">
<queryString><![CDATA[SELECT t.layer_name AS layerName,SUBSTRING((t.conform_value*10 + t.basic_conform_value*7 + t.part_conform_value*5) /(t.conform_value + t.basic_conform_value + t.part_conform_value),1,4) AS conformValue
FROM t_27001_evtcase_class_conformity t WHERE t.evtcase_inst_id = $P{evtcase_inst_id} AND t.project_id = $P{project_id}]]></queryString>
<field key="$layerName$" name="$[组件名称]" column="layerName" ctype="f"></field>
<field key="$conformValue$" name="$[平均值]" column="conformValue" ctype="f"></field>
</dataSet>
</dataTranstor>
</dataGroup>
在这里我解释一下上面的定义:
代码 | 说明 |
<dataGroup name="ISO27001"> | 第一层次:定义的某个报告类型名称,所以每个报告的name必须唯一,一旦重复就可能会出现数据写入乱的问题 |
<dataSets name="dataSets"> 和 <dataTranstor name="dataTranstor"> | 第二层次:name="daaSets" 是定义数据集相关的,主要包括定义word中要替换的单个标签和表格数据值;后者是定义要插入的图片地址或者定义其他要统计生成的图片sql相关的内容;还可以定义其他的;(注:主要是根据自己的需要去定义,然后做相应的解析。) |
<dataSet name="ztfxjl" type="F"> | (主要指<dataSets name="dataSets">下的)主要定义的一个dataSet数据集: 主要是把报告中的相关标签字段,能用一个数据集表示的就放到一起, 方便管理和少查询数据库,主要定义一个name和type属性: 1.name就是要与本XML文件中其他dataSet的name必须不同,唯一标识作用, 2.type主要定义下面的数据集在word中要展示的是单个标签值还是表格:F为字符、T为表格(必须大写) |
<queryString><![CDATA[SELECT t.recommend_desc,.... FROM t_27001_evtcase_recommended t WHERE t.evtcase_inst_id = $P{evtcase_inst_id} AND t.project_id = $P{project_id}]]></queryString> | 这个里面一看就知道是定义相关字段的sql语句,这个sql语句是跟下面表格的<field.../>字段相关的。在sql语句中: 1.查询字段:t.recommend_desc 对应下面表格中的 column="recommend_desc" 这个必须相同,(注:解析定义的sql语句,然后通过field中的key来取得sql查询出来的某列的值)2.查询条件字段:$P{project_id} 是通过后台解析的时候来对应,并传入的实际值。 |
<field key="$recommend_desc$" name="$[总体分析结论]" column="recommend_desc" ctype="f"></field> | 在这个field中,主要定义word中的标签相关的字段,这个字段既可以表示word中的单个的标签要替换的值, 也可以表示word中的要替换的表格列数。属性主要有:key、name、clumn、ctype: key:对应word模板中定义的单个标签,也表示是表格的第几列 name:是一个注释的作用,没有实际意义,主要用于在XML中定义时标识这个field是含义是什么 clumn:上面已经讲过,对应了sql语句中的地段 ctype:主要定义查询出来的这个值的类型:f为字符,i为图像(我大概说一下: f表示通过sql查询出来的值到word中展示的是以字符的形式展示; i为查询出来的地段以图片的形式展示,可能有人要问, 直接以图像展示那能行吗,其实你应该想到它肯定是一个图像地址, 通过后台解析,把图片地址的图片放到了word中) |
<dataSet name="image$zhcjfxldt" cnName="差距分析结果" type="CI-PolarChart"> | (主要指<dataTranstor name="dataTranstor">下的)主要定义要生成的统计图,每个dataSet定义为一个统计图,意思说:在这里定义的dataSet,在后台处理的时候,要去动态的生成图像,不管采用什么方式生成,最后会返回一个图片的地址,再解析放到word模板中的相关位子,主要有:name、cnName、type三个属性:name:也是定义不能重复的图像标识cnName:是定义要在统计图上生成的总的图片名称,会显示在图片上(这里需要说明一个,我在后台生成图片是采用的jfreechar技术,在jfreechar上会显示图片的信息, 就通过这个来定义的)type:是定义统计图的类型,比如是:雷达图、柱状图、还是曲线图...我自定义了集中类型:CI-PolarChart ---- 代表雷达图CI-BarChart ---- 代表柱状图CI-PieChart ---- 代表饼状图。。。主要根据自己的需要去定义就行了,我都以CI开头,来解析。 |
<queryString><![CDATA[SELECT t.layer_name AS layerName,SUBSTRING((t.conform_value*10 + t.basic_conform_value*7 + t.part_conform_value*5) /(t.conform_value + t.basic_conform_value + t.part_conform_value),1,4) AS conformValueFROM t_27001_evtcase_class_conformity t WHERE t.evtcase_inst_id = $P{evtcase_inst_id} AND t.project_id = $P{project_id}]]></queryString> | 这里就不讲了,同上面的 |
<field key="$layerName$" name="$[组件名称]"column="layerName" ctype="f"></field> | 同上面,但是我需要说明的是:既然是生成统计图,还需要定义字段干什么的,主要是为了展示在图像上的: 如: 柱状图有x,y轴,那么这两个轴的数据来源就是靠这里的field来定义的。 其他的图也类似,饼状图,曲线图都需要定义数据集 |
其中还有一块就是word模板的定义,我放到下节来讲,这里写的太多了!
<其实还有很多方式可以定义,我就采用我自己最熟悉的,或者说有跟好的定义方式,牛人自己去完善>
(未完待续)