Fusionner et aligner la cellule centrale en utilisant apache poi

je veux exporter des données vers excel en utilisant Apache poi.

maintenant le problème auquel je fais face est que je ne suis pas capable de fusionner les lignes et de les aligner au centre.

le Code pour exporter des données est:

List<LinkedHashMap<String,Object>> lstReportHeader = null;
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();

//Set Header Font
HSSFFont headerFont = wb.createFont();
headerFont.setBoldweight(headerFont.BOLDWEIGHT_BOLD);
headerFont.setFontHeightInPoints((short) 12);

//Set Header Style
CellStyle headerStyle = wb.createCellStyle();
headerStyle.setFillBackgroundColor(IndexedColors.BLACK.getIndex());
headerStyle.setAlignment(headerStyle.ALIGN_CENTER);
headerStyle.setFont(headerFont);
headerStyle.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
int rowCount= 0;
Row header;
header = sheet.createRow(0);//its for header 
Cell cell ;//= header.createCell(0);
for(int j = 0;j < 4; j++) {
    cell = header.createCell(j);
    if(j == 0) {
        cell.setCellValue("ItemWise List");
    }
    cell.setCellStyle(headerStyle);
}
sheet.addMergedRegion(new CellRangeAddress(rowCount, rowCount, 0, lstReportFormHeader.size()-1));
header = sheet.createRow(0);
        cell = header.createCell(0);
cell.setCellValue("Sr. No");
        cell = header.createCell(1);
cell.setCellValue("Item Name");
        cell = header.createCell(2);
cell.setCellValue("Qty");
        cell = header.createCell(3);
cell.setCellValue("Rate");

Maintenant, je veux ItemWise List fusionner et aligner le centre.

20
demandé sur Cœur 2013-11-20 14:48:31

8 réponses

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 et ensuite définir l'alignement à travers le CellUtil

// 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 allignment to the created cell
CellUtil.setAlignment(cell, workbook, CellStyle.ALIGN_CENTER);
11
répondu RageAgainstTheMachine 2013-12-23 15:30:39

Fusionner comme:::

 Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");

Row row = sheet.createRow((short) 1);
Cell cell = row.createCell((short) 1);
cell.setCellValue("This is a test of merging");

sheet.addMergedRegion(new CellRangeAddress(
        1, //first row (0-based)
        1, //last row  (0-based)
        1, //first column (0-based)
        2  //last column  (0-based)
));

// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Pour l'alignement également vérifier les ci-dessous lien officiel de Apache poi:::

http://poi.apache.org/spreadsheet/quick-guide.html#Alignment

10
répondu dev 2013-11-20 12:32:03

après l'étude j'ai trouvé qu'après la fusion de 7 cellules, l'id de la cellule fusionnée sera 0 donc j'ai appliqué le style suivant à l'id de la cellule 0 en utilisant le style suivant.

headerStyle.setAlignment(headerStyle.ALIGN_CENTER);
9
répondu shrey 2017-05-15 12:57:25

D'après ce que j'ai compris, vous avez des cellules de début et de fin pour fusionner et vous voulez fusionner les gammes de cellules et aligner le contenu de la cellule. Si je suis de droite, vous pouvez utiliser la méthode suivante:

/**
 * @param startCell: first cell of merging area
 * @param endCell: last cell of merging area
 */

public static void mergeAndAlignCenter(HSSFCell startCell, HSSFCell endCell){
    //finding reference of start and end cell; will result like $A
    CellReference startCellRef= new CellReference(startCell.getRowIndex(),startCell.getColumnIndex());
    CellReference endCellRef = new CellReference(endCell.getRowIndex(),endCell.getColumnIndex());
    // forming string of references; will result like $A:$B 
    String cellRefernce = startCellRef.formatAsString()+":"+endCellRef.formatAsString();
    //removing $ to make cellRefernce like A1:B5
    cellRefernce = cellRefernce.replace("$","");
    //passing cellRefernce to make a region 
    CellRangeAddress region = CellRangeAddress.valueOf(cellRefernce);
    //use region to merge; though other method like sheet.addMergedRegion(new CellRangeAddress(1,1,4,1));
    // is also available, but facing some problem right now.
    startCell.getRow().getSheet().addMergedRegion( region );
    //setting alignment to center
    CellUtil.setAlignment(startCell, wb, CellStyle.ALIGN_CENTER);
}
3
répondu Sankumarsingh 2013-11-20 15:57:11

