私は Apache POI を使用しており、セル範囲またはマージされた領域に境界線を配置する必要があります。3 行 5 列のセルを結合しています。しかし、境界線を追加することはできません。では、これを行うにはどうすればよいですか?
8 に答える
私の解決策は、セルをその位置でマージし、セル (マージされたセルの最初のブロックへの参照) を作成して値を割り当て、HSSFRegionUtilを介して境界線を設定することでした。
// Merges the cells
CellRangeAddress cellRangeAddress = new CellRangeAddress(start, start, j, j + 1);
sheet.addMergedRegion(cellRangeAddress);
// Creates the cell
Cell cell = CellUtil.createCell(row, j, entry.getKey());
// Sets the borders to the merged cell
HSSFRegionUtil.setBorderTop(CellStyle.BORDER_MEDIUM, cellRangeAddress, sheet, workbook);
HSSFRegionUtil.setBorderLeft(CellStyle.BORDER_MEDIUM, cellRangeAddress, sheet, workbook);
HSSFRegionUtil.setBorderRight(CellStyle.BORDER_MEDIUM, cellRangeAddress, sheet, workbook);
HSSFRegionUtil.setBorderBottom(CellStyle.BORDER_THIN, cellRangeAddress, sheet, workbook);
RegionUtil クラスは、セル範囲の境界線を設定するのに便利です。ここを見てください:
まず、作成しようとしているシート形式を知っておくと便利です。HSSFでヌルセルをマージする場合、XSSFが不正な形式のファイルを作成し、Microsoft EXCELで開くときにエラーが発生するのは、まったく正常なためです。どちらの場合も、スタイルは同じように動作する傾向があります。マージする各セルに同じスタイル(この場合は境界線を含むスタイル)を割り当てる必要があります。私の提案は、マージ領域のすべてのセルをチェックして修正し、スタイルを設定する関数を作成することです。これが私自身の例です:
private static final XSSFColor COLOR_ORANGE = new XSSFColor(new java.awt.Color(254, 253, 189));
private static final XSSFColor COLOR_GREY = new XSSFColor(new java.awt.Color(191, 190, 154));
。。。
XSSFCellStyle styleSubHeader = (XSSFCellStyle) wb.createCellStyle();
styleSubHeader.setFont(fontBold);
styleSubHeader.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
styleSubHeader.setAlignment(CellStyle.ALIGN_CENTER);
styleSubHeader.setFillForegroundColor(COLOR_ORANGE);
styleSubHeader.setFillPattern(CellStyle.SOLID_FOREGROUND);
styleSubHeader.setBorderBottom(CellStyle.BORDER_THIN);
styleSubHeader.setBottomBorderColor(COLOR_GREY);
styleSubHeader.setBorderLeft(CellStyle.BORDER_THIN);
styleSubHeader.setLeftBorderColor(COLOR_GREY);
styleSubHeader.setBorderRight(CellStyle.BORDER_THIN);
styleSubHeader.setRightBorderColor(COLOR_GREY);
styleSubHeader.setBorderTop(CellStyle.BORDER_THIN);
styleSubHeader.setTopBorderColor(COLOR_GREY);
。。。
/**
* Checking if every row and cell in merging region exists, and create those which are not
* @param sheet in which check is performed
* @param region to check
* @param cellStyle cell style to apply for whole region
*/
private void cleanBeforeMergeOnValidCells(XSSFSheet sheet,CellRangeAddress region, XSSFCellStyle cellStyle )
{
for(int rowNum =region.getFirstRow();rowNum<=region.getLastRow();rowNum++){
XSSFRow row= sheet.getRow(rowNum);
if(row==null){
sheet.createRow(rowNum);
logger.trace("while check row "+rowNum+" was created");
}
for(int colNum=region.getFirstColumn();colNum<=region.getLastColumn();colNum++){
XSSFCell currentCell = row.getCell(colNum);
if(currentCell==null){
currentCell = row.createCell(colNum);
logger.trace("while check cell "+rowNum+":"+colNum+" was created");
}
currentCell.setCellStyle(cellStyle);
}
}
}
そして最後に、実際のマージ呼び出しの前に次のように呼び出します。
CellRangeAddress region = new CellRangeAddress(rowIndex, rowIndex, mergeStart, cellIndex+cellOffset);
cleanBeforeMergeOnValidCells(row.getSheet(),region,styleSubHeader );
row.getSheet().addMergedRegion(region);// merging cells that has a title name
それが役に立てば幸い。
使用する:
int rownumm=0;
rownumm++;
Row row = sheet.createRow(rownumm);
Cell cell = row.createCell(0);
cell.setCellValue(web.getUrl());
cell.setCellStyle(styles.get("font"));//font for text
CellRangeAddress region = CellRangeAddress.valueOf("$A$"+ (rownumm) + ":$E$+" + (rownumm));
frame(region, sheet, wb);
そして使用方法:
private static void frame(CellRangeAddress region,Sheet sheet, Workbook wb){
sheet.addMergedRegion(region);
final short borderMediumDashed = CellStyle.BORDER_MEDIUM;
RegionUtil.setBorderBottom(borderMediumDashed, region, sheet, wb);
RegionUtil.setBorderTop(borderMediumDashed, region, sheet, wb);
RegionUtil.setBorderLeft(borderMediumDashed, region, sheet, wb);
RegionUtil.setBorderRight(borderMediumDashed, region, sheet, wb);
}
リンクの「便利な機能の使用」も参照してください。
https://poi.apache.org/spreadsheet/quick-guide.html#FooterPageNumbers
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
Apache POI v3 に従って、次のコードが機能しました。
// Defining and merging the cells
CellRangeAddress cellRangeAddress = new CellRangeAddress(start, start, j, j + 1);
sheet.addMergedRegion(cellRangeAddress);
// Adding a border to the cell
RegionUtil.setBorderTop(BorderStyle.THIN, cellRangeAddress, sheet);
RegionUtil.setBorderBottom(BorderStyle.THIN, cellRangeAddress, sheet);
RegionUtil.setBorderLeft(BorderStyle.THIN, cellRangeAddress, sheet);
RegionUtil.setBorderRight(BorderStyle.THIN, cellRangeAddress, sheet);