Я хотел бы показать / скрыть столбец во время выполнения в зависимости от определенного условия. Я использую «Печатать при выражении», чтобы условно показать / скрыть этот столбец (и его заголовок) в моем отчете. Когда столбец скрыт, пространство, которое он занимал бы, остается пустым, что не особенно привлекательно.
Я бы предпочел, чтобы дополнительное пространство использовалось более эффективно, возможности включают:
Теоретически я мог бы достичь первого, установив ширину столбца (и заголовка) равным 0, но также указав, что размер столбца должен измениться, чтобы соответствовать его содержимому. Но JasperReports не предоставляет параметр «изменить ширину по размеру содержимого».
Другая возможность - создавать отчеты с использованием Jasper API вместо определения шаблона отчета в XML. Но для такого простого требования это требует больших усилий.




Если это только один столбец, можно ли разместить этот столбец в крайнем правом углу, а затем использовать выражение print when. Таким образом, не останется дыры посередине. Я знаю, что это не идеально, поскольку в прошлом я пытался делать то, что вы пытаетесь выполнить в настоящее время, и не смог найти то, что я называю хорошим решением.
Вторая идея - создать второй отчет на основе первого без столбца, а затем при вызове отчета проверить условие, чтобы решить, какой из них вызывать. Опять не идеально, но сработает.
Я знаю, что на самом деле это не тот ответ, который вы искали, но одно из этих предложений может сработать для вас.
Небольшая вариация темы "второго отчета", которую я использовал, заключается в том, чтобы изолировать часть отчета, в которой есть необязательный столбец, в ее собственном вложенном отчете, а затем создать два вложенных отчета, один с столбцом и один без столбца, а затем использовать условия, чтобы определить, какой подотчет печатать.
Отметьте ЭТО. В этом руководстве они используют шаблон XML с платформой Velocity. Это довольно сложно. А чтобы было проще, вы можете использовать DynamicJasper. Эта библиотека представляет собой Java API с открытым исходным кодом, который работает через JasperReports и решает проблему динамических столбцов.
Удалить пустую строку: эта опция убирает вертикальное пространство, занимаемое объектом, если оно невидимый; видимость элемента определяется значением выражения, содержащегося в Печатать, когда атрибут выражения. Думайте о странице как о сетке, в которой размещены элементы, с линией, обозначающей пространство, которое занимает элемент. На рис. 4-17 выделена линия элемента A; в чтобы действительно удалить эту строку, все элементы, которые разделяют часть строки, должны быть нулевыми (то есть они не будут напечатаны).
Remove line when blank - Вопрос был в том, как скрыть столбец, а не строку
Я рекомендую использовать Динамические отчеты, он с открытым исходным кодом и основан на 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
Вывод с $ P {displayRecordNumber} = false
Как видите, столбцы хорошо адаптируются, на основе которых отображаются.
Вот видеоурок, в котором используется аналогичный подход: youtube.com/watch?v=Bmrqo9fDkOs
Первое решение на самом деле не сработает, потому что существует более одного столбца и в заголовке отчета есть цвет фона, поэтому он все равно будет выглядеть странно, если есть отсутствующие столбцы. Второе решение включает в себя дублирование отчета, чего я и пытаюсь избежать :) В любом случае спасибо!