Как показать / скрыть столбец во время выполнения?

Я хотел бы показать / скрыть столбец во время выполнения в зависимости от определенного условия. Я использую «Печатать при выражении», чтобы условно показать / скрыть этот столбец (и его заголовок) в моем отчете. Когда столбец скрыт, пространство, которое он занимал бы, остается пустым, что не особенно привлекательно.

Я бы предпочел, чтобы дополнительное пространство использовалось более эффективно, возможности включают:

  • ширина отчета уменьшается на ширину скрытого столбца
  • дополнительное пространство распределяется между оставшимися столбцами

Теоретически я мог бы достичь первого, установив ширину столбца (и заголовка) равным 0, но также указав, что размер столбца должен измениться, чтобы соответствовать его содержимому. Но JasperReports не предоставляет параметр «изменить ширину по размеру содержимого».

Другая возможность - создавать отчеты с использованием Jasper API вместо определения шаблона отчета в XML. Но для такого простого требования это требует больших усилий.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
0
24 951
8

Ответы 8

Если это только один столбец, можно ли разместить этот столбец в крайнем правом углу, а затем использовать выражение print when. Таким образом, не останется дыры посередине. Я знаю, что это не идеально, поскольку в прошлом я пытался делать то, что вы пытаетесь выполнить в настоящее время, и не смог найти то, что я называю хорошим решением.

Вторая идея - создать второй отчет на основе первого без столбца, а затем при вызове отчета проверить условие, чтобы решить, какой из них вызывать. Опять не идеально, но сработает.

Я знаю, что на самом деле это не тот ответ, который вы искали, но одно из этих предложений может сработать для вас.

Первое решение на самом деле не сработает, потому что существует более одного столбца и в заголовке отчета есть цвет фона, поэтому он все равно будет выглядеть странно, если есть отсутствующие столбцы. Второе решение включает в себя дублирование отчета, чего я и пытаюсь избежать :) В любом случае спасибо!

Dónal 23.09.2008 06:55

Небольшая вариация темы "второго отчета", которую я использовал, заключается в том, чтобы изолировать часть отчета, в которой есть необязательный столбец, в ее собственном вложенном отчете, а затем создать два вложенных отчета, один с столбцом и один без столбца, а затем использовать условия, чтобы определить, какой подотчет печатать.

Отметьте ЭТО. В этом руководстве они используют шаблон XML с платформой Velocity. Это довольно сложно. А чтобы было проще, вы можете использовать DynamicJasper. Эта библиотека представляет собой Java API с открытым исходным кодом, который работает через JasperReports и решает проблему динамических столбцов.

Удалить пустую строку: эта опция убирает вертикальное пространство, занимаемое объектом, если оно невидимый; видимость элемента определяется значением выражения, содержащегося в Печатать, когда атрибут выражения. Думайте о странице как о сетке, в которой размещены элементы, с линией, обозначающей пространство, которое занимает элемент. На рис. 4-17 выделена линия элемента A; в чтобы действительно удалить эту строку, все элементы, которые разделяют часть строки, должны быть нулевыми (то есть они не будут напечатаны).

Remove line when blank - Вопрос был в том, как скрыть столбец, а не строку

Alex K 25.08.2013 22:55

Я рекомендую использовать Динамические отчеты, он с открытым исходным кодом и основан на JasperReports. Основное преимущество этой библиотеки - динамический дизайн отчетов и отсутствие необходимости в визуальном дизайнере отчетов.

Думаю, этот ответ приходит слишком поздно, но я добавляю его для протокола. В моем случае я мог бы решить эту проблему без каких-либо дополнительных зависимостей или инструментов. В файле JRXML я просто несколько раз добавил ширину текстовых полей в динамическую ширину. Один раз за возможную ширину. Затем для каждого текстового поля я установил, что его следует печатать только в случае определенного условия.

Это может быть не так элегантно, как динамическая установка ширины, но позволяет без проблем с дополнительными библиотеками.

JasperDesign используется для изменения объекта шаблона (JasperReport) из кода во время выполнения. Думаю, это может подойти к твоему случаю.

В более поздних версиях (v5 или выше) отчетов jasper вы можете использовать компонент jr:table, и действительно достигнет этого (без использования кода Java, такого как использование dynamic-jasper или dynamic-reports).

Метод использует <printWhenExpression/> под <jr:column/>

Пример

Образец данных

+----------------+--------+
|      User      |  Rep   |
+----------------+--------+
| Jon Skeet      | 854503 |
| Darin Dimitrov | 652133 |
| BalusC         | 639753 |
| Hans Passant   | 616871 |
| Me             |   6487 |
+----------------+--------+

Пример jrxml

Примечание: параметр $P{displayRecordNumber} и <printWhenExpression> под первым jr:column

