SXSSF не может создать шрифт и формат даты

Вопрос

В книге SXSSF:

Как я могу установить шрифт?

Как я могу установить тип ячейки на дату?


контекст

Мне нужно написать файл Excel.xlsx с огромным количеством строк и столбцов (400000 строк, по 50 полей в каждом), поэтому я использую apache poi, книгу SXSSF. Я создал тестовый файл с таким количеством фиктивного текста, и он работает, но я хочу, чтобы ячейки имели собственный шрифт: поэтому, если текст каким-то образом представляет время, тип ячейки должен быть установлен на "дату" (что позволяет легко фильтровать строки по дате),

Я написал функцию, которая позволяет мне создавать ячейку, проверять и изменять ее тип текста (валюта, строка, данные) на основе значения textType, которое я передаю в функцию. Тип текста правильно распознается при проверке данных. Валюта и текст корректно изменены, но когда я попытался установить шрифт и тип данных, он не работает вообще.

(У меня уже есть рабочая функция (XSSF), которая создает Excel с пользовательским шрифтом и различными типами данных, включая "дату", просто не может генерировать большие файлы Excel из-за накладных расходов GC, поэтому мне пришлось переключиться на SXSSF)


ошибка

Я получаю такую ​​ошибку компиляции.

Ошибки несовместимых типов, найдено: org.apache.poi.ss.usermodel.Font, обязательно: org.apache.poi.xssf.usermodel.XSSFFont в строке 235 (235:40) несовместимых типов, найдено: org.apache.poi.ss.usermodel.DataFormat, требуется: org.apache.poi.xssf.usermodel.XSSFDataFormat в строке 271 (271:54) несовместимых типов, найдено: org.apache.poi.ss.usermodel.DataFormat, обязательно: org.apache. poi.xssf.usermodel.XSSFDataFormat в строке 308 (308:54) несовместимых типов, найдено: org.apache.poi.ss.usermodel.DataFormat, обязательно: org.apache.poi.xssf.usermodel.XSSFDataFormat в строке 335 (335:54) несовместимые типы; найдено: org.apache.poi.ss.usermodel.DataFormat, обязательно: org.apache.poi.xssf.usermodel.XSSFDataFormat в строке 375 (375:66)

Поскольку SXSSFFont не существует, я попытался исправить это, создав объект Font, а затем используя его вместо XSSFFont.

То же самое для DataFormat.

Но я все еще нахожу проблемы типов здесь и там в коде.

XSSFFont font = (XSSFFont) workbook.createFont();
XSSFDataFormat df = (XSSFFont) workbook.createDataFormat();

Также попробовал код выше, но он не работает, я получаю

Ошибка ClassCastException


Код

            //[...]
            SXSSFWorkbook workbook = new SXSSFWorkbook(100);
            Sheet sheet;
            Row row;
            Cell cell;
            //[...]
            XSSFFont font = workbook.createFont();
            font.setBold(fontBold);
            font.setItalic(fontItalic);
            font.setFontHeightInPoints( (short) fontSize);
            if (!fontUnderline) {
              font.setUnderline(FontUnderline.NONE);
            }
            else {
              font.setUnderline(FontUnderline.SINGLE);
            }
            font.setColor(fontColor);

            CellStyle style = workbook.createCellStyle();

            style.setFont(font);


            //[...]

            if (textType == 'T') {

               XSSFDataFormat df = workbook.createDataFormat();
               style.setDataFormat(df.getFormat("d-mmm-yyyy hh:mi:ss"));
               Calendar c = Calendar.getInstance();
               c.set(year, month, day, hour, minute,second);
               cell.setCellValue(c.getTime());
            }

            //in the end I set cell value and style

           cell.setCellStyle(style);
           cell.setCellValue(text);

1 ответ

Решение

Здесь я создал короткий пример, используя SXSSFWorkbook и заполнение 1 ячейки с датой и применение правильного format также как и font,

SXSSFWorkbook s = new SXSSFWorkbook();
Font font = s.createFont();
font.setBold(true);
font.setItalic(true);
short dateStyle = s.createDataFormat().getFormat("mm/dd/yy;@");
CellStyle dateCellFormat = s.createCellStyle();
dateCellFormat.setDataFormat(dateStyle);
dateCellFormat.setFont(font);
SXSSFSheet sheet = s.createSheet("Test");
Row r = sheet.createRow(0);
Cell c = r.createCell(0);
c.setCellValue(new Date());
c.setCellStyle(dateCellFormat);
s.write(Files.newOutputStream(Paths.get("D:/test.xlsx"), StandardOpenOption.CREATE_NEW));
s.close();

Вам придется внести некоторые коррективы, но я надеюсь, что вы поняли идею (используйте соответствующие Interface"S)

Другие вопросы по тегам