Добавление границы в объединенный регион в учебнике POI XSSF
Я использую apache poi 3.7, и мне нужно поместить границу в диапазон ячеек или объединенную область.
как я могу применить границу к объединенной области, когда тип листа и рабочей книги - XSSF. В HSSF-типе я я использую RegionUtil-/HSSFRegionutil, но если использовать первый объект (Regionutil) в типе XSSF, он не работает и помещает черный цвет фона в диапазон ячеек.
Regionutil обычно работает с CellRangeAddress, и я не могу найти информацию об этой проблеме. Я не знаю, вызывает ли CellRangeAddres это.
Ответы
Ответ 1
Чтобы сделать это, вам нужно добавить пустую ячейку в каждую ячейку объединенной области, а затем добавить соответствующие границы в каждую ячейку. Например, следующий код создаст объединенную область из 5 ячеек в той же строке, с границей вокруг всей объединенной области и текстом, центром которого является область.
XSSFWorkbook wb = new XSSFWorkbook();
CellStyle borderStyle = wb.createCellStyle();
borderStyle.setBorderBottom(CellStyle.BORDER_THIN);
borderStyle.setBorderLeft(CellStyle.BORDER_THIN);
borderStyle.setBorderRight(CellStyle.BORDER_THIN);
borderStyle.setBorderTop(CellStyle.BORDER_THIN);
borderStyle.setAlignment(CellStyle.ALIGN_CENTER);
Sheet sheet = wb.createSheet("Test Sheet");
Row row = sheet.createRow(1);
for (int i = 1; i <= 5; ++i) {
Cell cell = row.createCell(i);
cell.setCellStyle(borderStyle);
if (i == 1) {
cell.setCellValue("Centred Text");
}
}
sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 5));
Ответ 2
Сделайте это для нескольких строк.
Workbook wb = new HSSFWorkbook();
// create a new sheet
Sheet sheet = wb.createSheet();
CellStyle borderStyle = wb.createCellStyle();
borderStyle.setBorderBottom(CellStyle.BORDER_THIN);
borderStyle.setBorderLeft(CellStyle.BORDER_THIN);
borderStyle.setBorderRight(CellStyle.BORDER_THIN);
borderStyle.setBorderTop(CellStyle.BORDER_THIN);
borderStyle.setAlignment(CellStyle.ALIGN_CENTER);
Sheet sheet1 = wb.createSheet("Test Sheet");
Row row = null;
Cell cell;
for (int i = 1; i <= 5; ++i) {
row = sheet1.createRow(i);
for(int j=1;j<=5;j++){
cell= row.createCell(j);
cell.setCellStyle(borderStyle);
if (i == 1 && j==1) {
cell.setCellValue("Centred Text");
}
}
}
sheet1.addMergedRegion(new CellRangeAddress(1, 5, 1, 5));
Ответ 3
private void setBordersToMergedCells(XSSFWorkbook workBook, XSSFSheet sheet) {
int numMerged = sheet.getNumMergedRegions();
for(int i= 0; i<numMerged;i++){
CellRangeAddress mergedRegions = sheet.getMergedRegion(i);
RegionUtil.setBorderTop(CellStyle.BORDER_THIN, mergedRegions, sheet, workBook);
RegionUtil.setBorderLeft(CellStyle.BORDER_THIN, mergedRegions, sheet, workBook);
RegionUtil.setBorderRight(CellStyle.BORDER_THIN, mergedRegions, sheet, workBook);
RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, mergedRegions, sheet, workBook);
}
}
Ответ 4
@Jesanagua только что спасла мне жизнь, мне просто пришлось немного поменяться, чтобы соответствовать 3.17.
private void setBordersToMergedCells(HSSFSheet sheet) {
int numMerged = sheet.getNumMergedRegions();
for (int i = 0; i < numMerged; i++) {
CellRangeAddress mergedRegions = sheet.getMergedRegion(i);
RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegions, sheet);
RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegions, sheet);
RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegions, sheet);
RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegions, sheet);
}
}