Получение даты в двойном формате 43318.4847916667 вместо 06-08-2018 11:38:06

Я пишу код Java для создания файла excel с использованием HSSFWorkbook (.xls). Мне нужно написать дату в одном столбце в этом формате 08-06-2018 11:38:06, но он генерирует вот так 43318.4847916667.
Вот фрагмент кода, который я использовал. Пожалуйста, помогите мне, как я могу успешно написать

Workbook workbook = new HSSFWorkbook();
Sheet excelSheet = workbook.createSheet();
Row dataRow = excelSheet.createRow(1);;
Cell dataCell = dataRow.createCell(1);;
CellStyle cStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();         
cStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
dataCell.setCellValue(new Date());
dataCell.setCellStyle(cStyle);

person Anam Qureshi    schedule 24.10.2019    source источник
comment
По моему опыту, Excel сам определяет, была ли введена дата или время, и сам корректирует форматирование. Вы пытались отформатировать дату и просто написать в ячейку отформатированное String? Формат данных, который вы определили, явно не работает. Может быть, установить стиль ячейки, прежде чем писать в ячейку, я думаю, стоит попробовать.   -  person deHaar    schedule 24.10.2019
comment
Вам просто не хватает FileOutputStream (см. ответ ниже), но в противном случае дата генерируется в Excel по вашему запросу (с использованием предоставленного dateformat). Используете ли вы не-Microsoft Excel (например, OpenOffice, LibreOffice и т. д.?)   -  person Ambro-r    schedule 24.10.2019
comment
@deHaar, спасибо за ответ, но если я запишу его как строку, Excel не сможет распознать формат даты, поэтому мы не сможем выполнять над ним операции с датами.   -  person Anam Qureshi    schedule 24.10.2019
comment
Любопытно: Если вам нужен такой формат, как 06-08-2018, с последним годом, то почему вы указали такой шаблон, как yyyy-MM-dd, с первым годом?   -  person Andreas    schedule 24.10.2019
comment
@Андреас, хорошее наблюдение. Я предполагаю, что это ошибка копирования ???? Я исправил это сейчас.   -  person Anam Qureshi    schedule 24.10.2019


Ответы (3)


Не удается воспроизвести проблему.

Следующий полный пример приводит к рабочей книге Excel с рабочим листом и правильно отформатированной датой в ячейке B2.

Код:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

class CreateExcelDate {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new HSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("./Excel.xls") ) {

   CellStyle cStyle = workbook.createCellStyle();
   CreationHelper createHelper = workbook.getCreationHelper();         
   cStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));

   Sheet excelSheet = workbook.createSheet();
   Row dataRow = excelSheet.createRow(1);;
   Cell dataCell = dataRow.createCell(1);;
   dataCell.setCellValue(new java.util.Date());
   dataCell.setCellStyle(cStyle);

   excelSheet.setColumnWidth(1, 25 * 256);

   workbook.write(fileout);
  }

 }
}

Результат:

введите здесь описание изображения


Из вашего комментария получается, что ваш вопрос не показывает всего. Существует цикл для строк, и для каждой строки должна быть создана дата. И это работает только до 42-го ряда.

Что ж, эта проблема хорошо известна. Excel имеет ограничение на количество стилей ячеек в книге. См.: Спецификации и ограничения Excel.

Таким образом, если вы создаете новый стиль ячейки снова и снова в цикле, этот предел иногда достигается. Однако вам не всегда нужно создавать новые стили ячеек в цикле. Стили ячеек хранятся на уровне рабочей книги. Просто создайте любой необходимый стиль ячейки вне цикла. Затем примените только ранее созданные стили ячеек к ячейке внутри цикла.

Следующее работает для меня и создает 1000 правильно отформатированных дат:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

class CreateExcelDate {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new HSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("./Excel.xls") ) {

   CellStyle cStyle = workbook.createCellStyle();
   CreationHelper createHelper = workbook.getCreationHelper();         
   cStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));

   Sheet excelSheet = workbook.createSheet();

   for (int r = 1; r < 1000; r++) {
    Row dataRow = excelSheet.createRow(r);;
    Cell dataCell = dataRow.createCell(1);;
    dataCell.setCellValue(new java.util.GregorianCalendar(2019, 9, r));
    dataCell.setCellStyle(cStyle);
   }

   excelSheet.setColumnWidth(1, 25 * 256);

   workbook.write(fileout);
  }

 }
}
person Axel Richter    schedule 24.10.2019
comment
Привет, Аксель Рихтер, спасибо за предоставленный фрагмент кода. Да, я согласился, что это работает правильно только для одной строки. Но я зациклил его на 50 строк, и проблема не возникает до 41-й строки, а с 42-й строки она сохраняет дату как числовое значение, как указано (43318.4847916667). Пожалуйста, дайте мне любые предложения, которые будут оценены. - person Anam Qureshi; 24.10.2019
comment
@ Анам Куреши: Смотрите мои добавки. - person Axel Richter; 24.10.2019

Если вы хотите «06-08-2018 11:38:06», тогда ваш формат даты должен быть «дд-ММ-ГГГГ ЧЧ: мм: сс». В противном случае вам просто не хватает FileOutputStream, в который вам нужно записать книгу.

private static final String FILE_NAME = "./out/MyFirstExcel.xls";

public static void main(String ... args) {
    Workbook workbook = new HSSFWorkbook();
    Sheet excelSheet = workbook.createSheet();
    Row dataRow = excelSheet.createRow(1);
    Cell dataCell = dataRow.createCell(1);
    CellStyle cStyle = workbook.createCellStyle();
    CreationHelper createHelper = workbook.getCreationHelper();
    cStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd-MM-YYYY HH:mm:ss"));
    dataCell.setCellValue(new Date());
    dataCell.setCellStyle(cStyle);

    try {
        File file = new File(FILE_NAME);
        if(!file.exists()) {
            file.createNewFile();
        }
        FileOutputStream outputStream = new FileOutputStream(file);
        workbook.write(outputStream);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
person Ambro-r    schedule 24.10.2019
comment
@ Анам, на твой вопрос ответили? Если это так, пожалуйста, отметьте это как решенное, поставив галочку. Тх. - person Ambro-r; 17.12.2019

Следуйте приведенному ниже коду для печати даты в формате ДД-ММ-ГГГГ ЧЧ:ММ:сс.

String fileName = "myExcel.xls";
WritableWorkbook writableWorkbook = null;
response.setContentType("application/vnd.ms-excel");
writableWorkbook = Workbook.createWorkbook(response.getOutputStream());
WritableSheet excelOutputsheet = writableWorkbook.createSheet("Sheet1", 0);

DateFormat customDateFormatWithTime = new DateFormat("dd-MM-yyyy HH:mm:ss");
WritableCellFormat dateFormatWithTime = new 
WritableCellFormat(customDateFormatWithTime);

int row = 0;
int col = 0;
excelOutputsheet.setColumnView(col, 20);
Label lable1 = new Label(col, row, "Date and Time", cellFormat);
excelOutputsheet.addCell(lable1);

row = row + 1;
col = col + 1;
DateTime myDate = new jxl.write.DateTime(col, row, "Value", dateFormatWithTime);
excelOutputsheet.addCell(myDate);
person Bikash Pandit    schedule 24.10.2019