因Poiji 4.1.1类路径冲突,如何不实例化XSSFColor设置Excel自定义填充色?
自定义Excel表头颜色的类路径冲突解决方案需求
背景
在Spring Boot项目中,需要为Excel表头单元格设置十六进制自定义颜色#00458D,目前使用索引颜色的方式可正常运行:
headerStyle.setFillForegroundColor(IndexedColors.DARK_BLUE.getIndex()); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
尝试的三种自定义颜色方法(均报错)
尝试1:ARGB十六进制方式
XSSFColor myColor = new XSSFColor(); myColor.setARGBHex("ff00458d"); headerStyle.setFillForegroundColor(myColor);
尝试2:通过java.awt.Color构造
headerStyle.setFillForegroundColor(new XSSFColor(new java.awt.Color(0, 69, 141), new DefaultIndexedColorMap())); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
尝试3:带IndexedColorMap的字节数组方式
IndexedColorMap colorMap = sheet.getWorkbook().getStylesSource().getIndexedColors(); XSSFColor color = new XSSFColor(new byte[]{0, 69, (byte)141}, colorMap); headerStyle.setFillForegroundColor(color); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
抛出的错误信息
java.lang.AbstractMethodError: Receiver class org.apache.poi.xssf.usermodel.XSSFColor does not define or inherit an implementation of the resolved method 'abstract byte[] getStoredRGB()' of abstract class org.apache.poi.ss.usermodel.ExtendedColor. at org.apache.poi.ss.usermodel.ExtendedColor.getRGBOrARGB(ExtendedColor.java:100) at org.apache.poi.xssf.usermodel.XSSFColor.getARGB(XSSFColor.java:203) at org.apache.poi.xssf.usermodel.XSSFColor.sameARGB(XSSFColor.java:392) at org.apache.poi.xssf.usermodel.XSSFColor.equals(XSSFColor.java:423) at org.apache.poi.xssf.usermodel.extensions.XSSFCellFill.equals(XSSFCellFill.java:186) at org.apache.poi.xssf.model.StylesTable.putFill(StylesTable.java:529) at org.apache.poi.xssf.usermodel.XSSFCellStyle.setFillPattern(XSSFCellStyle.java:1002)
根因分析
项目依赖了Poiji 4.1.1:
<dependency> <groupId>com.github.ozlerhakan</groupId> <artifactId>poiji</artifactId> <version>4.1.1</version> <scope>compile</scope> </dependency>
Poiji内部捆绑了旧版本的Apache POI jar包,导致类路径冲突:运行时加载的是Poiji中的旧版XSSFColor,该类未实现新版ExtendedColor抽象类新增的getStoredRGB()方法,因此实例化自定义RGB颜色的XSSFColor时触发AbstractMethodError。
约束条件
正确的修复方式是为Poiji依赖排除POI相关包:
<exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> </exclusion> </exclusions>
但这是已上线的大型项目,存在大量正在运行的Excel功能,当前无法修改依赖配置。
问题
是否存在完全不实例化XSSFColor的方法,比如直接操作CTFill/CTStylesheet XML等方式,为XSSFCellStyle设置#00458D自定义RGB填充色,从而规避类路径版本冲突?
内容的提问来源于stack exchange,提问作者Sandesh




