Question

J'ai une source de données XML très simple structurée comme ceci:

<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>

Et je veux créer un rapport XLS très simple formaté comme ceci:

-------------------------------------------
| 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 |
-------------------------------------------

J'ai créé un rapport avec la requête XPath:

/datasource

Et deux champs:

$F{row}
$F{column}

avec des expressions:

row
row/column

respectivement.

J'ai ajouté un élément Crosstab à la bande de détail et j'ai fait quelques tentatives pour la configurer avec différentes variations des champs définis ci-dessus pour les options de regroupement de lignes et de colonnes. Mais le meilleur résultat que j'ai pu obtenir est la première valeur de colonne (c'est-à-dire "une valeur de texte 1" dans l'exemple ci-dessus).

Mes questions:

  1. Comment puis-je configurer l'élément Crosstab pour itérer sur chaque élément de ligne de ma source de données et pousser les valeurs de colonne dans les cellules droites selon l'exemple ci-dessus?
  2. L'élément Crosstab est-il l'élément le plus approprié pour ce type de tâche?
Était-ce utile?

La solution

Ok, donc je l'ai compris et je ne peux vraiment pas pointer une source comme un bon point de référence pour ce genre de choses. La documentation et la contribution communautaire de Jasper sont pour la plupart clairsemés et datés. Je digresse. Voici ce que j'ai fait pour que cela fonctionne pour Ireport 4.5.0 et Jasper 4.5.0:

  1. Créez un rapport A4 vierge dans ireport.
  2. Modifiez la requête du document pour sélectionner tous les éléments «ligne» à l'aide de la syntaxe XPath (IE / DataSource / Row)
  3. Créez maintenant un ensemble de données en cliquant avec le bouton droit sur la propriété Document à partir de votre vue d'inspecteur de rapport (c'est-à-dire celui avec le même nom que votre fichier .jrmxl) et sélectionnez Ajouter un ensemble de données.
  4. Dans l'assistant, sélectionnez "Créer un nouvel ensemble de données à partir d'une connexion ou d'une source de données"
  5. Sélectionnez la même source de données XML que votre rapport principal et si vous avez des champs ou des groupes, vous souhaitez passer par-les, sélectionnez-les dans les fenêtres assistantes correspondantes qui suivent. Mais l'essentiel est de sélectionner votre source de données.
  6. Vous devrez maintenant modifier la requête pour sélectionner sur vos éléments de colonne. Avant de le faire, pour faciliter la vie, j'ai édité ma source de données XML pour inclure un attribut "Count" dans chaque élément de ligne. Vous pouvez créer votre propre décompte d'incrémentation si vous le souhaitez, mais pour moi, la modification du document de source de données était la plus simple.
    1. Donc, la prochaine chose que j'ai faite a été de créer un champ dans mon rapport maître appelé "RowCount" et de lui donner l'expression de description "@count" afin qu'il stockait la valeur d'attribut de nombre de chaque élément de ligne.
    2. Après cela, j'ai configuré un paramètre dans mon ensemble de données avec le même nom.
    3. Ensuite, j'ai configuré ma requête de jeu de données pour lire "/ dataSource / row [@count =" $ p {rowCount} "] / colonne" afin que tous les éléments de colonne aient été sélectionnés pour chaque ligne.
    4. Ensuite, j'ai créé un champ dans l'ensemble de données appelé ColumnValue avec l'expression description: "text ()" pour stocker le texte à partir de chaque élément de colonne.
  7. Après avoir configuré l'ensemble de données, j'ai traîné un objet Crosstab dans ma bande de détail qui a incité l'assistant Crosstab à afficher.
    1. Dans l'assistant, j'ai sélectionné l'ensemble de données sous le nom de DataSource et sélectionné la même connexion que le rapport master.
    2. Pour les valeurs de groupe de lignes et de colonnes, je viens de choisir $ p {rowCount} et $ v {colonnel_count} respectivement.
    3. Plus important encore, j'ai configuré la section "Data" pour pointer vers mon champ ColumnValue et sélectionner la mesure comme "rien" plutôt que de compter ou de tout autre calcul. Enfin, cliquez sur Terminer pour créer l'objet.
  8. La prochaine étape consistait à cliquer avec le bouton droit sur l'objet Crosstab dans l'inspecteur de rapport et à sélectionner "Data Crosstab" qui affichent une fenêtre de configuration de données. Ici I I:
    1. Sélectionné "Les données sont pré-triées"
    2. Dans la section d'exécution de l'ensemble de données en bas, dans l'onglet "Connection / DataSource exp" J'ai sélectionné "Utiliser l'expression de connexion" avec la valeur $ p {report_connection}
    3. Dans l'onglet "Paramètres" que j'ai ajouté:
      • Xml_data_docment
      • Report_context
      • Xml_date_pattern
      • Xml_number_pattern
      • Xml_locale
      • Xml_time_zone
      • compte de ligne
    4. J'ai laissé le "paramètres map exp" vierge.
  9. Les deux dernières choses à faire à partir de ce point consistent à pirater le XML pour supprimer le balisage du groupe de lignes et de colonnes qui implique de supprimer les éléments suivants de l'intérieur de l'élément JRXML "Crostab" (y compris tous les sous-éléments de ce qui précède):
    • crosstabrowheader
    • crosstabtotalrowheader
    • CrosstabColumnHeader
    • CrosstabtotalColumnHeader
  10. Enfin, de tous enveloppez l'expression de votre godet de groupe $ p {rowCount} avec java.lang.integer.parseint afin qu'il puisse traiter le rowCount comme un entier.

Alors c'est tout. Pour moi, c'est ce dont j'ai besoin pour résoudre la conundrum de l'ensemble de données Crosstab / XML!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top