接下来开始第二篇文章了,以前采用的那种类的静态成员变量做配置确实不是什么好办法,所以我也就不谈了,直接进入正题用xml来配置.目前我正在用MyEclipse,用过的人可能都知道,在我们写struts等配置文件时,我们可以用快捷键将所有的当前可用标签列出来,还可以将相应的属性列出来,十分方便,那么xml有哪些标签,有哪些属性,究竟如何定义呢?这就是我们要谈的dtd了.
<!DOCTYPE myreport SYSTEM "myreport.dtd">
在xml文件中加入这么一句,那么我们所写的myreport.dtd就可以使用了.
那么myreport.dtd是如何编写的呢?
XML中的任何一个标签元素在dtd中都是如下这么定义的.
<!ELEMENT report (page?,allhead?,firsthead?,dynamic?,alltail?,lasttail?,count?)>
report就是我们给这个标签的名称,而括号中的page 等是定义给report的子元素,当然这些也需要定义,和report的定义方式是一样的,后面的?代表该子标签出现0次或1次,此处还可以用+代表至少出现一次,*代表出现0次或多次,如果我们什么都不加,则代表只出现一次.
除此之外,我们还可以为其指定属性,如下代码
<!ELEMENT report (page*,allhead?,firsthead?,dynamic?,alltail?,lasttail?,count?)> <!ATTLIST report id CDATA #REQUIRED name CDATA #IMPLIED key CDATA #IMPLIED defaultFontName CDATA #IMPLIED defaultFontSize CDATA #IMPLIED defaultRowHeight CDATA #IMPLIED blockRows CDATA #IMPLIED >
用 ATTLIST可以指定一组属性,后面紧跟指明谁的属性,之后就是属性的定义了,首先是属性名,然后是类型
#CDATA:指元素包含不通过解析器解析的字符数据。特殊字符和保留字不需要转义。常用这个
#PCDATA:指元素包括解析器可解析字符数据。特殊字符和保留字需要转义才可以通过解析器。
接着是,是否必须设定该属性IMPLIED为可选,REQUIRED则在XML中必须设定该属性.
这样我们就可以定义好一个简单的属于我们自己的dtd了,以后mye也能按照我们写的给出提示了.
但是还存在一各问题,就是我们有时可能需要指定xml中该属性的选择范围,如sex属性,我们仅允许选择男女.
那么可以这样写
<!ATTLIST person sex (男|女) "女" >
"女"代表默认值
dtd的介绍就到这了,这些基本上足够满足我们的需求了.
下面我们来想一下我们的报表工具都需要定义什么
首先是根元素我们需要定义一个包含导入导出的根元素
<!ELEMENT myreport (report*,import*)>
接下来如我前面举例,实现report,import,我们先只考虑report.
作为一个报表,我们需要给其一个id,以便在一个xml中,我们可以定义多个报表的配置信息,并给其一个name,用于做为导出的excel名如:name为货品清单导出的则为货品清单.xls.其他的主键用于合并单元格,对于我在(一)中发的图来说就是物品名和型号.我们还可以为这个报表指定默认的字体,字体大小,以及行高.
接下来就是定义动态数据和静态数据了,除了动态信息以外的六大部分都是静态数据,它们不需要循环.
下面是具体的定义,注释写的很清楚就不做解释了.
<!-- 代表一个动态数据 column x坐标 width 横跨单元格数 height 竖跨单元格数 rowHeight 行高 colWidth 列宽 field 对应bean的属性名 align 水平对齐 vAlign 垂直对齐 border 边框 left right top bottom all none 可用 可用|组合 type 类型 fixed固定 不调用bean 直接输出field的值 可用@index输出页码 format格式化输出 用?代表bean的field值 field可放入多个属性 以&分割 empty输出空字符 copy 拷贝field给定位置的内容 field 需要指定位置 格式如A-8 copywithformat 带格式拷贝 同copy 附带拷贝格式 formatcopy 先拷贝 然后将目标单元格中的?替换为bean的field值 prefix输出bean的field值之前 加上前缀 在prefix属性指定前缀 double输出bean的field小数值 保留2位 string 正常输出bean的field值 format 格式化内容 配合type为format prefix 前缀 配合type为prefix fontName 字体名 fontSize 字体大小 fontColor 字体颜色 merge 是否合并 当report的key不为空时按key合并 bold 是否加粗 italic 是否斜体 underline 是否下划线 --> <!ELEMENT dymdata (#PCDATA)> <!ATTLIST dymdata column CDATA #REQUIRED width CDATA #IMPLIED height CDATA #IMPLIED rowHeight CDATA #IMPLIED colWidth CDATA #IMPLIED field CDATA #IMPLIED align (left|right|centre) "centre" valign (top|bottom|centre) "centre" border CDATA #IMPLIED type (fixed|format|empty|copy|copywithformat|formatcopy|prefix|double|string) "string" format CDATA #IMPLIED prefix CDATA #IMPLIED fontName CDATA #IMPLIED fontSize CDATA #IMPLIED fontColor (black|white|red|bright_green|blue|yellow|light_orange|orange|brown|pink|dark_red|green|dark_blue|dark_yellow|grey_25_percent|grey_50_percent|ocean_blue|ice_blue|light_green|light_blue|gold|grey_40_percent|grey_80_percent) "black" merge (true|false) "false" bold (true|false) "false" italic (true|false) "false" underline (true|false) "false" notNull (true|false) "false" >
静态数据则只是多了relative来由我们控制输出的内容是相对位置还是绝对位置.
建立好数据与page firsthead dynamic等之间的包含关系,dtd就完成了.
写好dtd,我们就可以配置一个xml来用于今后报表工具测试.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE myreport SYSTEM "myreport.dtd"> <myreport> <report id="test" name="test"> <firsthead rows="4" columns=""> <staticdata column="1" row="2" field="user" border="null" /> <staticdata column="6" row="2" field="money" type="double" border="null"/> <staticdata column="1" row="3" field="date" border="null"/> </firsthead> </report> </myreport>
今天就写到这里了,下一次我们将实现xml的配置对象,以及如何将配置放入对象中去.