zoukankan      html  css  js  c++  java
  • 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(),那么证明存在数据,并且可以获取到重复的数据。

      

     

  • 相关阅读:
    阶乘递归实现
    队列
    1+2+3+...+100用递归实现
    快速排序C语言实现
    js的onfocus,onblur事件
    CSP2021 游记 菜到离谱
    700题复习计划
    [传递闭包] P2881 [USACO07MAR]排名的牛Ranking the Cows
    【笔记】序列分块
    【题解】UVA10930 A-Sequence
  • 原文地址:https://www.cnblogs.com/zhutouying/p/3402354.html
Copyright © 2011-2022 走看看