ce qui a fonctionné pour moi, c'est de mettre la Cellstyle de toutes les cellules fusionnées en alignement central. Si vous mettez les XSSFSheet.la méthode addMergedRegion () avant ou après avoir réglé les valeurs de cellstyle au centre n'a pas d'importance.

    private void insertXlsHeader(XSSFSheet sheet){
    ....
    //first cell for row1       
    cell = row1.createCell(colstart);
    cell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING);
    cell.setCellValue("COURSES");
    setHeaderCellStyle(sheet,cell);

    //first cell for row2
    cell = row2.createCell(colstart);
    setHeaderCellStyle(sheet,cell);

    //first cell for row3
    cell = row3.createCell(colstart);
    setHeaderCellStyle(sheet,cell);

    //merged the first cells of rows 1 to 3
    sheet.addMergedRegion(new CellRangeAddress(ROW1, ROW3, colstart, colstart));
    ...
    }

private void setHeaderCellStyle(XSSFSheet sheet,org.apache.poi.ss.usermodel.Cell cell) {
    CellStyle s = null;

        s = sheet.getWorkbook().createCellStyle();
        cell.setCellStyle(s);

    Font f = sheet.getWorkbook().createFont();

    f.setBoldweight(Font.BOLDWEIGHT_BOLD);


    s.setBorderBottom(CellStyle.BORDER_THIN);
    s.setBorderLeft(CellStyle.BORDER_THIN);
    s.setBorderRight(CellStyle.BORDER_THIN);
    s.setBorderTop(CellStyle.BORDER_THIN);
    s.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
    s.setAlignment(CellStyle.ALIGN_CENTER);
    s.setFont(f);

}
3
répondu Fritz 2015-04-16 03:53:49

comme il a été répondu plus haut, la fusion de cellules peut être réalisée en utilisant

sheet.addMergedRegion(new CellRangeAddress(frstRow, lastRow, firstColumnIndex, lastColumnIndex));

mais pour aligner les cellules verticalement, récemment j'ai fait face à la même question et j'ai essayé la réponse ci-dessus, mais en utilisant

CellUtil.setAlignment(dataCell, workbook, CellStyle.VERTICAL_CENTER);

aligné Date de cellules mises en forme à l'Horizontale aligné à Gauche. J'ai donc utilisé la méthode suivante pour définir seulement L'alignement Vertical du contenu de la cellule.

CellUtil.setCellStyleProperty(dataCell, workbook,CellUtil.VERTICAL_ALIGNMENT,CellStyle.VERTICAL_CENTER);

j'espère que cela aide!!

Bon Codage

1
répondu Nikhil G 2016-05-31 12:41:32

Cela a fonctionné pour moi et je pense que c'est plus propre:

/**
 * Merge and center the cells specified by range
 * @param startCell the first cell in the cells to be merged
 * @param range the range of the cells to be merged
 */
private static void mergeAndCenter(Cell startCell, CellRangeAddress range) {
    startCell.getSheet().addMergedRegion(range);
    CellStyle style = startCell.getSheet().getWorkbook().createCellStyle();
    style.setAlignment(CellStyle.ALIGN_CENTER);
    style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
    startCell.setCellStyle(style);
}
1
répondu Ivan Huang 2017-03-03 01:35:19

Utilisation style.setVerticalAlignment() pour définir les alignements verticaux au lieu de style.setAlignment ().

0
répondu Mahaveer Jangir 2017-06-09 05:55:04