Получение даты в двойном формате 43318.4847916667 вместо 06-08-2018 11:38:06 - PullRequest
2 голосов
/ 24 октября 2019

Я пишу код Java для создания файла Excel с использованием HSSFWorkbook (.xls). Мне нужно написать дату в одном столбце в этом формате 06-08-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);

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Невозможно воспроизвести проблему.

Следующий полный пример приводит к тому, что книга 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);
  }

 }
}

Результат:

enter image description here


Из вашего комментария выясняется, что ваш вопрос не показывает целое. Для строк есть цикл, и для каждой строки должна быть создана дата. И это работает только до 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);
  }

 }
}
0 голосов
/ 24 октября 2019

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

String fileName = "WorksOrders.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);
0 голосов
/ 24 октября 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();
    }
}
...