Apache POI XSLF中如何设置表格groove、ridge等边框样式?
在Apache POI XSLF中实现Groove、Ridge、Inset、Outset边框样式
Apache POI的XSLFTableCell目前仅支持StrokeStyle类中定义的边框样式:
- LineDash:SOLID、DOT、DASH、DASH_DOT、LG_DASH、LG_DASH_DOT、SYS_DASH、SYS_DOT、SYS_DASH_DOT、SYS_DASH_DOT_DOT
- LineCompound:SINGLE、DOUBLE、THICK_THIN、THIN_THICK、TRIPLE
Groove、Ridge、Inset、Outset这类立体边框样式并未直接提供,不过可以利用复合线条(LineCompound)+ 分层颜色的方式模拟实现——这类立体效果本质是通过不同深浅的边框线条组合,营造出凹陷或凸起的视觉感。
模拟实现思路
- Inset/Groove(凹陷效果):
采用THICK_THIN复合线条,将外层粗线设置为较深的阴影色,内层细线设置为较浅的高光色,通过颜色深浅对比营造边框向内凹陷的视觉效果。 - Outset/Ridge(凸起效果):
与凹陷效果相反,采用THIN_THICK或THICK_THIN复合线条,将外层线条设置为较浅的高光色,内层线条设置为较深的阴影色,模拟边框向外凸起的效果。
代码示例
由于XSLF高层API对复合线条的分层颜色支持有限,需要直接操作底层OOXML对象来实现:
// 获取目标单元格 XSLFTableCell cell = ...; // 获取单元格样式的底层CTTcPr对象 CTTcPr tcPr = cell.getCTTc().getTcPr(); if (tcPr.getBdr() == null) { tcPr.addNewBdr(); } CTBdr bdr = tcPr.getBdr(); // 模拟Inset(凹陷)底部边框 CTBorder bottomBorder = bdr.addNewBottom(); // 设置复合线条样式为粗-细 bottomBorder.setCompound(STBorderCompound.THICK_THIN); // 设置外层粗线颜色为深灰色 bottomBorder.addNewSrgbClr().setVal(new byte[]{(byte)140, (byte)140, (byte)140}); // 设置内层细线颜色为浅灰色 CTBorderPr innerPr = bottomBorder.addNewPr(); innerPr.addNewSrgbClr().setVal(new byte[]{(byte)210, (byte)210, (byte)210}); // 设置边框宽度(单位:1/8 pt) bottomBorder.setSz(8); // 模拟Outset(凸起)顶部边框 CTBorder topBorder = bdr.addNewTop(); topBorder.setCompound(STBorderCompound.THIN_THICK); // 外层细线用浅灰色 topBorder.addNewSrgbClr().setVal(new byte[]{(byte)210, (byte)210, (byte)210}); // 内层粗线用深灰色 CTBorderPr topInnerPr = topBorder.addNewPr(); topInnerPr.addNewSrgbClr().setVal(new byte[]{(byte)140, (byte)140, (byte)140}); topBorder.setSz(8);
补充说明
- Groove和Inset、Ridge和Outset的视觉差异极小,仅需微调颜色深浅或线条宽度即可区分;
- 可根据实际需求调整颜色值和边框宽度,优化立体效果;
- 若需要为单元格的四个边框都设置样式,只需重复上述逻辑分别处理Top、Bottom、Left、Right边框即可。
内容的提问来源于stack exchange,提问作者Sahana Kumar
相关产品推荐
相关产品推荐

