You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

因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

火山引擎 最新活动