Apache poi 3.7を使用しており、セルの範囲またはマージされた領域に境界線を設定する必要があります。
シートとブックのタイプがXSSFの場合、マージされた領域に境界線を適用するにはどうすればよいですか。 HSSFタイプでは、RegionUtil-/HSSFRegionutilを使用しますが、XSSFタイプで最初のオブジェクト(Regionutil)を使用すると、機能せず、セルの範囲に黒の背景色が表示されます。
Regionutilは通常CellRangeAddressで動作しますが、この問題に関する情報は見つかりません。 CellRangeAddresがこれを引き起こすかどうかはわかりません。
これを行うには、マージされた領域のすべてのセルに空白のセルを追加してから、各セルに適切な境界線を追加する必要があります。たとえば、次のコードは、同じ行に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));
複数の行に対してこれを行います。
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));
@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);
}
}