У нас была та же проблема, и мы не нашли решения, просто уродливые обходные пути.
Мы начали с простого решения с двумя проектами, когда у нас было два варианта.
Когда появилось больше вариантов, это стало невозможно поддерживать.Теперь мы используем динамическую структуру:
$P{field_name1} | $P{field_name2}
------
$F{value1} | $P{value2} ...
Мы передаем имена полей в качестве параметров и используем динамический источник данных.Мы не показываем последние пустые столбцы, если они существуют.Обратите внимание, что нам нужно было выполнить динамический запрос и заполнить источник данных в коде, поэтому это может быть нереальным решением.
Другой вариант, который у вас есть, - это создать Jasper Design в коде (мы также делаем этодругой сценарий) - мы загружаем шаблон jrxml, а затем динамически добавляем полосы и элементы по мере необходимости.
JasperDesign jasperDesign = JRXmlLoader.load(myJrxml);