J'utilise Apache POI et j'ai besoin de mettre une bordure dans une plage de cellules ou une région fusionnée. Je fusionne les cellules avec trois lignes et cinq colonnes. Mais je ne suis pas en mesure d'y ajouter la frontière. Alors, comment dois-je procéder?
Ma solution a été de fusionner les cellules par leurs positions, puis de créer une cellule (référence au premier bloc des cellules fusionnées) pour attribuer une valeur, puis définir la bordure à travers le 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);
Vous trouverez la classe RegionUtil utile pour définir les bordures d'une plage de cellules.
Tout d'abord, ce serait bien de savoir quel format de feuille vous essayez de créer. Parce que lorsque vous fusionnez des cellules nulles dans HSSF, c'est tout à fait normal tandis que XSSF crée un fichier mal formé qui provoque des erreurs lors de son ouverture dans Microsoft Excel. Les styles ont tendance à se comporter également dans les deux cas. Vous devez attribuer le même style (dans votre style de cas qui comprend la bordure) à chaque cellule que vous fusionnez. Ma suggestion crée une fonction qui vérifie et corrige, définit le style de toutes les cellules de la région de fusion. Voici mon exemple:
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);
}
}
}
Et enfin, vous l'appelez avant la fusion réelle appelez quelque chose comme ceci:
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
J'espère que ça aide.
Je vous recommande d'utiliser getMergedRegions, cette méthode retournera la liste des régions fusionnées dans la feuille. Ensuite, vous pouvez parcourir chaque région pour appliquer des bordures. Par exemple:
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);
}
}
ensuite, vous pouvez appeler cette méthode lorsque vous avez effectué toutes les fusions dont vous avez besoin dans mySheet.
Utilisation:
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);
Et utilisez la méthode:
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);
}
Voir aussi "Utilisation des fonctions pratiques" sur le lien:
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());