1 背景
项目中经常会遇到Excel模板的导入,其中一个重要功能是对模板中的数据进行错误检查。由于模板中每个字段的类型和取值范围不同,检查时既要给出错误数据也要能够提示错误原因,以便用户定位修正。实现该功能时主要遇到了以下问题:
1. 当模板中出现多处错误时要如何向用户展示?
2. 如何应用到所有模板,而不用每个模板都重新开发?
2 解决方案
2.1 先简单说下我们针对上述两个问题的解决方案:
1. 在模板的基础上增加一个错误信息列,当一行存在错误数据时,填写该行每个错误数据的错误原因,并将底色设置为红色,同时将错误数据所在列的列头以及错误数据所在单元格的底色设为红色,最后将修改后的模板文件返回给用户
2. 采用xml配置文件的方式定义每个模板要检查的列及列的类型、取值范围等,这样如果有新增模板需要导入,只需在该配置文件中增加该模板的检查项即可
2.2 下面对每个部分做下介绍:
2.2.1 列检查器
列检查器是这个功能里最关键的部分,它的输入输出见下图
- 数据指当前检查的单元格的字符串
- 检查器指当前检查单元格所在列的检查器
- 检查信息指对单元格的检查结果,包括是否通过、错误的具体原因
在列检查器的设计中我们采用了责任链的方式。每个检查器在对数据进行检查后,如果数据出现错误,则直接返回检查不通过和错误原因;如果数据没有错误且存在后继检查器时,将数据传给下个检查器继续检查(某些特殊检查器在数据没错时不会传递给后继检查器,例如列可空检查器),否则直接返回检查不通过和错误原因。具体的检查器接口如下:
package com.example;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 检查错误信息类
*
*/
class CheckDetail{
//检查是否通过
privatebooleanisPassed=false;
//检查不通过时的错误详细信息
private String detail="";
publicCheckDetail(boolean isPassed,String detail){
this.isPassed=isPassed;