我想使用 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 合并并使其对齐中心。
答案 0 :(得分:16)
我的解决方案是按位置合并单元格,然后创建一个单元格(引用合并单元格的第一个块)以指定值,然后通过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 :(得分:11)
合并:::
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
答案 2 :(得分:9)
经过研究,我发现在合并7个单元格之后,合并的单元格id将为0,因此我使用以下样式将以下样式应用于单元格ID 0。
headerStyle.setAlignment(headerStyle.ALIGN_CENTER);
答案 3 :(得分: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);
}
答案 4 :(得分:3)
对我来说有用的是设置所有合并的单元格&#39; 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);
}
答案 5 :(得分:2)
如上所述,可以使用
实现合并细胞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);
我希望这会有所帮助!!
快乐编码
答案 6 :(得分:2)
这对我有用,我认为它比较清洁:
/**
* 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);
}
答案 7 :(得分:0)
使用
style.setVerticalAlignment()
设置垂直对齐而不是
style.setAlignment().
答案 8 :(得分:0)
我们可以合并列,也可以垂直和水平对齐。
我的A列的第2至10行的值相同。
我使用以下代码合并了变量sheet
为XSSFSheet
的数据。 CellRangeAddress
的参数的参数是开始行,最后一行,开始列和最后一列。在我的示例中,值USA
从第二行开始(索引为1),而USA
的最后一个值位于第十行,而列为第一列。
CellRangeAddress ca = new CellRangeAddress(1,9,0,0);
sheet.addMergedRegion(ca);
当我执行上面的代码时,单元格被合并,但文本未居中对齐。
为解决此问题,我使用了CellStyle
和Cell
类。将第一列文字的第二行获取到cell
变量中。现在,将垂直和水平对齐方式设置为cellStyle
,并将此样式设置为cell
,它将文本对齐到中心。
Cell cell = sheet.getRow(1).getCell(0);
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cell.setCellStyle(cellStyle);
以下是最终结果
其他参考: