java excel 导入 加校验_POI实现excel各种验证和导入的思路总结
制定標(biāo)準(zhǔn)
導(dǎo)入總是與導(dǎo)出相輔相成的,無規(guī)矩不成方圓。所謂的標(biāo)準(zhǔn)都是大家一同來維護(hù)和遵守的,那么首先就是制定一個模板。
這樣可以減少驗證的工作量。
例如時間的規(guī)范【yyyy-MM-dd】,獲取單元格的時間值用下面的方法
java.util.Date date= cell.getDateCellValue();
但是如果用戶不合法輸入,那么將會報IllegalStateException異常,此時我們可以進(jìn)行錯誤的捕獲和處理
導(dǎo)入的前提的數(shù)據(jù)是合法的,因此驗證數(shù)據(jù)是非常必要的,數(shù)據(jù)的格式就要大家要遵守了。但是嚴(yán)謹(jǐn)而已,還是必須考慮用戶的非法操作。
模板的標(biāo)識
每個模板都有對應(yīng)的標(biāo)識,不可能隨便什么數(shù)據(jù)都可以往數(shù)據(jù)庫表對象中塞的,因此要設(shè)計一個標(biāo)識符用于區(qū)分模板。
標(biāo)識符必須是唯一的,可以識別的。通常都是指定導(dǎo)入對象的主鍵為標(biāo)識符。
模板校驗
如果模板限定了可以編輯區(qū)域,那么只是需要驗證標(biāo)識符即可。但是往往我們需要復(fù)制大量的數(shù)據(jù),因此不可能設(shè)置保護(hù)模式,這個時候需要對模板進(jìn)行格式校驗。
校驗包括模版格式校驗、數(shù)據(jù)合法性校驗,數(shù)據(jù)范圍校驗等等。
如果各種校驗都用java程序來判斷,那么數(shù)據(jù)量很大的時候,處理和執(zhí)行速度會非常的慢。經(jīng)過幾天研究,發(fā)現(xiàn)善于利用oracle的語句可以使效率提高幾十倍,前提
是數(shù)據(jù)都放在數(shù)據(jù)庫中。
因此,除了簡單的檢驗之后,我們可以將excel的數(shù)據(jù)放入到數(shù)據(jù)庫創(chuàng)建的臨時表或者日志表中,進(jìn)行數(shù)據(jù)的校驗。
創(chuàng)建的數(shù)據(jù)臨時表必須滿足兩個條件,第一是含有模板標(biāo)識符,第二是有一列指標(biāo)用于存與excel對應(yīng)的行數(shù)。
這樣方便返回錯誤詳細(xì)信息,告訴用戶哪行哪列數(shù)據(jù)出現(xiàn)問題。
下面是幾種簡單的校驗,非常實用:
@ 檢驗excel的數(shù)據(jù)是否重復(fù)(數(shù)據(jù)重復(fù)的標(biāo)準(zhǔn)是某幾列的值是否相等,即數(shù)據(jù)唯一標(biāo)識)
我們不需要循環(huán)excel一一對比,我們完全可以使用oracle函數(shù)實現(xiàn)數(shù)據(jù)重復(fù)檢查
select distinct substr(數(shù)據(jù)唯一標(biāo)識列數(shù)據(jù)) as rn from 數(shù)據(jù)臨時表 a
where rowid !=(select max(rowid) from 數(shù)據(jù)臨時表 b where 數(shù)據(jù)唯一標(biāo)識列數(shù)據(jù)相等
得到的數(shù)據(jù)是去除重復(fù)的數(shù)據(jù),只要小于總條數(shù)(excel的行數(shù)lastRow),那么就可以知道重復(fù)的數(shù)據(jù)。
@ 檢驗導(dǎo)入的數(shù)據(jù)是否已經(jīng)存在
select columns from 數(shù)據(jù)正式表 INTERSECT (select?columns from 數(shù)據(jù)臨時表 where ..);
只要rs.next(),那么證明存在數(shù)據(jù),并且可以獲取到重復(fù)的數(shù)據(jù)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的java excel 导入 加校验_POI实现excel各种验证和导入的思路总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金庸群侠传5 自动化脚本 绝情谷大厅开宝
- 下一篇: C语言定义:__DATE__和_TIME