- 制定标准
导入总是与导出相辅相成的,无规矩不成方圆。所谓的标准都是大家一同来维护和遵守的,那么首先就是制定一个模板。
这样可以减少验证的工作量。
例如时间的规范【yyyy-MM-dd】,获取单元格的时间值用下面的方法
java.util.Date date= cell.getDateCellValue();
但是如果用户不合法输入,那么将会报IllegalStateException异常,此时我们可以进行错误的捕获和处理
导入的前提的数据是合法的,因此验证数据是非常必要的,数据的格式就要大家要遵守了。但是严谨而已,还是必须考虑用户的非法操作。
- 模板的标识
每个模板都有对应的标识,不可能随便什么数据都可以往数据库表对象中塞的,因此要设计一个标识符用于区分模板。
标识符必须是唯一的,可以识别的。通常都是指定导入对象的主键为标识符。
- 模板校验
如果模板限定了可以编辑区域,那么只是需要验证标识符即可。但是往往我们需要复制大量的数据,因此不可能设置保护模式,这个时候需要对模板进行格式校验。
校验包括模版格式校验、数据合法性校验,数据范围校验等等。
如果各种校验都用java程序来判断,那么数据量很大的时候,处理和执行速度会非常的慢。经过几天研究,发现善于利用oracle的语句可以使效率提高几十倍,前提
是数据都放在数据库中。
因此,除了简单的检验之后,我们可以将excel的数据放入到数据库创建的临时表或者日志表中,进行数据的校验。
创建的数据临时表必须满足两个条件,第一是含有模板标识符,第二是有一列指标用于存与excel对应的行数。
这样方便返回错误详细信息,告诉用户哪行哪列数据出现问题。
下面是几种简单的校验,非常实用:
@ 检验excel的数据是否重复(数据重复的标准是某几列的值是否相等,即数据唯一标识)
我们不需要循环excel一一对比,我们完全可以使用oracle函数实现数据重复检查
select distinct substr(数据唯一标识列数据) as rn from 数据临时表 a
where rowid !=(select max(rowid) from 数据临时表 b where 数据唯一标识列数据相等
得到的数据是去除重复的数据,只要小于总条数(excel的行数lastRow),那么就可以知道重复的数据。
@ 检验导入的数据是否已经存在
select columns from 数据正式表 INTERSECT (select columns from 数据临时表 where ..);
只要rs.next(),那么证明存在数据,并且可以获取到重复的数据。