AbstractMethodError в XSSFColor.getStoredRGB() при использовании пользовательского цвета заливки с Poiji 4.1.1 в пути к JAVA

Программисты JAVA общаются здесь
Anonymous
AbstractMethodError в XSSFColor.getStoredRGB() при использовании пользовательского цвета заливки с Poiji 4.1.1 в пути к

Сообщение Anonymous »

Проблема
Я пытаюсь установить собственный шестнадцатеричный цвет () в ячейках заголовка Excel с использованием Apache POI в проекте Spring Boot. Единственный подход, который работает без возникновения ошибки, — это использование индексированного цвета:

Код: Выделить всё

headerStyle.setFillForegroundColor(IndexedColors.DARK_BLUE.getIndex());
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
Но мне нужен точный цвет #00458D, поэтому я попробовал следующее:
Попытка 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 в пути к классам:

Код: Выделить всё

com.github.ozlerhakan
poiji
4.1.1
compile

Poiji включает в себя собственные jar-файлы Apache POI. Это создает конфликт пути к классам — во время выполнения загружается XSSFColor из старого связанного POI Ji, который не реализует getStoredRGB(), который был добавлен как абстрактный метод в новый класс ExtendedColor. Таким образом, любая попытка создать экземпляр XSSFColor с пользовательским цветом RGB вызывает эту AbstractMethodError внутри setFillPattern().

Ограничение
Я знаю, что чистое решение — добавить исключения POI в зависимость Poiji:

Код: Выделить всё


org.apache.poi
poi


org.apache.poi
poi-ooxml


Однако это крупный существующий проект с большим количеством функций Excel, которые уже созданы и находятся в производстве. Изменение конфигурации зависимостей сейчас невозможно.

Вопрос
Есть ли способ применить собственный цвет RGB () в XSSFCellStyle, что полностью позволяет избежать создания экземпляра XSSFColor — например, с помощью необработанных XML-манипуляций CTFill / CTStylesheet или любого другого подхода — чтобы никогда не возникал конфликт версий пути к классам?
Любая помощь приветствуется.>

Вернуться в «JAVA»