2009-05-14 13 views
30

JavaでのExcelの操作にPOI HSSF APIを使用しています。私のExcelセルの1つに日付値「8/1/2009」があり、HSSF APIを使用してこの値を読み取ろうとすると、セルタイプがNumericとして検出され、自分の日付の「Double」値が返されます。以下のサンプルコードを参照してください:POI HSSF APIを使用してExcelセルから日付の値を読み取る

cell = row.getCell(); // date in the cell '8/1/2009' 
switch (cell.getCellType()) { 

case HSSFCell.CELL_TYPE_STRING: 
    cellValue = cell.getRichStringCellValue().getString(); 
    break; 
case HSSFCell.CELL_TYPE_NUMERIC: 
    cellValue = new Double(cell.getNumericCellValue()).toString(); 
    break; 
default: 
} 

Cell.getCellTypeを()NUMERIC_TYPEを返すので、このコードは倍増する日付を変換! :(

は、それがHSSF POIであるとして、日付を読み込む方法はあります

答えて

37

あなたが見て取ることができる:!?詳細は、POI恐ろしいスプレッドシート形式のAPIを参照してください

HSSFDateUtil.isCellDateFormatted() 

HSSFDateUtilに:また、エクセルgetExcelDate()返すためのいくつかのヘルパーメソッドを提供

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFDateUtil.html

とJavaをさかのぼり。あなたは、しかし

...しかし...

+8

私はそれらのPOI開発者がソースコードをコメントしてほしい... DateUtil.isCellDateFormattedを(呼び出す Jon

+2

)がHSSFsとXSSFsからあなたのコードを解放する方法で、一歩先になります。 XLS/XLSX依存のHSSF/XSSF子どもの代わりにグローバルな親を使用することで、コードを非常に普遍的なものにすることができます。 –

6

Excelが...数値として日付と時刻を扱うジョンが良いことを言ったので、私はここで彼をエコーし​​ません異なる日付形式のやや警戒する必要がありますあなたは以下の

cell.getDateCellValue()メソッドを使用することができPOI 3.5を使用している場合は、質問に置かれている何のためのサンプルコードはhttp://poi.apache.org/spreadsheet/quick-guide.html#CellContents

+0

リンクありがとう – nantitv

6

です。これは2007年も同様に機能します。

20

Excelファイルと同じ形式で日付を参照する場合は、CellDateFormatterを使用する必要があります。サンプルコード:

CellValue cValue = formulaEv.evaluate(cell); 
double dv = cValue.getNumberValue(); 
if (HSSFDateUtil.isCellDateFormatted(cell)) { 
    Date date = HSSFDateUtil.getJavaDate(dv); 

    String dateFmt = cell.getCellStyle().getDataFormatString(); 
    /* strValue = new SimpleDateFormat(dateFmt).format(date); - won't work as 
    Java fmt differs from Excel fmt. If Excel date format is mm/dd/yyyy, Java 
    will always be 00 for date since "m" is minutes of the hour.*/ 

    strValue = new CellDateFormatter(dateFmt).format(date); 
    // takes care of idiosyncrasies of Excel 
} 
+0

このようにして生の列の値が得られます。 – Makky

0

POI 3.15 beta3以降の機能の一部はdeprecatedです。 データフォーマットをチェックし、Java Dateとして取り出すことができます。

SimpleDateFormat format = new SimpleDateFormat(""); 
String cellValue; 
if(cell != null && cell.getCellTypeEnum() != CellType.STRING && 
    cell.getCellTypeEnum() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)){ 

    cellValue = format.format(cell.getDateCellValue()); 
} 
関連する問題