Атрибут net.sf.jasperreports.style.backcolor не работает для текстовых полей во фрейме.

avatar
Liz
1 июля 2021 в 20:39
326
2
1

В моей базе данных есть шестнадцатеричные коды цветов для различных сценариев, и я хочу выделить строки, используя эти переменные цвета. Я использовал net.sf.jasperreports.style.backcolor, но все строки имеют тот же цвет фона, что и первая строка.

<frame>
    <reportElement stretchType="ContainerHeight" mode="Opaque" x="0" y="0" width="802" height="12" isRemoveLineWhenBlank="true">
        <propertyExpression name="net.sf.jasperreports.style.backcolor"><![CDATA[$F{sp_colour}]]></propertyExpression>
    </reportElement>
Источник

Ответы (2)

avatar
Liz
11 июля 2021 в 20:57
0

Спасибо, Алекс К. Первый вариант использования условного форматирования не сработает, поскольку пользователи могут выбирать большое количество цветов

.

Второй вариант применения атрибута net.sf.jasperreports.style.backcolor ко всем элементам был тем, о чем я думал, но с двумя строками сведений по 12+ элементов в каждой требовалось много времени.

Вместо этого я добавил элемент текстового поля того же размера, что и фрейм, в качестве первого элемента фрейма и применил к нему атрибут net.sf.jasperreports.style.backcolor. Я использовал printWhenExpression, так как раскрашивание требовалось только для специального изготовления, и поэтому сохранил альтернативное выделение строк для других строк в отчете

.
<frame>
    <reportElement style="Row" stretchType="ContainerHeight" mode="Opaque" x="0" y="0" width="802" height="12" isRemoveLineWhenBlank="true" uuid="b9bde183-f2ec-4051-8c7e-22072071357d"/>
    <textField isStretchWithOverflow="true" isBlankWhenNull="true">
        <reportElement mode="Opaque" x="0" y="0" width="798" height="12" uuid="d110cab3-6534-4c2a-9304-74a11c2a7cb8">
            <propertyExpression name="net.sf.jasperreports.style.backcolor"><![CDATA[$F{sp_colour}]]></propertyExpression>
            <printWhenExpression><![CDATA["Y".equals($F{is_special_make})]]>/printWhenExpression>
        </reportElement>
        <textElement verticalAlignment="Middle">
                <font fontName="Lucida Sans" size="6"/>
        </textElement>
    </textField>
avatar
Alex K
11 июля 2021 в 17:45
0

Похоже, что движок инициализирует атрибут фрейма, используя первую запись из источника данных и используя это начальное значение для всех остальных записей (2-я итерация из набора результатов, 3-я итерация и т. д.). Вероятно, это ошибка библиотеки JasperReports.

Проблему можно решить с помощью нескольких обходных путей.

Временное решение 1. Использование условного стиля

Введение условного стиля решает проблему. Если у нас есть N уникальных значений цветов, мы должны добавить по крайней мере N - 1<28033236 для одного условия цвета>6><28033536 для одного условия цвета .

Рабочий пример. Источник данных

Я использовал источник данных на основе csv для отчета о тестировании:

team1,team2,color1,color2,duration_color,date
BEL,POR,#0000FF,#7F8C8D,#FFFFFF,"27 June"
ITA,AUT,#0000FF,#7F8C8D,#F2F3F4,"26 June"
FRA,SUI,#7F8C8D,#0000FF,#F6DDCC,"28 June"
CRO,ESP,#7F8C8D,#0000FF,#F2F3F4,"28 June"
SWE,UKR,#7F8C8D,#0000FF,#F2F3F4,"29 June"
ENG,GER,#0000FF,#7F8C8D,#FFFFFF,"29 June"
NED,CZE,#7F8C8D,#0000FF,#FFFFFF,"27 June"
WAL,DEN,#7F8C8D,#0000FF,#FFFFFF,"26 June"

Первая строка в файле содержит имена столбцов и должна быть пропущена (например, с помощью настроек адаптера данных).

This file contains 3 unique colors (the field duration_color) that will be used as background color.

