POI讀取Excel常見問題

2021-06-18 00:54:24 字數 1758 閱讀 8748

最近在做乙個將excel匯入到報表中的功能,使用了poi來實現,發現poi使用有諸多不便之處,先記錄下來,以後可能考慮使用openxml。

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)

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

2. 日期型別處理

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

cell cell = null;// 單元格

object inputvalue = null;// 單元格值

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

可以判斷得到的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()來判斷,這個方法會返回格式字串,通過這個字串去匹配,再處理。

3. 資料有效性

很奇怪,poi能生成資料有效性(下拉列表),卻得不到,或者說我沒找到方法去得到,蛋疼。

附單元格資料型別:

常量說明

取值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解析最常見的問題

excel儲存日期 時間均以數值型別進行儲存,讀取時poi先判斷是是否是數值型別,再進行判斷轉化 1 數值格式 cell type numeric 1.純數值格式 getnumericcellvalue 直接獲取資料 2.日期格式 處理yyyy mm dd,d m yyyy h mm,hh mm 等...

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檔案

前幾天實現了利用poi建立excel檔案,今天分享一下如何利用poi讀取excel檔案。要讀取的檔案內容,以下截圖已給出 下面講讀取檔案內容的方法。先建立乙個讀取excel的工具類。操作excel 的功能類 public class excelreader catch ioexception e 獲...