Невозможно отформатировать ячейку даты в экспортированном Excel, используя Apache POI - PullRequest
0 голосов
/ 03 марта 2020

Я использую Workbook wb = new XSSFWorkbook(); для экспорта листа Excel, который содержит столбец с ДАТА . Даже после установки стиля как ДАТА столбец будет отображаться как ОБЩИЕ на листе Excel.

Вот мой фрагмент кода для создания ячейки

Workbook wb = new XSSFWorkbook(); 
int rowValue = 1; CellStyle cellStyleOfHeaderRow = wb.createCellStyle(); CellStyle style = wb.createCellStyle(); 
Font fontOfCell = initializeCellFont(wb, cellStyleOfHeaderRow); initializeCellBorders(cellStyleOfHeaderRow); initializeCellFillOptions(cellStyleOfHeaderRow); 
initializeCellBorders(style); CreationHelper createHelper = wb.getCreationHelper(); 
    short dateFormat = createHelper.createDataFormat().getFormat("yyyy-MM-dd-hh.mm.ss"); 
    style.setDataFormat(dateFormat);

После открытия экспортированного файла Excel, когда я пытаюсь изменить формат столбца даты с ОБЩИЕ на ДАТА , я не могу это сделать.

enter image description here

Не могли бы вы предложить какой-нибудь фрагмент кода или какое-либо решение для этого?

1 Ответ

3 голосов
/ 03 марта 2020

Я подозреваю, что ваши данные 2016-01-28 12:06:00.0, ... являются строками, а не датами. Если вы установите строки в ячейку Excel, то ячейка не может быть ячейкой даты. Значение ячейки должно быть числовым значением c, чтобы ячейка была ячейкой даты. Таким образом, вам нужно преобразовать эти значения String s в Date s перед установкой значения ячейки. Затем установите значение Date в качестве значения ячейки.

Используя текущий apache poi 4.1.2, это можно сделать с помощью java.time.format.DateTimeFormatter и java.time.LocalDateTime, поскольку существует Cell.setCellValue (java .time. Значение LocalDateTime) сейчас.

До apache poi 3.17 это можно сделать с помощью java.text.SimpleDateFormat и java.util.Date. Cell.setCellValue (java .util.Date value) - это используемый тогда метод setCellValue.

Полный пример:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

class CreateExcelDateCells {

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

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   String[][] data = new String[][] {
    new String[] {"Date"},
    new String[] {"2016-01-28 12:06:00.0"},
    new String[] {"2016-01-27 08:29:00.0"},
    new String[] {"2016-01-18 21:37:00.0"}
   };

   DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S", Locale.US);
   //SimpleDateFormat simpleDateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S", Locale.US); // up to apache poi 3.17

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

   Sheet sheet = workbook.createSheet(); 

   for (int r = 0; r < data.length; r++) {
    Row row = sheet.createRow(r);
    Cell cell = row.createCell(0);
    if (r == 0) {
     cell.setCellValue(data[r][0]); // String cell value
    } else {
     cell.setCellValue(LocalDateTime.parse(data[r][0], dateTimeFormatter)); // Date cell value
     //cell.setCellValue(simpleDateFormatter.parse(data[r][0])); // Date cell value up to apache poi 3.17
     cell.setCellStyle(dateCellStyle);
    }
   }

   sheet.autoSizeColumn(0);

   workbook.write(fileout);
  }

 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...