2012-05-16 13 views
10

私はExcelファイルを読むためにApache poiライブラリを使用しています。私はパスワードセルを読んでいる間に立ち往生しています。ユーザーがパスワードセル、つまり16/05/2012にパスワードとして日付を指定した場合。値は "16/05/2012"である必要がありますが、私はこの値を "41045"と読んでいます。これは私のコードです:文字列としてExcelのセルから日付の値を読み取る

cell = row.getCell(); // date in the cell password '16/05/2012' 
switch (cell.getCellType()) { 

case HSSFCell.CELL_TYPE_STRING: 
    cellValue = cell.getRichStringCellValue().getString(); 
    break; 
case HSSFCell.CELL_TYPE_NUMERIC: 
    if(cellCount == TEMPLATE_PASSWORD) {// if cell is password 
     cell.setCellType(Cell.CELL_TYPE_STRING); 
     cellValue = cell.getRichStringCellValue().getString(); // value read is 41045 and not "16/05/2012" 
    } 
    break; 
default: 
} 

誰でも助けてもらえますか?

ありがとうございました。

+0

このスレッドを見ると、あなたの問題とほぼ同じです。 http://stackoverflow.com/questions/3148535/how-to-read-excel-cell-having-date-with-apache-poi –

+0

@mashhurあなたのリンクには、私の要件に応じて解決策はありません。 –

+0

セルのタイプが数値なので、文字列ではなく数字を受け取ると思います。パスワードセルに数値タイプが正しいと確信していますか? – ImLearning

答えて

14

Excelがファイルを書き込むと他の人が(日付を含む)の数値として格納されている間、あなたはPOIで探しているクラスは、いくつかの細胞は、リテラル文字列としてDataFormatter

保存されています。後者の場合、セルを表す浮動小数点値がファイルに格納されるため、POIに実際にあるセルの値を問い合わせるときにPOIに問い合わせます。

ただし、特にテキスト抽出(ただし必ずしもそうではありません)を行う場合は、Excelでのようにセルの値を表示したいことがあります。それをStringで正確に取得することは必ずしも可能ではありませんが(例えばフルスペース以外のパディングなど)、DataFormatterクラスを使用すると閉じることができます。

Excelでは、〜1900年以降の日付は浮動小数点数として格納されるため、日付ではなく数字が表示されます。 DataFormatter(またはそれに類するもの)を日付としてレンダリングするには

+0

DataFormatterをチェックしました。日付文字列 "41045" 16/05/2012 "しかし、ユーザーが「05/16/2012」と入力するとどうなりますか?ここで私は同じ日付文字列 "41045"を持っていますが、論理によると "16/05/2012"に変換され、 "05/16/2012"には変換されません。またはユーザーが入力する形式を知るにはどうすればよいですか? –

+0

ユーザーがセルに値を入力すると、そのセルに値を(自動的にまたは明示的に)適用します。これは、その値を表示するために使用されます。 DataFormatterは、その形式が何であってもセルをレンダリングします。 – Gagravarr

4

xlsに保存している間にセルの値にa 'をプレフィックスすると、そのセルが文字列セルにレンダリングされます。だから、あなたがそのセルから読んだものは、文字列として扱われ、そのまま読まれます。

+1

このソリューションでは、データを入力するユーザーに、プログラムのためにこれを知って覚えておく必要があります(それについては知らないかもしれません) – Attila

5

ExcelがExcelシートに入力されたときの正確な日付を取得するには、次のコードを使用します。

DataFormatter df = new DataFormatter(); 
stringCellValue = df.formatCellValue(cell); 
+0

これは実用的な答えです。ありがとう! –

関連する問題