Извлечение из excel data

345
16 августа 2017, 17:23
  1. Считываю эксель файл

XLSXReader reader = new XLSXReader(filename); ...

далее преобразую в список массива строк list далее прохожусь по строкам и считываю в одной ячейке дату. дата в самом эксель файле изначально записана в таком формате 17.02.2017 00:00:00 после считывания получаю строку с таким значением "42768" - т.е. java сама преобразовывает 17.02.2017 00:00:00 в это число.

я хочу создать метод который парсит значения из 42768 обратно в дату. мой вариант не работает.

private String getDate(String datestr) { //42768
    SimpleDateFormat sdf = new SimpleDateFormat("DD.mm.yyyy HH:mm:ss");
    try {
        String s = sdf.format(sdf.parse(datestr));
        return s;
    } catch (Exception e) {
        // Fail, пробуем распарсить как эксель-дату
        try {
            return sdf.format(DateUtil.getJavaDate(Double.parseDouble(datestr)));
        } catch (Exception e1) {
            return null;
        }
    }
}

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

Answer 1

Здравствуйте, согласен с zRrr, что лучше все-таки использовать уже разработанные для Вас утилиты. В данном конкретном случае Apache POI уже разработали целую линейку таких методов, например, DateUtil.html#getJavaDate(double).

Также следует понимать причину такого поведения. А причина заключается в том, что excel представляет дату как количество дней начиная с 1 января 1900.

Но все же если Вам все-таки необходимо написать свой собственный код, то я бы все равно посоветовал взять наработки. Ниже приведен код, который сделаем необходимое конвертирование.

import java.util.Calendar;
import java.util.GregorianCalendar;
public class ExcelDateToJava{
    public static final int SECONDS_PER_MINUTE = 60;
    public static final int MINUTES_PER_HOUR = 60;
    public static final int HOURS_PER_DAY = 24;
    public static final int SECONDS_PER_DAY = (HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE);
    public static final long DAY_MILLISECONDS = SECONDS_PER_DAY * 1000L;
    public static void main(String[] args) {
        int wholeDays = (int) Math.floor(42768);
        int millisecondsInDay = (int) ((42768 - wholeDays) * DAY_MILLISECONDS + 0.5);
        Calendar calendar = new GregorianCalendar();
        setCalendar(calendar, wholeDays, millisecondsInDay);
        System.out.print(calendar.getTime());
    }
    public static void setCalendar(Calendar calendar, int wholeDays, int millisecondsInDay) {
        int startYear = 1900;
        int dayAdjust = -1; // Excel thinks 2/29/1900 is a valid date, which it isn't
        if (wholeDays < 61) {
            // Date is prior to 3/1/1900, so adjust because Excel thinks 2/29/1900 exists
            // If Excel date == 2/29/1900, will become 3/1/1900 in Java representation
            dayAdjust = 0;
        }
        calendar.set(startYear, 0, wholeDays + dayAdjust, 0, 0, 0);
        calendar.set(GregorianCalendar.MILLISECOND, millisecondsInDay);
    }
}

Результат выполнения Thu Feb 02 00:00:00 MSK 2017

Надеюсь обе рекомендации помогут.

READ ALSO
Как правильно реализовывать отображение списка контактов?

Как правильно реализовывать отображение списка контактов?

Есть данные Name, NewtworkStatusих несколько десятков от 50+ Я пытаюсь отобразить список через ListView и SimpleAdapter

329
Обработка множественных запросов на RxJava

Обработка множественных запросов на RxJava

Есть поле для вводе текста, допустим ищем пользователей по имени в БДЕсть метод (упрощенный), который выполняется при каждом наборе символа

232
Почему Spring Security не отдает страницу логина?

Почему Spring Security не отдает страницу логина?

Есть страница авторизации которую Spring Security должен отдать но что-то идет не так и я получаю 404Помогите пожалуйста разобраться в чем моя ошибка

275
Не заходит &#171;Hello World!&#187; java, servlet, jsp

Не заходит «Hello World!» java, servlet, jsp

Бьюсь и не могу справиться с простейшим, метод "printText" в классе Class, в сервлете requestsetAttribute на JSP, выводит ошибку 500, гляньте код, что не так? Tomcat8,...

293