2022-03-16 java通過poi讀取excel中的日期類型數(shù)據(jù)或自定義類型日期

java通過poi讀取excel中的日期類型數(shù)據(jù)或自定義類型日期

Java 讀取Excel表格日期類型數(shù)據(jù)的時候,讀出來的是這樣的 ?12-十月-2019,而Excel中輸入的是 2019/10/12 或 2019-10-12

poi處理excel時,當(dāng)excel沒有明確指明是哪個類型的數(shù)據(jù)時,poi很可能處理單元格的日期數(shù)據(jù)時就有可能是一串?dāng)?shù)字,而使用java程序基本無法轉(zhuǎn)換。

為了解決以上的問題,本人收集了各種資料,目前來總結(jié)一下,供碰到此類問題的你作參考。

Excel數(shù)據(jù)處理:

Excel存儲日期、時間均以數(shù)值類型進(jìn)行存儲,讀取時POI先判斷是是否是數(shù)值類型,再進(jìn)行判斷轉(zhuǎn)化

1、數(shù)值格式(CELL_TYPE_NUMERIC):

1.純數(shù)值格式:getNumericCellValue() 直接獲取數(shù)據(jù)

2.日期格式處理yyyy-MM-dd, d/m/yyyy h:mm,?HH:mm?等不含文字的日期格式

1).判斷是否是日期格式:HSSFDateUtil.isCellDateFormatted(cell)

所有日期格式都可以通過getDataFormat()值來判斷

yyyy-MM-dd-----14yyyy年m月d日---31yyyy年m月-------57m月d日? ----------58HH:mm-----------20h時mm分? -------32

接下來是針對excel各種數(shù)據(jù)類型來進(jìn)入轉(zhuǎn)換,基本涵蓋所需要的,如果沒有你需要的,可以在此基礎(chǔ)上添加

//獲取單元格各類型值,返回字符串類型publicstatic String getCellValueByCell(Cell cell) {

? ? ? ? //判斷是否為null或空串if(cell==null|| cell.toString().trim().equals("")) {

? ? ? ? ? ? return"";

? ? ? ? }

? ? ? ? String cellValue ="";

? ? ? ? intcellType=cell.getCellType();

? ? ? ? switch (cellType) {

? ? ? ? caseCell.CELL_TYPE_NUMERIC:// 數(shù)字shortformat = cell.getCellStyle().getDataFormat();

? ? ? ? ? ? if (DateUtil.isCellDateFormatted(cell)) {

? ? ? ? ? ? ? ? SimpleDateFormat sdf =null;?

? ? ? ? ? ? ? ? //System.out.println("cell.getCellStyle().getDataFormat()="+cell.getCellStyle().getDataFormat());if(format ==20|| format ==32) {?

? ? ? ? ? ? ? ? ? ? sdf =newSimpleDateFormat("HH:mm");?

? ? ? ? ? ? ? ? } elseif(format ==14|| format ==31|| format ==57|| format ==58) {?

? ? ? ? ? ? ? ? ? ? // 處理自定義日期格式:m月d日(通過判斷單元格的格式id解決,id的值是58)? sdf =newSimpleDateFormat("yyyy-MM-dd");?

? ? ? ? ? ? ? ? ? ? doublevalue = cell.getNumericCellValue();?

? ? ? ? ? ? ? ? ? ? Date date = org.apache.poi.ss.usermodel.DateUtil?

? ? ? ? ? ? ? ? ? ? ? ? ? ? .getJavaDate(value);?

? ? ? ? ? ? ? ? ? ? cellValue = sdf.format(date);?

? ? ? ? ? ? ? ? }else{// 日期? sdf =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");?

? ? ? ? ? ? ? ? }?

? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? cellValue = sdf.format(cell.getDateCellValue());// 日期}catch (Exception e) {

? ? ? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? ? ? thrownewException("exception on get date data !".concat(e.toString()));

? ? ? ? ? ? ? ? ? ? } catch (Exception e1) {

? ? ? ? ? ? ? ? ? ? ? ? e1.printStackTrace();

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }finally{

? ? ? ? ? ? ? ? ? ? sdf =null;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }? else {

? ? ? ? ? ? ? ? BigDecimal bd =new BigDecimal(cell.getNumericCellValue());

? ? ? ? ? ? ? ? cellValue = bd.toPlainString();// 數(shù)值 這種用BigDecimal包裝再獲取plainString,可以防止獲取到科學(xué)計數(shù)值? ? ? ? ? ? }

? ? ? ? ? ? break;

? ? ? ? caseCell.CELL_TYPE_STRING:// 字符串cellValue = cell.getStringCellValue();

? ? ? ? ? ? break;

? ? ? ? caseCell.CELL_TYPE_BOOLEAN:// BooleancellValue = cell.getBooleanCellValue()+"";;

? ? ? ? ? ? break;

? ? ? ? caseCell.CELL_TYPE_FORMULA:// 公式cellValue = cell.getCellFormula();

? ? ? ? ? ? break;

? ? ? ? caseCell.CELL_TYPE_BLANK:// 空值cellValue ="";

? ? ? ? ? ? break;

? ? ? ? caseCell.CELL_TYPE_ERROR:// 故障cellValue ="ERROR VALUE";

? ? ? ? ? ? break;

? ? ? ? default:

? ? ? ? ? ? cellValue ="UNKNOW VALUE";

? ? ? ? ? ? break;

? ? ? ? }

? ? ? ? return cellValue;

? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容