Я думаю, что самый простой способ приблизиться к этому, учитывая представления типов данных и всю сложность Crystal под обложками, - это расположить в отчете все 25 полей с соответствующим размером.
Затем во время выполнения вам потребуется изменить положение объектов отчета, что может быть немного сложнее из-за относительно неструктурированного способа, которым кристалл предоставляет информацию.
Способ, которым я бы подошел к этому, состоит в том, чтобы циклически проходить по объектам отчета и генерировать один SortedList для полей данных и один SortedList для полей заголовка. Они должны быть отсортированы в левом положении, чтобы вы могли обрабатывать их в порядке появления.
После того, как у вас есть отсортированные списки объектов, вы можете циклически перебирать каждый из них и, если он не был выбран пользователем, установить для ширины значение 0.
По мере перемещения по полям вы будете отслеживать текущую левую позицию. Первое поле, которое вы обрабатываете, установит вашу начальную точку, даже если она не видна. Затем для всех последующих полей, если поле является видимым, вы установите его левое значение в текущую левую позицию, а затем добавите его ширину и некоторое пространство разделителя в текущую левую позицию для следующего поля.
Надеюсь, это поможет вам решить вашу проблему.