Рабочий пример. Шаблон отчета

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Backcolor, W1" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="colors"/>
    <style name="frameStyle">
        <conditionalStyle>
            <conditionExpression><![CDATA["#FFFFFF".equals($F{duration_color})]]></conditionExpression>
            <style/>
        </conditionalStyle>
        <conditionalStyle>
            <conditionExpression><![CDATA["#F2F3F4".equals($F{duration_color})]]></conditionExpression>
            <style/>
        </conditionalStyle>
        <conditionalStyle>
            <conditionExpression><![CDATA["#F6DDCC".equals($F{duration_color})]]></conditionExpression>
            <style/>
        </conditionalStyle>
    </style>
    <field name="team1" class="java.lang.String"/>
    <field name="team2" class="java.lang.String"/>
    <field name="color1" class="java.lang.String"/>
    <field name="color2" class="java.lang.String"/>
    <field name="duration_color" class="java.lang.String"/>
    <field name="date" class="java.lang.String"/>
    <detail>
        <band height="20">
            <frame>
                <reportElement style="frameStyle" mode="Opaque" x="172" y="0" width="250" height="20">
                    <propertyExpression name="net.sf.jasperreports.style.backcolor"><![CDATA[$F{duration_color}]]></propertyExpression>
                </reportElement>
                <textField>
                    <reportElement x="0" y="0" width="100" height="20"/>
                    <textElement textAlignment="Left" verticalAlignment="Middle"/>
                    <textFieldExpression><![CDATA[String.format("Match date: %s", $F{date})]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="100" y="0" width="60" height="20">
                        <propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$F{color1}]]></propertyExpression>
                    </reportElement>
                    <textElement textAlignment="Center" verticalAlignment="Middle"/>
                    <textFieldExpression><![CDATA[$F{team1}]]></textFieldExpression>
                </textField>
                <staticText>
                    <reportElement x="160" y="0" width="30" height="20"/>
                    <textElement textAlignment="Center" verticalAlignment="Middle"/>
                    <text><![CDATA[vs]]></text>
                </staticText>
                <textField>
                    <reportElement x="190" y="0" width="60" height="20">
                        <propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$F{color2}]]></propertyExpression>
                    </reportElement>
                    <textElement textAlignment="Center" verticalAlignment="Middle"/>
                    <textFieldExpression><![CDATA[$F{team2}]]></textFieldExpression>
                </textField>
            </frame>
        </band>
    </detail>
    <summary>
        <band height="50">
            <staticText>
                <reportElement mode="Opaque" x="20" y="0" width="100" height="20" backcolor="#F2F3F4"/>
                <text><![CDATA[Extra time]]></text>
            </staticText>
            <staticText>
                <reportElement mode="Opaque" x="20" y="20" width="100" height="20" backcolor="#F6DDCC"/>
                <text><![CDATA[Penalty shootout]]></text>
            </staticText>
        </band>
    </summary>
</jasperReport>

Три условных стиля были введены в frameStyle, и этот стиль применяется ко всему кадру.

Рабочий пример. Выходной результат

Я использовал Jaspersoft Studio (JSS) для создания выходного результата.

Preview at JSS

Временное решение 2. Применение атрибутов к элементам, а не к фрейму

Другой обходной путь заключается в применении атрибута net.sf.jasperreports.style.backcolor ко всем элементам (textField и staticText) вместо использования атрибута фрейма.

Рабочий пример. Шаблон отчета

В этом случае нет необходимости вводить условный стиль.

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Backcolor, W2" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="colors"/>
    <field name="team1" class="java.lang.String"/>
    <field name="team2" class="java.lang.String"/>
    <field name="color1" class="java.lang.String"/>
    <field name="color2" class="java.lang.String"/>
    <field name="duration_color" class="java.lang.String"/>
    <field name="date" class="java.lang.String"/>
    <detail>
        <band height="20">
            <frame>
                <reportElement x="172" y="0" width="250" height="20"/>
                <textField>
                    <reportElement mode="Opaque" x="0" y="0" width="100" height="20"/>
                    <textElement textAlignment="Left" verticalAlignment="Middle"/>
                    <textFieldExpression><![CDATA[String.format("Match date: %s", $F{date})]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement mode="Opaque" x="100" y="0" width="60" height="20">
                        <propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$F{color1}]]></propertyExpression>
                        <propertyExpression name="net.sf.jasperreports.style.backcolor"><![CDATA[$F{duration_color}]]></propertyExpression>
                    </reportElement>
                    <textElement textAlignment="Center" verticalAlignment="Middle"/>
                    <textFieldExpression><![CDATA[$F{team1}]]></textFieldExpression>
                </textField>
                <staticText>
                    <reportElement mode="Opaque" x="160" y="0" width="30" height="20">
                        <propertyExpression name="net.sf.jasperreports.style.backcolor"><![CDATA[$F{duration_color}]]></propertyExpression>
                    </reportElement>
                    <textElement textAlignment="Center" verticalAlignment="Middle"/>
                    <text><![CDATA[vs]]></text>
                </staticText>
                <textField>
                    <reportElement mode="Opaque" x="190" y="0" width="60" height="20">
                        <propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$F{color2}]]></propertyExpression>
                        <propertyExpression name="net.sf.jasperreports.style.backcolor"><![CDATA[$F{duration_color}]]></propertyExpression>
                    </reportElement>
                    <textElement textAlignment="Center" verticalAlignment="Middle"/>
                    <textFieldExpression><![CDATA[$F{team2}]]></textFieldExpression>
                </textField>
            </frame>
        </band>
    </detail>
    <summary>
        <band height="50">
            <staticText>
                <reportElement mode="Opaque" x="20" y="0" width="100" height="20" backcolor="#F2F3F4"/>
                <text><![CDATA[Extra time]]></text>
            </staticText>
            <staticText>
                <reportElement mode="Opaque" x="20" y="20" width="100" height="20" backcolor="#F6DDCC"/>
                <text><![CDATA[Penalty shootout]]></text>
            </staticText>
        </band>
    </summary>
</jasperReport>

Даже рамку можно снять.

Рабочий пример. Выходной результат

Результат, сгенерированный в JSS, абсолютно такой же:

Preview at JSS