Apache POI - Цвет темы для условного форматирования на основе формул (XSSFFontFormatting) - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать условное форматирование на основе формулы, используя poi api. Цвет шрифта устанавливается путем чтения другой (шаблон / ссылка) ячейки. Проблема заключается в том, что текущий API не учитывает цвет на основе темы для условий на основе формул. Я что-то пропустил? Есть ли способ заставить эту работу?

    public void test(XSSFCellStyle style, String complexFormula){
        ....
        XSSFConditionalFormattingRule rule = (XSSFConditionalFormattingRule )
                      sheetCF.createConditionalFormattingRule(complexFormula);
        XSSFConditionalFormattingRule (rule,style);
    }

    protected void createConditionalFormatingRules(XSSFConditionalFormattingRule rule, XSSFCellStyle style) {

        XSSFFontFormatting fontFmt = (XSSFFontFormatting) rule.createFontFormatting();
        XSSFFont font = style.getFont();

        fontFmt.setFontColorIndex(font.getXSSFColor());  // BROKEN -- this doe not work for theme color

        fontFmt.setFontHeight(font.getFontHeight());
        fontFmt.setUnderlineType(font.getUnderline());
        fontFmt.setFontStyle(font.getItalic(), font.getBold());
        fontFmt.setEscapementType(FontFormatting.SS_NONE);
    }

Выше, fontFmt.setFontColorIndex (font.getXSSFColor ()); не работает для цвета темы. Он работает для стандартных цветов.

poi-oo xml -4.1.0

спасибо за внимание к моей проблеме !!

1 Ответ

0 голосов
/ 29 февраля 2020

В XSSFFontFormatting.setFontColor (Color) есть ошибка. Он устанавливает только значение RGB, но не значение Tint.

Я решил это, добавив следующий код, чтобы установить оттенок.

        XSSFColor color = font.getXSSFColor();
        if(color != null) {
            fontFmt.setFontColor(color);
            //Themed color is not handed properly by poi. Hence have to handle it below.
            if(color.isThemed()) {
                CTFont ctFont = (CTFont) getFieldValWithReflection(fontFmt,"_font");
                if(ctFont != null && ctFont.sizeOfColorArray()>0){
                    CTColor c = ctFont.getColorArray(0);
                    if(color.hasTint())
                        c.setTint(font.getXSSFColor().getTint());
                    if(color.isIndexed())
                        c.setIndexed(color.getIndexed());
                }
            }
        }

    /**
     * Helper for the very common case of having to get underlying XML data.
     */
    private Object getFieldValWithReflection(Object owner, String fieldName) {
        Field f = null;
        Object val = null;
        try {
            f = owner.getClass().getDeclaredField(fieldName);
            f.setAccessible(true);

            val = f.get(owner);
            return val;

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (f != null) {
                f.setAccessible(false);
            }
        }

        return null;
    }


...