<?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 = "reputation" pageWidth = "595" pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20" topMargin = "20" bottomMargin = "20" uuid = "a88bd694-4f90-41fc-84d0-002b90b2d73e">
    <style name = "table">
        <box>
            <pen lineWidth = "1.0" lineColor = "#000000"/>
        </box>
    </style>
    <style name = "table_TH" mode = "Opaque" backcolor = "#F0F8FF">
        <box>
            <pen lineWidth = "0.5" lineColor = "#000000"/>
        </box>
    </style>
    <style name = "table_CH" mode = "Opaque" backcolor = "#BFE1FF">
        <box>
            <pen lineWidth = "0.5" lineColor = "#000000"/>
        </box>
    </style>
    <style name = "table_TD" mode = "Opaque" backcolor = "#FFFFFF">
        <box>
            <pen lineWidth = "0.5" lineColor = "#000000"/>
        </box>
    </style>
    <subDataset name = "tableDataset" uuid = "7a53770f-0350-4a73-bfc1-48a5f6386594">
        <field name = "User" class = "java.lang.String"/>
        <field name = "Rep" class = "java.math.BigDecimal"/>
    </subDataset>
    <parameter name = "displayRecordNumber" class = "java.lang.Boolean">
        <defaultValueExpression><![CDATA[true]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <title>
        <band height = "50">
            <componentElement>
                <reportElement key = "table" style = "table" x = "0" y = "0" width = "555" height = "47" uuid = "76ab08c6-e757-4785-a43d-b65ad4ab1dd5"/>
                <jr:table xmlns:jr = "http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                    <datasetRun subDataset = "tableDataset" uuid = "07e5f1c2-af7f-4373-b653-c127c47c9fa4">
                        <dataSourceExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column width = "90" uuid = "918270fe-25c8-4a9b-a872-91299cddbc31">
                        <printWhenExpression><![CDATA[$P{displayRecordNumber}]]></printWhenExpression>
                        <jr:columnHeader style = "table_CH" height = "30" rowSpan = "1">
                            <staticText>
                                <reportElement x = "0" y = "0" width = "90" height = "30" uuid = "5cd6da41-01d5-4f74-99c2-06784f891d1e"/>
                                <textElement textAlignment = "Center" verticalAlignment = "Middle"/>
                                <text><![CDATA[Record number]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style = "table_TD" height = "30" rowSpan = "1">
                            <textField>
                                <reportElement x = "0" y = "0" width = "90" height = "30" uuid = "5fe48359-0e7e-44b2-93ac-f55404189832"/>
                                <textElement textAlignment = "Center" verticalAlignment = "Middle"/>
                                <textFieldExpression><![CDATA[$V{REPORT_COUNT}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width = "90" uuid = "7979d8a2-4e3c-42a7-9ff9-86f8e0b164bc">
                        <jr:columnHeader style = "table_CH" height = "30" rowSpan = "1">
                            <staticText>
                                <reportElement x = "0" y = "0" width = "90" height = "30" uuid = "61d5f1b6-7677-4511-a10c-1fb8a56a4b2a"/>
                                <textElement textAlignment = "Center" verticalAlignment = "Middle"/>
                                <text><![CDATA[Username]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style = "table_TD" height = "30" rowSpan = "1">
                            <textField>
                                <reportElement x = "0" y = "0" width = "90" height = "30" uuid = "a3cdb99d-3bf6-4c66-b50c-259b9aabfaef"/>
                                <box leftPadding = "3" rightPadding = "3"/>
                                <textElement verticalAlignment = "Middle"/>
                                <textFieldExpression><![CDATA[$F{User}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width = "90" uuid = "625e4e5e-5057-4eab-b4a9-c5b22844d25c">
                        <jr:columnHeader style = "table_CH" height = "30" rowSpan = "1">
                            <staticText>
                                <reportElement x = "0" y = "0" width = "90" height = "30" uuid = "e1c07cb8-a44c-4a8d-8566-5c86d6671282"/>
                                <textElement textAlignment = "Center" verticalAlignment = "Middle"/>
                                <text><![CDATA[Reputation]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style = "table_TD" height = "30" rowSpan = "1">
                            <textField pattern = "#,##0">
                                <reportElement x = "0" y = "0" width = "90" height = "30" uuid = "6be2d79f-be82-4c7b-afd9-0039fb8b3189"/>
                                <box leftPadding = "3" rightPadding = "3"/>
                                <textElement textAlignment = "Right" verticalAlignment = "Middle"/>
                                <textFieldExpression><![CDATA[$F{Rep}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </title>
</jasperReport>

Вывод с $ P {displayRecordNumber} = true

true

Вывод с $ P {displayRecordNumber} = false

false

Как видите, столбцы хорошо адаптируются, на основе которых отображаются.

Вот видеоурок, в котором используется аналогичный подход: youtube.com/watch?v=Bmrqo9fDkOs

Kamal 09.03.2018 02:39

Другие вопросы по теме