Apache POI实现XSSFWorkbook所有工作表单元格居中对齐问题
问题分析与解决方案
你的代码存在两个关键问题导致文本未居中:
- 只设置了垂直居中,缺少水平居中的配置,单元格默认是左对齐,所以文本不会呈现水平居中效果。
getColumnHelper().setColDefaultStyle仅对后续新创建的单元格生效,已经存在的单元格不会自动继承这个列默认样式,必须手动为每个已有单元格应用样式。
修正后的代码
XSSFCellStyle cellStyle = workbook.createCellStyle(); // 同时配置水平和垂直居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.CENTER); for (int i = 0; i < workbook.getNumberOfSheets(); i++) { XSSFSheet sheet = workbook.getSheetAt(i); if (sheet.getRow(0) == null) { continue; } // 1. 设置列默认样式(对后续新建的单元格生效) int lastColNum = sheet.getRow(0).getLastCellNum(); for (int j = 0; j < lastColNum; j++) { sheet.autoSizeColumn(j); sheet.getColumnHelper().setColDefaultStyle(j, cellStyle); } // 2. 遍历所有已有单元格,手动应用居中样式 for (Row row : sheet) { for (Cell cell : row) { cell.setCellStyle(cellStyle); } } }
额外注意事项
- 若表格包含合并单元格,需单独处理:通过
sheet.getMergedRegions()获取所有合并区域,为每个区域的顶部单元格设置样式(合并单元格的样式由顶部单元格决定)。 - 务必复用CellStyle:不要在循环内重复创建样式,否则会导致Excel文件体积过大,甚至触发POI的样式数量上限,你当前全局创建一个样式的做法是正确的。
内容的提问来源于stack exchange,提问作者Discipulos
相关产品推荐
相关产品推荐

