2013-11-20 3 views
19

Ich möchte Daten exportieren, um Excel mit Apache poi.
Jetzt ist das Problem, dass ich konfrontiert bin, dass ich nicht in der Lage bin, Reihen zusammenzuführen und sie in der Mitte auszurichten.Merge und auszurichten Mittelzelle mit Apache poi

-Code für den Export Daten:

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

Jetzt möchte ich ItemWise Liste merge und machen es Mitte auszurichten.

Antwort

10

Merge wie :::

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

Für Überprüfen Sie auch die folgenden offiziellen Link von Apache poi Ausrichtung :::

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

+0

Ja, Sie haben Recht, ich bin in der Lage, Zelle zu verbinden, aber ich konnte es nicht zu zentrieren – shrey

3

Gemäß meinem Verständnis haben Sie beginnen und enden Zellen zum Zusammenführen und Sie möchten die Zellbereiche zusammenführen und den Zelleninhalt ausrichten. Wenn ich Recht habe, können Sie die folgende Methode verwenden:

/** 
* @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$1 
    CellReference startCellRef= new CellReference(startCell.getRowIndex(),startCell.getColumnIndex()); 
    CellReference endCellRef = new CellReference(endCell.getRowIndex(),endCell.getColumnIndex()); 
    // forming string of references; will result like $A$1:$B$5 
    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); 
} 
9

Nach Untersuchung finde ich, dass 7-Zellen nach der Fusion fusionierten Zellen-ID 0 wird so angelegt ich folgende Artidentifikation 0 mit folgendem Stil Zelle.

headerStyle.setAlignment(headerStyle.ALIGN_CENTER); 
11

Meine Lösung, die Zellen von ihren Positionen zu fusionieren war, erstellt dann eine Zelle (Verweis auf den ersten Block der fusionierten Zellen), einen Wert zuzuweisen und dann die Ausrichtung Throught der 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); 
+1

Verwenden Sie 'CellUtil.setAlignment (Zelle, HorizontalAlignment.CENTER);', die Methode *** setAlignment (Cell cell, Workbook workbook, short align) *** ist jetzt ab 3.15-beta2 veraltet. –

3

Nun, was für mich funktionierte, ist, den Zellstil aller verbundenen Zellen auf CENTER ALIGN zu setzen. Ob Sie die XSSFSheet.addMergedRegion() -Methode vor oder nach dem Festlegen der Zellstyle-Werte in die Mitte setzen, spielt keine Rolle.

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

} 
1

Wie beantwortet oben können verschmelzenden Zellen erreicht werden, indem

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

Aber für Zellen vertikal ausgerichtet wird, vor kurzem ich ähnliches Problem konfrontiert, und ich versuchte oben Antwort, aber mit

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

ausgerichtet Datum formatierte Zellen auf horizontal links ausgerichtet. Also habe ich folgende Methode verwendet, um nur die vertikale Ausrichtung des Zelleninhalts einzustellen.

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

Ich hoffe, das hilft !!

Glücklich Coding

1

Das ist für mich gearbeitet, und ich denke, es ist sauberer:

/** 
* 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); 
} 
+0

Können Sie näher erläutern, warum Sie es für "sauberer" halten? Der Einblick, warum oder wie etwas funktioniert, hilft anderen Benutzern sehr. –

0

Verwenden style.setVerticalAlignment() die vertikalen Ausrichtungen statt style.setAlignment einstellen().