Apache POI生成XLSX文件在桌面端Excel出现单元格边框缺失、拉伸问题
问题产生原因
- 样式属性不完整:Apache POI 3.13版本的
cloneStyleFrom方法存在已知边框属性丢失缺陷,你仅设置了边框样式为细线,未显式指定边框颜色,克隆过程中边框颜色属性被写入空值或不符合微软Excel规范的默认值。桌面端Excel对样式合法性校验严格,判定边框属性不完整时会直接不渲染边框;而谷歌文档等在线Excel工具容错性更高,会自动补全缺失的边框颜色为默认黑色,因此显示正常。 - 布局计算逻辑不兼容:你开启了自动换行
setWrapText(true),POI 3.13计算单元格内容占比的逻辑和桌面端Excel不一致,写入文件的行高列宽参数不符合Excel预期,Excel打开时会重新计算布局导致单元格拉伸,在线Excel的布局计算逻辑和POI输出匹配度更高,不会出现拉伸问题。 - 合并单元格样式缺失:如果异常单元格属于合并区域,POI 3.13仅需要给合并区域左上角单元格设置样式即可正常写入,但桌面端Excel要求合并区域内所有单元格都具备一致的边框样式,否则会出现部分边框消失的问题。
修复方案
- 显式指定边框颜色,修改
getBaseStyle方法,补全边框颜色配置:
public static XSSFCellStyle getBaseStyle(CellStyle style, XSSFWorkbook wb) { XSSFCellStyle baseStyle = wb.createCellStyle(); baseStyle.cloneStyleFrom(style); baseStyle.setBorderBottom(BorderStyle.THIN); baseStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); baseStyle.setBorderTop(BorderStyle.THIN); baseStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); baseStyle.setBorderRight(BorderStyle.THIN); baseStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); baseStyle.setBorderLeft(BorderStyle.THIN); baseStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); return baseStyle; }
- 如果用到单元格合并,需要给合并区域内的所有单元格统一设置相同的样式,不要仅设置左上角单元格的样式。
- 生成文件时显式指定列宽和行高,避免桌面端Excel自动计算布局:
- 列宽设置:
sheet.setColumnWidth(列索引, 宽度值) - 行高设置:
row.setHeightInPoints(行高值)
- 列宽设置:
- 条件允许的情况下,将Apache POI升级到4.1.2及以上版本,该版本已修复
cloneStyleFrom的样式丢失问题,对桌面端Excel的兼容性大幅提升。
内容的提问来源于stack exchange,提问作者Булат Ихсанов
相关产品推荐
相关产品推荐

