POI讀取Excel時資料型別轉換的問題

2021-09-02 12:04:53 字數 1819 閱讀 4234

1. 數值型別處理

通過poi取出的數值預設都是double,即使excel單元格中存的是1,取出來的值也是1.0,這就造成了一些問題,如果資料庫欄位是int,那麼就會wrong data type,所以需要對數值型別處理。

cell cell = null;// 單元格

object inputvalue = null;// 單元格值

if(!isempty(cell) && cell.getcelltype() == cell.cell_type_numeric)

這麼處理後,單元格中的小數沒有變化,如果是整數,也會取到整數。

注:由於電子**只能支援15位數值的顯示,當數值大於15位時會造成資料丟失,所以對於處理大於15位的學號身份證號等數值資訊,建議以text格式儲存,在讀取的時候:

long id=new long(cell.tosting());

2. 日期型別處理

很遺憾,poi對單元格日期處理很弱,沒有針對的型別,日期型別取出來的也是乙個double值,所以同樣作為數值型別。

cell cell = null;// 單元格

object inputvalue = null;// 單元格值

if(!isempty(cell) && cell.getcelltype() == cell.cell_type_numeric)

轉換成timestamp格式:

timestamp time=new timestamp(inputvalue.gettime());

可以判斷得到的date是日期時間、日期還是時間,可以通過cell.getcellstyle().getdataformat()來判斷,這個返回值沒有乙個常量值來對應,我本機是excel2013,測試結果是日期時間(yyyy-mm-dd hh:mm:ss) - 22,日期(yyyy-mm-dd) - 14,時間(hh:mm:ss) - 21,年月(yyyy-mm) - 17,時分(hh:mm) - 20,月日(mm-dd) - 58,有了這個,可以根據資料庫字段型別,處理之後再入庫,相當不方便。

另外,如果單元格資料格式是自定義的日期格式,那麼通過dateutil.iscelldateformatted(cell)判斷不出來,而且該單元格還是乙個數值單元格,返回乙個double值,這裡比較2。針對這種方式,有兩種解決方案,第一種,重寫dateutil.iscelldateformatted(cell)方法,開源的都有原始碼;第二種,cell.getcellstyle().getdataformatstring()來判斷,這個方法會返回格式字串,通過這個字串去匹配,再處理。

附單元格資料型別:

|cell.cell_type_numeric 數值型別 cell.getnumericcellvalue()||或cell.getdatecellvalue()|

|cell.cell_type_string 字串型別 cell.getstringcellvalue()||或cell.tostring()|

|cell.cell_type_boolean 布林型別 cell.getbooleancellvalue()|

|cell.cell_type_formula 表示式型別 cell.getcellformula()|

|cell.cell_type_error 異常型別||不知道何時算異常 cell.geterrorcellvalue()|

|cell.cell_type_blank 空,不知道何時算空 空就不要取值了吧|

poi讀取excel元素

忽略元資料末尾 回到原資料開始處 org.apache.poi poi3.11 beta2 org.apache.poi poi ooxml 3.11 其中poi ooxml是為讀取xlsx特意引入,切要和poi版本一致 inputstream is new fileinputstream e xs...

poi 匯入Excel封裝 並處理資料型別

最近正在做oa,需求需要匯入匯出excel 功能和方法使用起來挺簡單,做起來發現型別問題比較坑,自己稍微封裝了一下,對於不想匯入的字段 自定義乙個註解,在實體類中的屬性上標註,相應的excel中也不該有該字段 有一點不好的是 excel中欄位順序需要和實體類中屬性順序一致,且有自定義註解的屬性不應該...

POI讀取Excel資料日期時間輸出

poi讀取excel單元格的資料,不同的資料型別有不同的讀取方法,因此要讀取資料必須先判斷單元格的資料型別,poi定義了numeric數值型,把日期時間也當作數值進行儲存,所以我們讀取時先判斷為數值numeric型別,再用dateutil.iscelldateformatted cell 來判斷是不...