Apache POI Time Cell - PullRequest
       24

Apache POI Time Cell

3 голосов
/ 10 июня 2010

Мне нужно определить, является ли формат ячейки датой, временем или датой-временем.
Мой код:

        if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            if (DateUtil.isCellDateFormatted(cell)) {
                if (   ???   )
                    return "Time";
                else if (   ???   )
                    return "Date";
                else
                    return "Datetime";
            }
        }

Я использую ApachePOI 3.6

Ответы [ 2 ]

0 голосов
/ 22 марта 2017

Мне кажется, что единственное, что мы можем сделать здесь, - это посмотреть, имеет ли часть времени значение, отличное от нуля. Я пытался использовать style.getDataFormatString() и style.getDataFormat(), чтобы обнаружить это, но они ведут себя очень неправильно для моих тестовых случаев. Вот мой код:

private boolean dateIncludesTime() // this method only tries to detect does time part exist, but it is not sure it will succeeed
{
    Date javaDate= (Date)getValue();
    if (javaDate.getHours() > 0 || javaDate.getMinutes() > 0) 
        return true;

    int formatID = apacheCell.getCellStyle().getDataFormat();
    if(formatID >= 18 && formatID <=22) // https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html
        return true;

    dateFormat = apacheCell.getCellStyle().getDataFormatString();
    if(dateFormat.toLowerCase().contains("h")) // format mentions hours
        return true;

    return false;
}

Вот что я получаю для некоторых тестов:

ввод 21.03.2015, 21:30 getDataFormatString () возвращает MM / DD / YY formatID = 165

input 21.03.2016 getDataFormatString () возвращает MM / DD / YY formatID = 165

input 2017-04-21 10:20 getDataFormatString () возвращает YYYY-MM-DD formatID = 166

input 2017-05-21 getDataFormatString () возвращает YYYY-MM-DD formatID = 166

0 голосов
/ 26 октября 2010

Я не вижу встроенного способа сделать это легко в POI. Во-первых, кажется, что нет четкого различия между «временем», «датой» и «датой-временем». Значения просто сохраняются в виде чисел, и для их отображения применяется формат.

Одна вещь, которую вы могли бы сделать, это получить стиль ячейки (HSSFCellStyle), а затем написать свой собственный метод, который читает либо style.getDataFormatString(), либо style.getDataFormat() и сообщает вам, попадает ли формат в "Время", " Дата "или" Дата / время "в зависимости от того, как вы их определяете. Второй метод возвращает int, поэтому с ним может быть проще работать.

Например, выделенный ниже формат имеет строковый формат данных «[$ -F400] ч: мм: сс \ AM / PM» и значение int 166.

Excel Date/Time Format

Я предполагаю, что это то, что вы подразумеваете под форматом «Дата / время», поскольку это один из встроенных форматов Excel, который отображает как дату, так и время.

Недостатком этого подхода является то, что я не ожидал, что он будет работать с ячейками, которые имеют пользовательские форматы даты / времени.

...