Действительно простой XLS из источника данных XML - Jasper - PullRequest
1 голос
/ 29 февраля 2012

У меня есть очень простой источник данных XML, структурированный так:

<datasource>
    <row>
        <column>Some text 1</column>
        <column>Some text 2</column>
        <column>Some text 3</column>
    </row>
    <row>
        <column>Some text 4</column>
        <column>Some text 5</column>
        <column>Some text 6</column>
    </row>
    <row>
        <column>Some text 7</column>
        <column>Some text 8</column>
        <column>Some text 9</column>
    </row>
</datasource>

И я хочу создать очень простой отчет XLS, отформатированный так:

-------------------------------------------
| Some text 1 | Some text 2 | Some text 3 |
-------------------------------------------
| Some text 4 | Some text 5 | Some text 6 |
-------------------------------------------
| Some text 7 | Some text 8 | Some text 9 |
-------------------------------------------

Я создалотчет с запросом XPath:

/datasource

и двумя полями:

$F{row}
$F{column}

с выражениями:

row
row/column

соответственно.

У меня естьдобавили элемент кросс-таблицы в полосу сведений и несколько раз пытались настроить его с различными вариантами полей, определенных выше для параметров группировки строк и столбцов.Но лучший результат, который мне удалось получить, - это значение 1-го столбца (т. Е. Значение "Some text 1" в приведенном выше примере).

Мои вопросы:

  1. Как я могунастроить элемент кросс-таблицы для перебора каждого элемента строки в моем источнике данных и вставить значения столбца в нужные ячейки, как в примере выше?
  2. Является ли элемент кросс-таблицы наиболее подходящим элементом для этого типа задач?

1 Ответ

2 голосов
/ 05 марта 2012

Хорошо, так что я понял это, и я действительно не могу указать какой-либо один источник в качестве хорошего ориентира для этого материала.Документация Джаспера и вклад сообщества по большей части редки и устарели.Я отвлекся.Вот что я сделал, чтобы заставить его работать для iReport 4.5.0 и Jasper 4.5.0:

  1. Создать пустой отчет A4 в iReport.
  2. Отредактируйте запрос документа, чтобы выбрать всеЭлементы 'row' с использованием синтаксиса XPath (например, / datasource / row)
  3. Теперь создайте поднабор данных, щелкнув правой кнопкой мыши свойство документа в представлении «Инспектор отчетов» (т. е. имя с тем же именем, что и у вашего файла .jrmxl).и выберите Добавить набор данных.
  4. В мастере выберите «создать новый набор данных из соединения или источника данных»
  5. Выберите тот же источник данных XML, что и в вашем основном отчете, и если у вас есть поля или группы, которые вы хотитепройти через выберите их в соответствующих окнах мастера, которые следуют.Но главное - выбрать источник данных.
  6. Теперь вам нужно будет отредактировать запрос, чтобы выбрать элементы столбца.Прежде чем сделать это, чтобы упростить жизнь, я отредактировал свой источник данных XML, добавив атрибут «count» в каждый элемент строки.Вы можете создать свой собственный счетчик приращений, если хотите, но для меня редактирование документа источника данных было самым простым.
    1. Итак, следующее, что я сделал, - это создаю поле в своем главном отчете с именем "rowCount" и присвоил ему описание описания "@count", чтобы оно сохраняло значение атрибута count для каждого элемента строки.
    2. После этого я установил параметр в своем наборе данных с таким же именем.
    3. Затем я настроил запрос своего набора данных на чтение "/ datasource / row [@count =" $ P {rowCount} "] / column "так, чтобы все элементы столбца были выбраны для каждой строки.
    4. Далее я создал поле в наборе данных columnValue с выражением описания:" text () "для хранения текста из каждого элемента столбца.
  7. После настройки поднабора данных я перетащил объект кросс-таблицы в свой детализированный диапазон, что вызвало отображение мастера кросс-таблицы.
    1. В мастере я выбрал поднабор данных в качестве его источника данных и выбрал то же соединение, что и основной отчет.
    2. Для значений группы строк и столбцов я просто выбрал $ P {rowCount} и $V {COLUMN_COUNT} соответственно.
    3. Самое главное, я сконфигурировал раздел «Данные» так, чтобы он указывал на мое поле columnValue и выбирал меру как «ничего», а не как подсчет или любые другие вычисления.Наконец, нажмите кнопку «Готово», чтобы создать объект.
  8. Следующим шагом было щелкнуть правой кнопкой мыши объект перекрестной таблицы в Инспекторе отчетов и выбрать «данные перекрестной таблицы», которые откроют окно конфигурации данных.Здесь я:
    1. Выбранные «данные предварительно отсортированы»
    2. В разделе «Выполнение набора данных» внизу на вкладке «Соединение / источник данных» я выбрал «Использовать выражение соединения» сзначение $ P {REPORT_CONNECTION}
    3. На вкладке «Параметры» я добавил:
      • XML_DATA_DOCMENT
      • REPORT_CONTEXT
      • XML_DATE_PATTERN
      • XML_NUMBER_PTER
      • XML_LOCALE
      • XML_TIME_ZONE
      • rowCount
    4. Я оставил пустым поле "Параметры карты".
  9. Последняя пара вещей, которые нужно сделать с этого момента, - это взломать XML для удаления разметки группы строк и столбцов, что влечет за собой удаление следующих элементов из элемента JRXML "crostab" (включая все подэлементы приведенного ниже):
    • crosstabRowHeader
    • crosstabTotalRowHeader
    • crosstabColumnHeader
    • crosstabTotalColumnHeader
  10. И наконец, все обертывают ваш $ P {rowCount} группа строк exнажмите с java.lang.Integer.parseInt, чтобы он мог обработать rowCount как целое число.

Вот и все.Для меня это то, что мне нужно, чтобы решить загадку кросс-таблицы / источника данных XML / поднабора данных!

...