欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

新版POI獲取日期類(lèi)型cell值過(guò)程圖解

 更新時(shí)間:2020年10月22日 14:38:49   作者:賈樹(shù)丙  
這篇文章主要介紹了新版POI獲取日期類(lèi)型cell值過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

使用POI讀取Excel值的同學(xué),一定為日期類(lèi)型抓狂過(guò)!

POI對(duì)單元格日期處理很弱,沒(méi)有針對(duì)的類(lèi)型,日期類(lèi)型取出來(lái)的也是一個(gè)double值,所以同樣作為數(shù)值類(lèi)型。即使使用cell.setCellType(CellType.STRING) 也還是會(huì)返回一個(gè)數(shù)字

網(wǎng)上大部分的方法是:

cell.getCellType()

但是在新版的POI中,比如3.15版,這個(gè)寫(xiě)法已經(jīng)被放棄使用了。由于項(xiàng)目需要在下不能調(diào)整jar包,只好硬著頭皮去解決。

后來(lái)發(fā)現(xiàn)了一個(gè)方法:

cell.getCellStyle().getDataFormatString() 可以判斷單元格的格式類(lèi)型,如下圖

于是便可以使用如下方法判斷:

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());
}

使用這個(gè)方法判斷的格式有限,如果能夠限定單元格格式的話(huà),這樣是足夠解決的。

但我的項(xiàng)目坑爹的是Excel中的日期格式也是不固定的,還需要另謀出路。

在調(diào)試的時(shí)候發(fā)現(xiàn),明明就顯示著這個(gè)cell的值,是個(gè)日期。

如上圖,這個(gè)日期【31-一月-2005】并不在這個(gè)cell下的某一個(gè)子元素里,至少我找了很久是沒(méi)找到。只能使用cell.toString() 得到

最后我的解決辦法是:首先使用了cell.getCellStyle().getDataFormatString()判斷,如果能得到就返回“yyyy/MM/dd”格式的日期。如果得不到,最后都返回cell.toString()。這樣至少不會(huì)返回一個(gè)數(shù)字了,也不知道對(duì)其他類(lèi)型的單元格有沒(méi)有影響,目前跑了幾張表沒(méi)有報(bào)錯(cuò)

這種解決辦法當(dāng)然是不好的,肯定是有一種好的方法我沒(méi)找到,如果哪位大俠找到了,煩請(qǐng)告知一聲,在下拜謝了!

到最后果然還是找我麻煩了,【31-一月-2005】格式不行,必須轉(zhuǎn)成“yyyy/MM/dd”格式。

然后想,要不寫(xiě)個(gè)正則表達(dá)式,通過(guò)判斷字符串的方式,來(lái)判斷出這種日期類(lèi)型??拥?,正則不會(huì)寫(xiě)。。。。。。。明明感覺(jué)很簡(jiǎn)單的,就是不對(duì)

再然后,耍小聰明,改成通過(guò)使用java中的字符串分割一點(diǎn)點(diǎn)判斷,先放代碼:

