Ячейка времени Apache POI

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

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

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


person Chris Rea    schedule 10.06.2010    source источник


Ответы (2)


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

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

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

Формат даты/времени Excel

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

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

person Bill the Lizard    schedule 26.10.2010

Мне кажется, единственная хорошая вещь, которую мы можем здесь сделать, это - посмотреть, имеет ли часть времени значение, отличное от нуля. Я пытался использовать 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;
}

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

input 21.03.2015 21:30 getDataFormatString() возвращает ММ/ДД/ГГ formatID = 165

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

input 21-04-2017 10:20 getDataFormatString() возвращает ГГГГ-ММ-ДД formatID = 166

input 2017-05-21 getDataFormatString() возвращает ГГГГ-ММ-ДД formatID = 166

person Dragan Jovanović    schedule 22.03.2017