- 制定標准
導入總是與導出相輔相成的,無規矩不成方圓。所謂的標准都是大家一同來維護和遵守的,那么首先就是制定一個模板。
這樣可以減少驗證的工作量。
例如時間的規范【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(),那么證明存在數據,並且可以獲取到重復的數據。