使用apache poi合并和排列中心单元格
我想用Apache poi将数据导出为excel。
现在我面临的问题是我无法合并行并将它们alignment在中心。
导出数据的代码是
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列表合并,并使其中心。 请给我看看我被卡住的path。
我的解决scheme是合并单元格的位置,然后创build一个单元格(引用合并单元格的第一个块)来分配一个值,然后通过CellUtil设置alignment
// 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);
合并如下:::
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();
alignment也检查下面的官方链接的Apache poi :::
http://poi.apache.org/spreadsheet/quick-guide.html#Alignment
研究后我发现合并7个单元格后,合并的单元格ID将为0,所以我使用下面的样式将下面的样式应用于单元格ID 0。
headerStyle.setAlignment(headerStyle.ALIGN_CENTER);
按照我的理解,你有开始和结束单元格合并,你想合并单元格区域和alignment单元格的内容。 如果我是对的,你可以使用下面的方法:
/** * @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); }
那么对我来说,工作是将所有合并单元格Cellstyle设置为中心alignment。 无论您在将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); }
如上所述,可以使用合并单元来实现
sheet.addMergedRegion(new CellRangeAddress(frstRow, lastRow, firstColumnIndex, lastColumnIndex));
但为了垂直alignment细胞,最近我遇到了类似的问题,我尝试了以上的答案,但使用
CellUtil.setAlignment(dataCell, workbook, CellStyle.VERTICAL_CENTER);
alignmentdate格式的单元格为水平左alignment。 所以我使用下面的方法来设置单元格内容的垂直alignment。
CellUtil.setCellStyleProperty(dataCell, workbook,CellUtil.VERTICAL_ALIGNMENT,CellStyle.VERTICAL_CENTER);
我希望这有帮助!!
快乐的编码
这对我工作,我认为它更干净:
/** * 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); }
使用style.setVerticalAlignment()来设置垂直alignment而不是style.setAlignment()。