POI实现excel各种验证和导入的思路总结

  •    制定标准

       导入总是与导出相辅相成的,无规矩不成方圆。所谓的标准都是大家一同来维护和遵守的,那么首先就是制定一个模板。

       这样可以减少验证的工作量。

       例如时间的规范【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(),那么证明存在数据,并且可以获取到重复的数据。

  

 

posted @ 2013-11-01 17:34  爱笑的狐狸  阅读(10690)  评论(0编辑  收藏  举报