最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

新版POI獲取日期類型cell值過程圖解

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

使用POI讀取Excel值的同學,一定為日期類型抓狂過!

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

網上大部分的方法是:

cell.getCellType()

但是在新版的POI中,比如3.15版,這個寫法已經被放棄使用了。由于項目需要在下不能調整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中的日期格式也是不固定的,還需要另謀出路。

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

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

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

這種解決辦法當然是不好的,肯定是有一種好的方法我沒找到,如果哪位大俠找到了,煩請告知一聲,在下拜謝了!

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

然后想,要不寫個正則表達式,通過判斷字符串的方式,來判斷出這種日期類型??拥?,正則不會寫。。。。。。。明明感覺很簡單的,就是不對

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

/**
   * 分多種格式解析單元格的值
   *
   * @param cell 單元格
   * @return 單元格的值
   */
  public static String convertCellToString(Cell cell){
    //如果為null會拋出異常,應當返回空字符串
    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;
  }

同學們慢慢理解吧,代碼雖然挫了一點,也不能保證完全正確,但至少這種情況下是可以使用的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java實現(xiàn)KFC點餐小程序

    java實現(xiàn)KFC點餐小程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)KFC點餐系統(tǒng)小程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 關于SpringBoot mysql數(shù)據(jù)庫時區(qū)問題

    關于SpringBoot mysql數(shù)據(jù)庫時區(qū)問題

    在后端開發(fā)過程中經常會遇到幾個時區(qū)設置問題,今天分幾種情況給大家介紹SpringBoot mysql數(shù)據(jù)庫時區(qū)問題,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • Java中的線程安全集合CopyOnWriteArrayList解析

    Java中的線程安全集合CopyOnWriteArrayList解析

    這篇文章主要介紹了Java中的線程安全CopyOnWriteArrayList解析,CopyOnWriteArrayList是ArrayList的線程安全版本,從他的名字可以推測,CopyOnWriteArrayList是在有寫操作的時候會copy一份數(shù)據(jù),然后寫完再設置成新的數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • SpringMVC @ResponseBody 415錯誤處理方式

    SpringMVC @ResponseBody 415錯誤處理方式

    這篇文章主要介紹了SpringMVC @ResponseBody 415錯誤處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 使用Apache Ignite實現(xiàn)Java數(shù)據(jù)網格

    使用Apache Ignite實現(xiàn)Java數(shù)據(jù)網格

    今天我們來探討如何使用Apache Ignite來實現(xiàn)Java數(shù)據(jù)網格,Apache Ignite是一個高性能的內存計算平臺,它提供了分布式緩存、數(shù)據(jù)網格和計算功能,可以顯著提高大規(guī)模應用的數(shù)據(jù)處理性能,感興趣的小伙伴跟著小編一起來看看吧
    2024-08-08
  • 簡單了解如何在spring中使用RabbitMQ

    簡單了解如何在spring中使用RabbitMQ

    這篇文章主要介紹了簡單了解如何在spring中使用RabbitMQ,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 淺析java程序中hibernate的應用總結

    淺析java程序中hibernate的應用總結

    hibernate可以理解為是一個中間件它負責把java程序的sql語句接收過來發(fā)送到數(shù)據(jù)庫,而數(shù)據(jù)庫返回來的信息hibernate接收之后直接生成一個對象傳給java
    2013-07-07
  • 詳解 Java HashMap 實現(xiàn)原理

    詳解 Java HashMap 實現(xiàn)原理

    這篇文章主要介紹了詳解 Java HashMap 實現(xiàn)原理的相關資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • SpringBoot+ThreadLocal+AbstractRoutingDataSource實現(xiàn)動態(tài)切換數(shù)據(jù)源

    SpringBoot+ThreadLocal+AbstractRoutingDataSource實現(xiàn)動態(tài)切換數(shù)據(jù)源

    最近在做業(yè)務需求時,需要從不同的數(shù)據(jù)庫中獲取數(shù)據(jù)然后寫入到當前數(shù)據(jù)庫中,因此涉及到切換數(shù)據(jù)源問題,所以本文采用ThreadLocal+AbstractRoutingDataSource來模擬實現(xiàn)dynamic-datasource-spring-boot-starter中線程數(shù)據(jù)源切換,需要的朋友可以參考下
    2023-08-08
  • 解決安裝mysqlclient的時候出現(xiàn)Microsoft Visual C++ 14.0 is required報錯

    解決安裝mysqlclient的時候出現(xiàn)Microsoft Visual C++ 14.0 is required報錯

    這篇文章主要介紹了解決安裝mysqlclient的時候出現(xiàn)Microsoft Visual C++ 14.0 is required報錯問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11

最新評論

涿州市| 尚志市| 朔州市| 楚雄市| 白玉县| 永丰县| 任丘市| 江孜县| 即墨市| 右玉县| 枝江市| 田阳县| 左权县| 饶平县| 喀什市| 太仓市| 常宁市| 青岛市| 瓮安县| 大港区| 分宜县| 沙雅县| 大同县| 东阿县| 元谋县| 泊头市| 宿松县| 茶陵县| 左云县| 和平区| 阿拉善右旗| 慈利县| 银川市| 城市| 清徐县| 历史| 阿巴嘎旗| 凌海市| 抚顺市| 焉耆| 尼勒克县|