2012-06-30 13 views
8

私はapache poi 3.7を使用しています。セルの範囲またはマージされた領域にボーダーを配置する必要があります。POI XSSFワークブックのマージされた領域にボーダーを追加する

シートとワークブックの種類がXSSFの場合、どのように結合された領域に境界線を適用できますか。 HSSFタイプではRegionUtil-/HSSFRegionutilを使用しますが、XSSFタイプで最初のオブジェクト(Regionutil)を使用する場合は動作せず、セルの範囲に黒の背景色を設定します。

Regionutilは私たちがCellRangeAddressで動作しているため、この問題に関する情報は見つかりません。私はCellRangeAddresがこれを引き起こすかどうかわかりません。

答えて

16

これを行うには、結合領域内のすべてのセルに空のセルを追加してから、各セルに適切な境界線を追加する必要があります。たとえば、次のコードでは、同じ行に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)); 
+0

これが偶数行でもマージされる場合はどうすればよいですか。つまり、3行がマージされたような場合は、どちらの方法で行う必要があります。提案してください。 – rick

4

複数の行に対してこれを行います。

ワークブック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)); 
1
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); 
    } 


} 
1

@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); 

    } 
} 
関連する問題