Apache POI Excel开发:如何设置图表填充颜色透明度
Apache POI 实现Excel面积图填充颜色透明度设置
问题原因
原有代码透明度不生效的核心问题是:通过XDDFColor.from(PresetColor.LIGHT_GREEN)生成的颜色容器中,已经存在预设颜色的对应节点,后续调用addNewHslClr()是在同个CTColor容器下追加了第二个独立的颜色定义节点,属于结构冲突。Excel解析颜色配置时只会读取第一个匹配的颜色节点,后续追加的带alpha通道的HSL颜色节点会被直接忽略。
OOXML标准中alpha属性取值规则为千分比整数,50000对应50%不透明度,取值范围0~100000,值越小透明度越高,原代码中这个参数的设置逻辑本身是正确的。
正确实现步骤
- 不要直接使用
XDDFColor.from()生成现成颜色对象后追加节点,要手动创建空的CTColor容器,在容器内定义目标颜色的同时挂载alpha通道配置,再包装为XDDFColor实例 - 面积图需要同时给系列填充属性、边框线条属性设置带透明度的颜色,避免边框完全不透明造成透明度未生效的视觉误差
- 优先使用SRGB颜色模式定义颜色,兼容性比HSL、预设颜色模式更好
可运行代码示例
import org.apache.poi.xddf.usermodel.*; import org.apache.poi.xddf.usermodel.chart.XDDFChartData; import org.openxmlformats.schemas.drawingml.x2006.main.*; // 手动构建带alpha通道的颜色 CTColor ctColor = CTColor.Factory.newInstance(); CTSRgbColor srgbColor = ctColor.addNewSrgbClr(); // 设置浅绿的RGB值,对应十六进制#90EE90 srgbColor.setVal(new byte[]{(byte) 0x90, (byte) 0xEE, (byte) 0x90}); // 添加50%透明度配置 CTPositiveFixedPercentage alphaVal = srgbColor.addNewAlpha(); alphaVal.setVal(50000); XDDFColor transparentColor = new XDDFColor(ctColor); // 配置填充和线条属性 XDDFChartData.Series targetSeries = data.getSeries(2); XDDFSolidFillProperties transparentFill = new XDDFSolidFillProperties(transparentColor); XDDFLineProperties seriesLine = new XDDFLineProperties(); seriesLine.setFillProperties(transparentFill); // 挂载属性到图表系列 XDDFShapeProperties shapeProps = targetSeries.getShapeProperties(); if (shapeProps == null) { shapeProps = new XDDFShapeProperties(); } shapeProps.setFillProperties(transparentFill); shapeProps.setLineProperties(seriesLine); targetSeries.setShapeProperties(shapeProps);
补充说明
如果需要使用预设颜色而非自定义RGB值,实现逻辑完全一致:创建空CTColor容器后调用
addNewPrstClr()设置预设颜色枚举值,再给该预设颜色节点添加alpha子节点即可,禁止在已生成的颜色容器中重复追加不同类型的颜色节点。
内容的提问来源于stack exchange,提问作者Owen Kirkeby
相关产品推荐
相关产品推荐

