POI Excel読み出し時のデータタイプ変換の問題

2243 ワード

1.数値種別の処理
POIで取り出した数値はデフォルトではdoubleです。エクセルセルの中に1が存在していても、取り出した値は1.0です。これはいくつかの問題を引き起こします。データベースフィールドがintであれば、wrong data typeになりますので、数値の種類に対して処理する必要があります。

Cell cell = null;//
Object inputValue = null;//
if(!isEmpty(cell) && cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
long longVal = Math.round(cell.getNumericCellValue());
if(Double.parseDouble(longVal + ".0") == doubleVal)
inputValue = longVal;
else
inputValue = doubleVal;
}
このように処理すると、セルの小数点は変化しません。整数であれば、整数も取れます。
注:表計算ドキュメントは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) {
if(DateUtil.isCellDateFormatted(c))//
inputValue = cell.getDateCellValue();//java.util.Date
}
Timestampフォーマットに変換:
Timestamp time=new Timestamp(inputValue.getTime());
得られたDateは日付時間、日付または時間であると判断できます。cell.getCelSteyle().getData Format()によって判断できます。この戻り値は定数値なしで対応しています。本機はexcel 2013で、テスト結果は日付時間(yyy-M-dd HH:ss)-22、日付(ymy-Hdd)これがあったら、データベースフィールドの種類によって処理してから入庫することができます。かなり不便です。
また、セルのデータフォーマットがカスタムの日付書式であれば、DateUtil.isCelDateFormatedでは判断できません。また、このセルは数値セルなので、doubleの値を返します。ここで2を比較します。このような方式に対して、2つの解決策があります。1つ目は、DateUtil.isCelDateFormated(cell)方法を書き直して、ソースのソースがあります。二つ目は、セル.get CelStyle().get Data FormatString()によって判定され、この方法は書式文字列に戻り、この文字列でマッチングして処理される。
添付のセルのデータタイプ:
|Cel.Cell.Cell.ELL_TYPE_NUMERIC数値タイプのセル.getNumeric CelValue()またはcell.get DateCelValue()
|Cel.Cell.Cell.ELL_TYPE_STRING文字列タイプのセル.get String CelValue()またはセル.toStering()124
|Cel.Cell.Cell.ELL_TYPE_BOOLEANブールタイプのセル.get Boolean CelValue()
|Cel.Cell.Cell.ELL_TYPE_フォーミュラ式タイプのセル.getCelFormula()
|Cel.Cell.Cell.ELL_TYPE_ERROR異常タイプはいつ異常と計算されますか?
|Cel.Cell.Cell.ELL_TYPE_BLANK空、いつ暇か分かりませんが、値を取らないようにしましょう。