我正在使用Apache POI,我需要在一系列单元格或合并区域中放置边框.我正在将这些单元格合并为三行五列.但是我无法为它添加边框.那我该怎么做?
Rag*_*ine 22
我的解决方案是按位置合并单元格,然后创建一个单元格(引用合并单元格的第一个块)以分配值,然后通过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);
Run Code Online (Sandbox Code Playgroud)
首先,了解您尝试创建哪种表格格式会很高兴.因为当您在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));
Run Code Online (Sandbox Code Playgroud)
...
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);
Run Code Online (Sandbox Code Playgroud)
...
/**
* 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后你在实际的合并调用之前调用它,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.
小智 7
我建议您使用 getMergedRegions,该方法将返回工作表中合并区域的列表。然后您可以迭代每个区域以应用边框。例如:
private void setBordersToMergedCells(Workbook workBook, Sheet sheet) {
List<CellRangeAddress> 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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在完成 mySheet 中所需的所有合并后调用此方法。
小智 1
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());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38385 次 |
最近记录: |