В автоматизации отчетности очень часто используют открытую Java-библиотеку JasperReports, например статья Опенсорс-решение для автоматизации отчетности рассказывает об ее использовании для получения PDF форматов отчетности между делом упомянув о возможности экспорта в другие форматы. Однако нередко возникает потребность получать данные не в твердой копии, а в форматах электронных таблиц и в этом направлении в библиотеке JasperReports есть мощный инструмент Crosstab. Вместе с механизмом экспорта в форматы электронных таблиц данный инструмент может быть востребован для получения форматированных документов, которые годны как отчеты для анализа, так и для дальнейшей обработки данных. Основная цель использования печатной формы - выгрузка данных в электронную таблицу для дальнейшего использования данных. Разработку печатной формы будем делать в среде TIBCO Jaspersoft® Studio Основой для построения любых форм библиотека JasperReports использует наборы данных DataSet. Существует множество способов заполнения данных.  Для простоты и скорости данные будут формироваться в open-source решении MyCompany работающего на open-source разработке lsFusion.   Все нижесказанное справедливо к jasper report вообще, если не принимать во внимание специфику получения данных из LsFusion. Более того, подключаемая в данном решении дополнительная java обработка как внешняя - в других решениях просто будет интегрирована. Пример формы будем делать для отчета по продажам определенного в модуле SalesLedgerReport. Допишем в файл  SalesLedgerReport.lsf следующее После запуска программы в отчете по продажам появятся 2 кнопки  Согласно документации формируем шаблоны jrxml из интерфейса превью. В итоге в каталоге ../src/main/lsfusion получим файл Далее будем работать с файлом Sales_salesLedgerReport.jrxml в TIBCO Jaspersoft® Studio В шаблоне уже сформирован заголовок и вставлена автоматически сформированная Detail область. Для наших целей Detail 1 можно удалить. Вставляем Crosstab из палитры в раздел Summary Оставляем основной источник данных отчета Колонки сделаем год, месяц (на номер месяца исправим позже) В качестве групп возьмем 4 верхних группы и наименование товара. Сразу сделаем верхнюю группу с итогом внизу, а остальные вверху. Строчки итогов будут играть роль строк групп.  Мерами возьмем для примера количество и сумму продаж.  Оформление принимаем по умолчанию. Оно настолько яркое, что дальше от него можно избавится. Разделы Detail1 и шапку таблицы в заголовке удаляем, сохраняем шаблон. После перезапуcка программы команда Печать хslx покажет заполненный шаблон в электронной таблице.  В принципе команда Печать превью нам тоже больше не нужна. Таблица будет заточена под вывод в xlsx формат и в печатном представлении не будет выглядеть хорошо. Теперь, как говорится, доработаем напильником до привычного вида. Поправим группировку с наименование месяца на его номер (исправим выше сделанную ошибку) Вернем наименование месяца через объявление новой меры с максимальным значением внутри группы и поправим имя в заголовке. Развернем поля данных в горизонтальном направлении и сделаем пошире. При форматировании учитывайте, что для каждого окончания ячейки при экспорте в электронную таблицу генерируется новая колонка. Поэтому даже заголовок отчета желательно выровнять по ширине полей основного поля. Оформим ячейки с цифрами  Чтобы было в электронной таблице удобней работать - перебросим формулы в ячейках как показано на картинке (конвертируйте ячейки static в text), а сами ячейки сделаем с 0 шириной  Удаляем стили, копируем в отчет свои. Назначаем стили по строкам. Кстати Crosstab удобен не только тем, что считает итоги по группам самостоятельно, но и тем, что создает переменные итогов по группам доступные на всех нижележащих уровнях.  это дает широкую возможность добавлять расчетные показатели начиная от долей до формул различного факторного анализа. На этом этапе должны получить следующее: В готовом отчете хотелось бы получить следующие вкусности Смещение текста нижестоящих групп Работающее дерево иерархии отчета в электронной таблице Пропуск пустых групп. Заморозка строк/столбцов Все эти перечисленные вещи (кроме последней) в jasper report  для экспорта в электронную таблицу довольно неудобны для быстрого использования, поэтому пришел к тому, что слева от отчета добавляю колонку (которая скрывается при выводе) в которой помещаю номер уровня. И после формирования xlsx файла делаю его дообработку. Итак Добавим в проект в папку .../src/main/java  файл с именем XlsCreateRowOutline.java со следующим содержимым  Итоговый текст с учетом вышесказанного, добавленный в модуле lsFusion, будет таким: Обработка согласно количеству вставленных табуляторов в ячейках добавила в них поля, согласно номеру уровня - сформировала иерархию. Если наименование в уровне null то уровень при формировании помечается отрицательным и при выводе строка удаляется. Уровень иерархии в таком случае можно либо сохранить (удаленные пустые группы увеличивают уровень группировки), либо нет.Выше по картинками видно что смещения текста в уровнях сделаны табулятором - это не нужно. В зависимости от уровня обработка смещает текст сама (см.: cellXSSF.getCellStyle().setIndention) В итоге получаем вполне годную форму для дальнейшей работы в электронной таблице. Если в отчете присвоить имя Anchor то поле при экспорте в xlsx становится именованным  что позволяет в шаблон отчета вставлять поля с формулами эксель в виде сводок и произвольных формул Устанавливаем свойство экспорта в электронную таблицу Не забыть добавить свойство ко всему отчету Итого получим в ячейке результат работающий как формула. (В Calc возможно надо будет после открытия нажать Ctrl-F9) Данная возможность позволяет не только добавлять сводки и расчеты с параметрами (например позже ввести ставку планируемого налога в готовый отчет), но и формировать группу связанных ссылками отчетов, что часто практикуется при значительном использовании электронных таблиц на предприятии.  продвинутый пользователь