Отображение границ на листе Excel с использованием Apache POI

143
20 ноября 2021, 14:00

подскажите пожалуйста имеется диапазон ячеек необходимо с использованием Apache POI отобразить все внутренние границы диапазона

CellRangeAddress region=new 
CellRangeAddress(7,9,0,4);
    RegionUtil.setBorderRight(BorderStyle.MEDIUM,region,sheet);
        RegionUtil.setBorderLeft(BorderStyle.MEDIUM,region,sheet);
        RegionUtil.setBorderBottom(BorderStyle.MEDIUM,region,sheet);
        RegionUtil.setBorderTop(BorderStyle.MEDIUM,region,sheet);

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

Answer 1

Единственный известный мне способ - создавать стили для каждой ячейки.

Но надо помнить, что у Workbook есть ограничения, накладываемые особенностями форматов XLS и XLSX. Например, стилей в XLSX не может быть больше 64000. А у версии 2003 года их вообще допускалось только 4000. Так же есть и другие ограничения.

То есть, идея такая - создать набор уникальных CellStyles, и потом переиспользовать их в разных ячейках.

CellStyle myCellStyle = wb.createCellStyle();
myCellStyle.setFillForegroundColor(HSSFColor.YELLOW.index);
myCellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
...

И дальше, когда создаёшь ячейки, просто переиспользуешь myCellStyle:

cell.setCellStyle(myCellStyle);

Куда интереснее то, как подбирать такие стили. Я не могу показать производственный код, но идея такая: создаётся кеш стилей (Map). Ключ формируется на основе всех значений стиля, которые могут различаться. Хотя бы так:

private String getCellStyleId() {
    return String.format("%s%s%s", fontName, fontHeightInPoints, fontColor);
}

Чтобы ключ не был слишком большим, можно поиграться с хэшами.

Далее всё просто. Строим ID стиля и ищем его в Map. Если есть - хорошо, берём существующий. В другом случае создаём и заносим в кеш. Удачи.

С радостью выслушаю другие решения и комментарии.

Answer 2

Я нашел вот такое решение

PropertyTemplate propertyTemplate=new PropertyTemplate();
propertyTemplate.drawBorders(new CellRangeAddress(7,9,0,4),
                BorderStyle.MEDIUM,BorderExtent.RIGHT);
propertyTemplate.applyBorders(sheet);

Вот ссылка на документацию: Javadoc

READ ALSO
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

Я пытаюсь добавить запись в таблицы но при этом выбивает ошибку

335
Не производится запись в файл

Не производится запись в файл

Не создается сам файл и запись в него не производитсяКак можно исправить?

197
Где ошибка, нужна помощь?

Где ошибка, нужна помощь?

Нужно проверить массив на возрастание, убывание, одинаковые поля и поля зигзаги(1,2,-1,3,4)Если код работает отдельными частями правильно, то почему-то...

118
Передача ResultSet в List(Map)

Передача ResultSet в List(Map)

Пишу свой домашний проект паралельно обучениюИспользую JDBC для работы с MySQL

349