Не делайте рисование границ таким сложным способом.
Если кто-то хочет сделать это таким образом (используя одиночные CellStyle
s), то потребуется создать 8 стилей для одной ячейки.Одна имеет границы для верхнего левого края, одна имеет границы для верхней линии, одна имеет границы для верхнего правого края, одна имеет границы для левой линии, одна имеет границы для правой линии, одна имеет границы для нижнего левого края, другая имеет границы длянижняя линия и одна имеет границы для нижнего правого края.Затем, после создания ячеек и заполнения их содержимым, к ячейке должен быть применен правильный стиль ячейки (один из 8 созданных ранее).
Это ужасно и сложно для кода.Поэтому люди часто делают то, что вы делаете, и просто создают новый стиль ячейки для каждой отдельной ячейки.Но Excel
ограничено в количестве уникальных форматов ячеек / стилей ячеек.См. Спецификации и ограничения Excel .Таким образом, имея большие листы с большим количеством данных, можно легко превысить ограничение в 64 000 уникальных форматов ячеек / стилей ячеекПоэтому просто создавать новый стиль ячейки для каждой отдельной ячейки неправильно.
Границы рисования в Руководство для занятых разработчиков по функциям HSSF и XSSF показывает, как это сделать лучше.
Полный пример:
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.PropertyTemplate;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
class ExcelDrawingBorders {
public static void main(String[] args) throws Exception {
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream fileout = new FileOutputStream("ExcelDrawingBorders.xlsx") ) {
int startDataRow = 4;
int endDataRow = 8;
int startDataColumn = 2;
int endDataColumn = 6;
Sheet sheet = workbook.createSheet();
for (int r = startDataRow; r <= endDataRow; r++) {
Row row = sheet.createRow(r);
for (int c = startDataColumn; c <= endDataColumn; c++) {
Cell cell = row.createCell(c);
cell.setCellFormula("RANDBETWEEN(10,50)");
}
}
PropertyTemplate propertyTemplate = new PropertyTemplate();
propertyTemplate.drawBorders(new CellRangeAddress(startDataRow-1, endDataRow+1, startDataColumn-1, endDataColumn+1),
BorderStyle.MEDIUM, BorderExtent.OUTSIDE);
propertyTemplate.applyBorders(sheet);
workbook.write(fileout);
}
}
}
Результат:
Здесь PropertyTemplate и CellUtil сделает всю работу за вас.PropertyTemplate
создает необходимые свойства Map
s.И при применении к листу он использует CellUtil
, который создает 8 необходимых стилей ячеек на уровне книги и применяет их к правильным ячейкам.Будут созданы даже не существующие, но необходимые ячейки.