首页 文章

使用apache poi合并并对齐中心单元

提问于
浏览
24

我想使用 Apache poi 将数据导出到Excel .
现在我遇到的问题是我无法合并行并将它们对齐在中心 .

出口数据代码是:

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 List 合并并使其对齐中心 .

8 回答

  • 3

    我的解决方案是按位置合并单元格,然后创建一个单元格(引用合并单元格的第一个块)来分配值,然后通过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);
    
  • 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 poi的以下官方链接:::

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

  • 15

    经过研究,我发现在合并7个单元格后,合并的单元格id将为0,因此我使用以下样式将以下样式应用于单元格ID 0 .

    headerStyle.setAlignment(headerStyle.ALIGN_CENTER);
    
  • 2

    根据我的理解,您有合并的开始和结束单元格,并且您希望合并单元格范围并对齐单元格内容 . 如果我是对的,您可以使用以下方法:

    /**
     * @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);
    }
    
  • 2

    那么对我有用的是将所有合并的单元格'Cellstyle设置为CENTER ALIGN . 是否在将cellstyle值设置为center之前或之后放置XSSFSheet.addMergedRegion()方法无关紧要 .

    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);
    
    }
    
  • 9

    如上所述,可以使用合并单元来实现

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

    但是为了垂直对齐细胞,最近我面临类似的问题,我尝试了上面的答案,但使用

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

    对齐日期格式化单元格为水平左对齐 . 所以我使用以下方法仅设置Cell内容的Vertical Alignment .

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

    我希望这有帮助!!

    Happy Coding

  • 0

    这对我有用,我认为它更清洁:

    /**
     * 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);
    }
    
  • 3

    使用

    style.setVerticalAlignment()
    

    设置垂直对齐而不是

    style.setAlignment().
    

相关问题