10

スプレッドシートから日付列と時刻列を読み込もうとしています。シートから日付列を取得できますが、時間列は取得できません。

たとえば、私のシートには次の形式の行があります。

日付時刻

2012 年 11 月 2 日 12:15:01

日付列を取得する次のコードがあります。

while(cellIterator.hasNext()) {
            HSSFCell cell = (HSSFCell)cellIterator.next();
            switch(cell.getCellType()){
                case HSSFCell.CELL_TYPE_NUMERIC:
                    HSSFCellStyle style = cell.getCellStyle();
                    if (HSSFDateUtil.isCellDateFormatted(cell))
                    {
                        d = (Date)getDateValue(cell);
                        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
                        System.out.println(dateFormat.format(d));

                    }


            }
        }  

protected static Object getDateValue(HSSFCell cellDate) 
{

         double numericDateValue = cellDate.getNumericCellValue();
         Date date = HSSFDateUtil.getJavaDate(numericDateValue);
         return date;

}

ご覧のとおり、私は使用しています

HSSFDateUtil.isCellDateFormatted(セル)

セルに日付値が含まれているかどうかを確認します。関数を使用してセルに時間値があるかどうかを確認できるかどうかを知りたいです。

Excel シートは外部ソースからのものです。そのため、その形式を変更することはできません。

現在、日付列の正しい日付値を取得しています。しかし、時間列の場合、私は取得しています

1899/12/31

すべての行の結果として

4

2 に答える 2

10

これは、POI セルの「日付のみ」、「時間のみ」、または「日時」の値を取得するための大まかな試みです。

    ...
private String getCellValueAsString(Cell poiCell){

    if (poiCell.getCellType()==Cell.CELL_TYPE_NUMERIC && DateUtil.isCellDateFormatted(poiCell)) {
        //get date
        Date date = poiCell.getDateCellValue();

        //set up formatters that will be used below
        SimpleDateFormat formatTime = new SimpleDateFormat("HH:mm:ss");
        SimpleDateFormat formatYearOnly = new SimpleDateFormat("yyyy");

        /*get date year.
        *"Time-only" values have date set to 31-Dec-1899 so if year is "1899"
        * you can assume it is a "time-only" value 
        */
        String dateStamp = formatYearOnly.format(date);

        if (dateStamp.equals("1899")){
            //Return "Time-only" value as String HH:mm:ss
            return formatTime.format(date);
        } else {
            //here you may have a date-only or date-time value

            //get time as String HH:mm:ss 
            String timeStamp =formatTime.format(date);

            if (timeStamp.equals("00:00:00")){
                //if time is 00:00:00 you can assume it is a date only value (but it could be midnight)
                //In this case I'm fine with the default Cell.toString method (returning dd-MMM-yyyy in case of a date value)
                return poiCell.toString();
            } else {
                //return date-time value as "dd-MMM-yyyy HH:mm:ss"
                return poiCell.toString()+" "+timeStamp;
            }
        }
    }

    //use the default Cell.toString method (returning "dd-MMM-yyyy" in case of a date value)
    return poiCell.toString();
}
于 2013-08-09T14:52:23.603 に答える