/**
   * 分多種格式解析單元格的值
   *
   * @param cell 單元格
   * @return 單元格的值
   */
  public static String convertCellToString(Cell cell){
    //如果為null會(huì)拋出異常,應(yīng)當(dāng)返回空字符串
    if (cell == null)
      return "";

    //POI對(duì)單元格日期處理很弱,沒(méi)有針對(duì)的類(lèi)型,日期類(lèi)型取出來(lái)的也是一個(gè)double值,所以同樣作為數(shù)值類(lèi)型
    //解決日期2006/11/02格式讀入后出錯(cuò)的問(wèn)題,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”格式的日期類(lèi)型
   */
  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é)們慢慢理解吧,代碼雖然挫了一點(diǎn),也不能保證完全正確,但至少這種情況下是可以使用的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot中事務(wù)管理@Transactional的注意事項(xiàng)與使用場(chǎng)景

    springboot中事務(wù)管理@Transactional的注意事項(xiàng)與使用場(chǎng)景

    今天小編就為大家分享一篇關(guān)于springboot中事務(wù)管理@Transactional的注意事項(xiàng)與使用場(chǎng)景,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • Spring?Boot日志的策略解析與門(mén)面模式

    Spring?Boot日志的策略解析與門(mén)面模式

    這篇文章主要介紹了Spring?Boot日志的策略解析與門(mén)面模式,日志對(duì)我們來(lái)說(shuō)并不陌?,通過(guò)打印日志來(lái)發(fā)現(xiàn)和定位問(wèn)題,或者根據(jù)日志來(lái)分析程序的運(yùn)行過(guò)程,Spring?Boot中的日志管理是非常重要的,需要的朋友可以參考下
    2024-05-05
  • JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過(guò)程

    JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過(guò)程

    學(xué)生信息管理系統(tǒng)是針對(duì)學(xué)校人事處的大量業(yè)務(wù)處理工作而開(kāi)發(fā)的管理軟件,主要用于學(xué)校學(xué)生信息管理,下面這篇文章主要給大家介紹了關(guān)于JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過(guò)程,需要的朋友可以參考下
    2023-05-05
  • Spring security實(shí)現(xiàn)記住我下次自動(dòng)登錄功能過(guò)程詳解

    Spring security實(shí)現(xiàn)記住我下次自動(dòng)登錄功能過(guò)程詳解

    這篇文章主要介紹了Spring security實(shí)現(xiàn)記住我下次自動(dòng)登錄功能過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring中的AOP操作你了解嗎

    Spring中的AOP操作你了解嗎

    這篇文章主要為大家詳細(xì)介紹了Spring中的AOP操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Java實(shí)現(xiàn)線(xiàn)程插隊(duì)的示例代碼

    Java實(shí)現(xiàn)線(xiàn)程插隊(duì)的示例代碼

    在編寫(xiě)多線(xiàn)程的業(yè)務(wù)時(shí),會(huì)遇到讓一個(gè)線(xiàn)程優(yōu)先于其他線(xiàn)程運(yùn)行的情況,除了可以設(shè)置線(xiàn)程的優(yōu)先級(jí)高于其他線(xiàn)程,還有更直接的方式:線(xiàn)程插隊(duì)。本文將用Java實(shí)現(xiàn)線(xiàn)程插隊(duì),需要的可以參考一下
    2022-08-08
  • 如何將Object類(lèi)轉(zhuǎn)換為實(shí)體類(lèi)

    如何將Object類(lèi)轉(zhuǎn)換為實(shí)體類(lèi)

    這篇文章主要介紹了如何將Object類(lèi)轉(zhuǎn)換為實(shí)體類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 使用spring stream發(fā)送消息代碼實(shí)例

    使用spring stream發(fā)送消息代碼實(shí)例

    這篇文章主要介紹了使用spring stream發(fā)送消息代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 完美解決MybatisPlus插件分頁(yè)查詢(xún)不起作用總是查詢(xún)?nèi)繑?shù)據(jù)問(wèn)題

    完美解決MybatisPlus插件分頁(yè)查詢(xún)不起作用總是查詢(xún)?nèi)繑?shù)據(jù)問(wèn)題

    這篇文章主要介紹了解決MybatisPlus插件分頁(yè)查詢(xún)不起作用總是查詢(xún)?nèi)繑?shù)據(jù)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 使用Kubernetes和Docker部署Java微服務(wù)詳細(xì)代碼

    使用Kubernetes和Docker部署Java微服務(wù)詳細(xì)代碼

    Java微服務(wù)項(xiàng)目是一種基于Java技術(shù)棧的分布式系統(tǒng)開(kāi)發(fā)方式,下面這篇文章主要給大家介紹了關(guān)于使用Kubernetes和Docker部署Java微服務(wù)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07

最新評(píng)論