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)