Установка времени в Excel с помощью POI

Я пытаюсь создать рабочий лист Excel, используя POI API в Java. В этом рабочем листе Excel я хочу иметь ячейку только с ВРЕМЕНЕМ. Установив это, мы можем включить ячейку в суммирование этого конкретного столбца, как мы это делаем в числовых столбцах. Для этого нам нужно отформатировать ячейку как Время >> 13:30:55. (Внутренний формат — «ч:мм:сс;@»). И нам нужно удалить часть даты из ячейки.

Когда я читаю в ячейке значение ячейки с помощью POI, оно возвращается как «Воскресенье, 31 декабря, 01:00:00 IST 1899» (когда я устанавливаю значение как 1:00), индекс формата ячейки равен 166, а формат ячейки строка 'h:mm:ss;@'.

После установки форматов и стиля, которые были прочитаны из Excel, и значения ячейки как 1800-декабрь-31 и значения времени, новый Excel показывает ячейку как «######» (ошибка), и значение ячейки устанавливается как «-1». Ниже приведен код, который я использовал. Я ничего не пропустил? Можно ли установить значение, как я требую.

    InputStream is = new BufferedInputStream(new FileInputStream("<FileName>"));
    XSSFWorkbook wb = new XSSFWorkbook(is);
    is.close();

    XSSFSheet sheet = wb.getSheetAt(0);
    XSSFRow row = sheet.getRow(2);

    XSSFCell cell = row.getCell(18);
    System.out.println("ExcelFileReader main cell.getDateCellValue() : '" + cell.getDateCellValue() + "'");
    System.out.println("ExcelFileReader main cell.getCellStyle().getDataFormat() : '" + cell.getCellStyle().getDataFormat() + "'");
    System.out.println("ExcelFileReader main cell.getCellStyle().getDataFormat() : '" + cell.getCellStyle().getDataFormatString() + "'");

    XSSFRow row1 = sheet.createRow(21);
    XSSFCell cell1 = row1.createCell(2);

    cell1.setCellStyle(cell.getCellStyle());
    cell1.setCellValue(cell.getDateCellValue());

    Calendar dummy = Calendar.getInstance();
    dummy.setLenient(false);
    dummy.set(Calendar.YEAR, 1899);
    dummy.set(Calendar.MONTH, Calendar.DECEMBER);
    dummy.set(Calendar.DATE, 31);

    dummy.set(Calendar.HOUR, 00);
    dummy.set(Calendar.MINUTE, 00);
    dummy.set(Calendar.SECOND, 00);
    dummy.set(Calendar.MILLISECOND, 00);

    Calendar cc = Calendar.getInstance();
    XSSFRow row2 = sheet.createRow(25);
    XSSFCell cell2 = row2.createCell(2);

    dummy.set(Calendar.HOUR, cc.get(Calendar.HOUR));
    dummy.set(Calendar.MINUTE, cc.get(Calendar.MINUTE));
    dummy.set(Calendar.SECOND, cc.get(Calendar.SECOND));
    dummy.set(Calendar.MILLISECOND, cc.get(Calendar.MILLISECOND));

    System.out.println("ExcelFileReader main dummy : '" + dummy.getTime() + "'");
    cell2.setCellValue(dummy.getTime());

    CellStyle style = wb.createCellStyle();
    DataFormat df = wb.createDataFormat();
    style.setDataFormat(df.getFormat("[h]:mm:ss;@"));
    cell2.setCellStyle(style);

    FileOutputStream fos = new FileOutputStream(new File("<New Excel file>"));
    wb.write(fos);
    fos.close();
    System.out.println("ExcelFileReader DONE");

Ниже приведен вывод программы.

    ExcelFileReader main cell.getDateCellValue() : 'Sun Dec 31 00:15:00 IST 1899'
    ExcelFileReader main cell.getCellStyle().getDataFormat() : '166'
    ExcelFileReader main cell.getCellStyle().getDataFormat() : 'h:mm:ss;@'
    ExcelFileReader main dummy : 'Sun Dec 31 11:32:24 IST 1899'
    ExcelFileReader DONE

person user1834844    schedule 19.11.2012    source источник
comment
###### может отображаться, если колонка времени недостаточно широка   -  person Christophe Roussy    schedule 16.04.2014


Ответы (3)


Даты и время в Excel обычно хранятся в виде чисел с плавающей запятой, полных и дробных дней с 1900 или 1904 года. Вы можете увидеть это, введя 0,5 в ячейку Excel и отформатировав время — оно будет отображаться как 12:00:00. , или установите значение 1,5, и оно будет отображаться как дата 1900/1904 как дата, 12:00:00 как время или 36:00:00, если время позволяет >24 часа (это другое код формата)

Что вам нужно сделать, так это запустить копию Excel, ввести значение времени, которое вы хотите отобразить, и разработать строку формата, которая заставит его отображаться так, как вы хотите. Затем запишите этот код формата и передайте его в POI в качестве формата данных для ячейки. Теперь используйте что-то вроде DateUtil в POI для создания объекта Date и установите его в ячейку в качестве значения. При правильной строке формата Excel будет отображать только часть времени, а не дату.

person Gagravarr    schedule 19.11.2012

Я использовал следующий код для создания временной ячейки в Excel с использованием POI. И я могу использовать ячейку в

        XSSFRow row2 = sheet.createRow(25);
        XSSFCell cell1 = row2.createCell(4);
        XSSFCell cell2 = row2.createCell(5);

        CellStyle style = wb.createCellStyle();
        DataFormat df = wb.createDataFormat();
        style.setDataFormat(df.getFormat("[h]:mm:ss;@"));

        cell1.setCellFormula("TIME(0,15,00)"); // 00:15:00
        cell1.setCellType(Cell.CELL_TYPE_FORMULA);
        cell1.setCellStyle(style);
        evaluator.evaluateFormulaCell(cell1);

        cell2.setCellFormula("TIME(0,30,00)"); //00:30:00
        cell2.setCellType(Cell.CELL_TYPE_FORMULA);
        evaluator.evaluateFormulaCell(cell2);
        cell2.setCellStyle(style);
person user1834844    schedule 20.11.2012

Вы можете использовать метод DateUtil.convertTime(String time), где время похоже на ЧЧ:ММ или ЧЧ:ММ:СС. Этот метод даст вам двойное значение, которое вы можете установить как значение в своей ячейке (cell.setCellValue (двойное значение)).

Но метод convertTime не работает с часами › 23. Если вам нужна такая возможность, вы можете написать свой собственный метод convertTime, что-то вроде этого:

double convertTime(long hours, long minutes, long seconds) {
   double totalSeconds = seconds + (minutes + (hours) * 60) * 60;
   return totalSeconds / (SECONDS_PER_DAY);
}

SECONDS_PER_DAY = 60 * 60 * 24. Вы можете просто взять его из класса DateUtil.

Помните, что вы должны правильно определить формат своей ячейки, чтобы Excel мог работать более 23 часов.

person Evgeny    schedule 06.08.2020