新版POI獲取日期類型cell值過程圖解
使用POI讀取Excel值的同學(xué),一定為日期類型抓狂過!
POI對單元格日期處理很弱,沒有針對的類型,日期類型取出來的也是一個double值,所以同樣作為數(shù)值類型。即使使用cell.setCellType(CellType.STRING) 也還是會返回一個數(shù)字
網(wǎng)上大部分的方法是:
cell.getCellType()
但是在新版的POI中,比如3.15版,這個寫法已經(jīng)被放棄使用了。由于項目需要在下不能調(diào)整jar包,只好硬著頭皮去解決。
后來發(fā)現(xiàn)了一個方法:
cell.getCellStyle().getDataFormatString() 可以判斷單元格的格式類型,如下圖
于是便可以使用如下方法判斷:
if("yyyy/mm;@".equals(cell.getCellStyle().getDataFormatString()) || "m/d/yy".equals(cell.getCellStyle().getDataFormatString()) || "yy/m/d".equals(cell.getCellStyle().getDataFormatString()) || "mm/dd/yy".equals(cell.getCellStyle().getDataFormatString()) || "dd-mmm-yy".equals(cell.getCellStyle().getDataFormatString())|| "yyyy/m/d".equals(cell.getCellStyle().getDataFormatString())){ return new SimpleDateFormat("yyyy/MM/dd").format(cell.getDateCellValue()); }
使用這個方法判斷的格式有限,如果能夠限定單元格格式的話,這樣是足夠解決的。
但我的項目坑爹的是Excel中的日期格式也是不固定的,還需要另謀出路。
在調(diào)試的時候發(fā)現(xiàn),明明就顯示著這個cell的值,是個日期。
如上圖,這個日期【31-一月-2005】并不在這個cell下的某一個子元素里,至少我找了很久是沒找到。只能使用cell.toString() 得到
最后我的解決辦法是:首先使用了cell.getCellStyle().getDataFormatString()判斷,如果能得到就返回“yyyy/MM/dd”格式的日期。如果得不到,最后都返回cell.toString()。這樣至少不會返回一個數(shù)字了,也不知道對其他類型的單元格有沒有影響,目前跑了幾張表沒有報錯
這種解決辦法當(dāng)然是不好的,肯定是有一種好的方法我沒找到,如果哪位大俠找到了,煩請告知一聲,在下拜謝了!
到最后果然還是找我麻煩了,【31-一月-2005】格式不行,必須轉(zhuǎn)成“yyyy/MM/dd”格式。
然后想,要不寫個正則表達(dá)式,通過判斷字符串的方式,來判斷出這種日期類型。坑爹了,正則不會寫。。。。。。。明明感覺很簡單的,就是不對
再然后,耍小聰明,改成通過使用java中的字符串分割一點點判斷,先放代碼:
/** * 分多種格式解析單元格的值 * * @param cell 單元格 * @return 單元格的值 */ public static String convertCellToString(Cell cell){ //如果為null會拋出異常,應(yīng)當(dāng)返回空字符串 if (cell == null) return ""; //POI對單元格日期處理很弱,沒有針對的類型,日期類型取出來的也是一個double值,所以同樣作為數(shù)值類型 //解決日期2006/11/02格式讀入后出錯的問題,POI讀取后變成“02-十一月-2006”格式 if(cell.toString().contains("-") && checkDate(cell.toString())){ String ans = ""; try { ans = new SimpleDateFormat("yyyy/MM/dd").format(cell.getDateCellValue()); } catch (Exception e) { ans = cell.toString(); } return ans; } cell.setCellType(CellType.STRING); return cell.getStringCellValue(); } /** * 判斷是否是“02-十一月-2006”格式的日期類型 */ private static boolean checkDate(String str){ String[] dataArr =str.split("-"); try { if(dataArr.length == 3){ int x = Integer.parseInt(dataArr[0]); String y = dataArr[1]; int z = Integer.parseInt(dataArr[2]); if(x>0 && x<32 && z>0 && z< 10000 && y.endsWith("月")){ return true; } } } catch (Exception e) { return false; } return false; }
同學(xué)們慢慢理解吧,代碼雖然挫了一點,也不能保證完全正確,但至少這種情況下是可以使用的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot中事務(wù)管理@Transactional的注意事項與使用場景
今天小編就為大家分享一篇關(guān)于springboot中事務(wù)管理@Transactional的注意事項與使用場景,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04JavaWeb實現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過程
學(xué)生信息管理系統(tǒng)是針對學(xué)校人事處的大量業(yè)務(wù)處理工作而開發(fā)的管理軟件,主要用于學(xué)校學(xué)生信息管理,下面這篇文章主要給大家介紹了關(guān)于JavaWeb實現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過程,需要的朋友可以參考下2023-05-05Spring security實現(xiàn)記住我下次自動登錄功能過程詳解
這篇文章主要介紹了Spring security實現(xiàn)記住我下次自動登錄功能過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03完美解決MybatisPlus插件分頁查詢不起作用總是查詢?nèi)繑?shù)據(jù)問題
這篇文章主要介紹了解決MybatisPlus插件分頁查詢不起作用總是查詢?nèi)繑?shù)據(jù)問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08使用Kubernetes和Docker部署Java微服務(wù)詳細(xì)代碼
Java微服務(wù)項目是一種基于Java技術(shù)棧的分布式系統(tǒng)開發(fā)方式,下面這篇文章主要給大家介紹了關(guān)于使用Kubernetes和Docker部署Java微服務(wù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07