2013-11-20 2 views
19

Я хочу экспортировать данные в excel с помощью Apache poi.
Теперь проблема, с которой я столкнулась, заключается в том, что я не могу объединить строки и выровнять их по центру.Слияние и выравнивание центральной ячейки с использованием apache poi

Код для экспорта данных:

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

Теперь я хочу ItemWise Список слияния и сделать его выравнивание по центру.

ответ

10

Слияние как :::

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

Для выравнивания также проверьте ниже официального звена Apache пои :::

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

+0

Да, вы правы, я могу слить ячейку, но я не смог сделать ее аллигатором. – shrey

3

Согласно моему пониманию, вы начинаете и конечные клетки для слияния, и вы хотите объединить диапазоны ячеек и выровнять содержимое ячейки. Если я прав, вы можете использовать следующий метод:

/** 
* @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

После исследования я обнаружил, что после слияния 7 клеток, слившиеся клетки идентификатор будет 0, так я применил следующий стиль для Cell ID 0, используя следующий стиль.

headerStyle.setAlignment(headerStyle.ALIGN_CENTER); 
11

Мое решение было объединить клетки путем их позиций, а затем создал ячейку (ссылка на первый блок из объединенных ячеек), чтобы присвоить значение, а затем установить выравнивание Повсеместно в 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

Используйте 'CellUtil.setAlignment (cell, HorizontalAlignment.CENTER);', метод *** setAlignment (Cell cell, Workbook workbook, short align) *** теперь устарел от версии 3.15-beta2. –

3

Ну, что сработало для меня, это установить все сотовые ячейки «Cellstyle» в CENTER ALIGN. Внесите ли вы метод XSSFSheet.addMergedRegion() до или после установки значений cellstyle в центр, не имеет значения.

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

Как ответил выше, сливающиеся клетки могут быть достигнуты с помощью

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

Но для выравнивания ячеек по вертикали, в последнее время я столкнулся с аналогичной проблемой, и я попытался выше ответ, но с использованием

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

выровненные по дате отформатированные ячейки до горизонтального выравнивания по левому краю. Поэтому я использовал следующий метод для установки только вертикального выравнивания содержимого ячеек.

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

Надеюсь, это поможет!

Счастливый Coding

1

Это работает для меня, и я думаю, что это уборщик:

/** 
* 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

Можете ли вы рассказать о том, почему вы думаете, что это «чище»? Проницательность относительно того, почему и как что-то работает, помогает многим другим пользователям. –

0

Использование style.setVerticalAlignment() установить вертикальное выравнивание вместо style.setAlignment().

Смежные вопросы