在这节中,主要说明,如何设计的?整个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来定义的。

其他的图也类似,饼状图,曲线图都需要定义数据集