Excel 校验引擎项目设计分享
Excel 校验引擎项目设计分享
需求:
校验EXCEL文件中每一列,每一个单元格的内容,输出校验报告。
校验规则实现可配置的形式。
支持代码的扩展,比如增加校验规则,增加校验结果的处理方式,只需要实现相应的接口,并修改配置文件的内容即可。
设计方案:
规则的配置以XML配置。
配置文件分为两部分:
第一部分是 校验器 validator的配置,定义validator的名称和class路径。扩展增加的校验器只需要在配置文件里面定义。程序会自动调用该校验器进行校验。
第二部分是每一个列对应的配置。
<item name="END_AREA" alias="目的站">
<rule type="required" level=”WARN”/>
<rule type="address"/>
<rule type=”String”>
<property name=”minLength”>1</property>
<property name=”maxLength”>5</property>
</rule>
<rule type="repeat">
<property name="unite">true</property>
</rule>
</item>
每一个列上可以对应多个规则 rule, type的值为第一部分定义的校验器的别名。Item里面的每个rule都实现自己单独的校验方式。不依赖,不干扰。每个校验器都可以定义校验级别level,校验级别涉及到后面对校验结果更灵活的处理。 每个validator也可以有自己私有的属性 property。比如需要校验某一列的值是字符串,并且长度大于 1 小于 5.则新建一个实现了 Ivalidator接口的类。定义该类的私有属性为
实现接口的方法为校验的逻辑操作
。最大长度,最小长度的值在配置文件里面配置
<rule type=”String”>
<property name=”minLength”>1</property>
<property name=”maxLength”>5</property>
</rule>。
一般情况下,校验器是针对每个列的。也就是校验器只对某列的内容进行校验。特殊情况下,我们需要对 多个列之间的内容进行联合校验。比如校验 假入有两列内容重复话,校验结果就判定这两行内容是重复的。可以在配置文件中进行如下配置。
<item name="FROM_AREA" alias="始发站" description="">
<rule type="repeat">
<property name="unite">true</property>
</rule>
</item>
<item name="END_AREA" alias="目的站">
<rule type="repeat">
<property name="unite">true</property>
</rule>
</item>
<!-- 重复性校验 -->
<bean id="repeat" alias="始发站" description="">
<rule type="required"/>
<rule type="address"/>
<rule type="repeat">
<property name="unite">true</property>
</rule>
</item>
<item name="END_AREA" alias="目的站">
<rule type="required"/>
<rule type="address"/>
<rule type="repeat">
<property name="unite">true</property>
</rule>
</item>
<item name="VOLUME_RATE" alias="轻货费率">
<rule type="required"/>
<rule type="integer">
<property name="scale">+</property>
</rule>
</item>
<item name="WEIGHT_RATE" alias="重货费率">
<rule type="required"/>
<rule type="float">
<property name="scale">+</property>
<property name="precision">2</property>
</rule>
</item>
<item name="PER_LOWEST_PRICE" alias="最低一票">
<rule type="required"/>
<rule type="integer">
<property name="scale">+</property>
</rule>
</item>
<item name="TRANSPORT_TIME" alias="运行时效">
<rule type="required"/>
</item>
<item name="TRANSPORT_TYPE_CODE" alias="运输方式">
<rule type="required"/>
<rule type="transportType"/>
<rule type="repeat">
<property name="unite">true</property>
</rule>
</item>
<item name="PRICE_PATTERN" alias="运价模式">
<rule type="valueBoundValidator" level="error">
<property name="bound">D2S|D2D|S2D|S2S</property>
</rule>
<rule type="repeat">
<property name="unite">true</property>
</rule>
</item>
<item name="COMPANY_CODE" alias="物流公司编号">
<rule type="required"/>
<rule type="company"/>
<rule type="repeat">
<property name="unite">true</property>
</rule>
</item>
</items>
</data-validate-config>