最近在做乙個將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 獲...