在excel Apache poi java中为合并的单元格添加边框。

我正在使用Apache POI,我需要在一系列单元格或合并区域中放置边框。 我正在将这些单元格合并为三行五列。 但是我无法为它添加边框。 那我该怎么做?

我的解决方案是按位置合并单元格,然后创建一个单元格(引用合并单元格的第一个块)以指定值,然后通过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类可用于设置一系列单元格的边框。请点击此处:

http://poi.apache.org/apidocs/index.html

首先,了解您要创建的工作表格式会很高兴。 因为当您在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 

希望能帮助到你。

我建议你使用getMergedRegions,该方法将返回工作表中合并区域的列表。 然后,您可以迭代每个区域以应用边框。 例如:

 private void setBordersToMergedCells(Workbook workBook, Sheet sheet) { List mergedRegions = sheet.getMergedRegions(); for (CellRangeAddress rangeAddress : mergedRegions) { RegionUtil.setBorderTop(CellStyle.BORDER_THIN, rangeAddress, sheet, workBook); RegionUtil.setBorderLeft(CellStyle.BORDER_THIN, rangeAddress, sheet, workBook); RegionUtil.setBorderRight(CellStyle.BORDER_THIN, rangeAddress, sheet, workBook); RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, rangeAddress, sheet, workBook); } } 

然后,当您在mySheet中完成所需的所有合并时,可以调用此方法。

使用:

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

另请参阅链接上的“使用便捷function”:

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