Import
Beispiel: einen JasperReports-Bericht importieren
Importieren Sie einen Kontoauszug aus einer .jrxml-Datei, lesen Sie jede geschriebene Datei, setzen Sie ihn und sehen Sie eine Meldung des Imports.
Auf dieser Seite
Diese Seite importiert einen Bericht von Anfang bis Ende: einen Kontoauszug.
Alle Namen und Zahlen sind erfunden. Derselbe Bericht liegt im Brevier-Repository
als templates/kontoauszug/java/before-jasper/kontoauszug.jrxml.
Der Bericht
Der Bericht hat 8 Parameter, 5 Felder und einen Seitenkopf, einen Spaltenkopf, ein Detail-Band und eine Seitenfußzeile. Das ist der Teil, auf den es ankommt:
<parameter name="bankName" class="java.lang.String"/>
<parameter name="auszugNummer" class="java.lang.Integer"/>
<parameter name="alterKontostand" class="java.math.BigDecimal"/>
<!-- 5 weitere Parameter -->
<field name="buchungstag" class="java.lang.String"/>
<field name="betrag" class="java.math.BigDecimal"/>
<!-- 3 weitere Felder -->
<pageHeader>
<band height="90">
<textField>
<reportElement x="0" y="0" width="260" height="20"/>
<textElement><font size="14" isBold="true"/></textElement>
<textFieldExpression><![CDATA[$P{bankName}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="300" y="0" width="215" height="20"/>
<textElement textAlignment="Right"/>
<textFieldExpression><![CDATA["Kontoauszug Nr. " + $P{auszugNummer}]]></textFieldExpression>
</textField>
<!-- 6 weitere Textfelder -->
</band>
</pageHeader>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="75" height="16"/>
<textFieldExpression><![CDATA[$F{buchungstag}]]></textFieldExpression>
</textField>
<!-- 4 weitere Textfelder -->
</band>
</detail>Den Import ausführen
brevier import kontoauszug.jrxml -o templates/kontoauszugImported kontoauszug.jrxml: wrote kontoauszug.html, kontoauszug.css, kontoauszug.schema.json, sample.jsonEs gibt keine Zeile Not converted, der Import hat also jedes Element gelesen.
Der Ordner templates/kontoauszug enthält jetzt vier Dateien.
Die Vorlage
kontoauszug.html hat Seitenkopf und Fußzeile als laufende Blöcke und das
Detail-Band als Tabelle mit einer Zeile für jede Buchung. Das ist der Seitenkopf
mit der Tabelle. Die Datei hat außerdem einen Fußblock,
<p>{{bankName}} · Kontoauszug</p>.
<div class="running-header">
<div class="header-left">
<h1>{{bankName}}</h1>
<p>{{kontoinhaber}}</p>
<p>IBAN: {{iban}}</p>
<p>BIC: {{bic}}</p>
</div>
<div class="header-right">
<p>Kontoauszug Nr. {{auszugNummer}}</p>
<p>Datum: {{auszugDatum}}</p>
<p>Alter Kontostand: {{alterKontostand}} EUR</p>
<p>Neuer Kontostand: {{neuerKontostand}} EUR</p>
</div>
</div>
<table class="report-table" data-brevier-uebertrag="true">
<colgroup><col><col><col><col><col data-brevier-carry="true"></colgroup>
<thead>
<tr><th>Buchungstag</th><th>Valuta</th><th>Vorgang</th><th>Buchungstext</th><th class="amount">Betrag</th></tr>
</thead>
<tbody>
{{#each rows}}
<tr><td>{{buchungstag}}</td><td>{{valuta}}</td><td>{{vorgang}}</td><td>{{buchungstext}}</td><td class="amount">{{betrag}}</td></tr>
{{/each}}
</tbody>
</table>| Im Bericht | In der Vorlage |
|---|---|
$P{bankName} |
{{bankName}} |
"Kontoauszug Nr. " + $P{auszugNummer} |
Kontoauszug Nr. {{auszugNummer}} |
| Das Band des Spaltenkopfs | <thead> |
| Das Detail-Band | {{#each rows}} ... {{/each}}, eine Zelle für jedes $F{...} |
Ein Feld mit Zahlentyp (java.math.BigDecimal) |
class="amount", rechtsbündig |
Der Import schaltet den Übertrag für die erste Spalte mit Dezimaltyp ein: Die
Spalte Betrag trägt ihre Summe auf die nächste Seite. Die Attribute heißen
data-brevier-uebertrag und data-brevier-carry: siehe
Tabellen.
kontoauszug.css enthält die Seitengröße (595pt mal 842pt), die Ränder, den
laufenden Kopf und die Fußzeile sowie die Tabellenregeln. Schriftgröße 14 und
Fett des Banknamens wurden zur Regel .header-left h1.
Das Schema
kontoauszug.schema.json hat eine Eigenschaft für jeden Parameter und rows mit
einer Eigenschaft für jedes Feld. Das ist ein Ausschnitt:
{
"title": "kontoauszug",
"type": "object",
"properties": {
"bankName": { "type": "string" },
"auszugNummer": { "type": "integer" },
"alterKontostand": { "type": "number" },
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"buchungstag": { "type": "string" },
"betrag": { "type": "number" }
},
"required": ["buchungstag", "betrag"]
}
}
},
"required": ["bankName", "auszugNummer", "alterKontostand", "rows"]
}java.lang.Integer wurde zu integer, java.math.BigDecimal zu number und
java.lang.String zu string. Die echte Datei führt alle 8 Parameter und alle
5 Felder auf.
Die Beispieldaten
sample.json wird aus dem Schema erzeugt. Es ist ein Startpunkt für das erste
Setzen, nicht Ihre Daten:
{
"bankName": "Erika Mustermann",
"auszugNummer": 1,
"alterKontostand": 12.5,
"rows": [
{ "buchungstag": "Beispieltext 1", "betrag": 12.5 },
{ "buchungstag": "Beispieltext 2", "betrag": 7.25 },
{ "buchungstag": "Beispieltext 3", "betrag": 3.75 }
]
}Der Generator wählt einen Wert nach dem Namen eines Feldes (iban, datum und
jeder Name, der name enthält) und sonst nach seinem Typ. Manche Werte passen
nicht zu ihrem Feld: bankName enthält den Namen einer Person, weil sein Name
name enthält. Ersetzen Sie die Werte durch Ihre eigenen, oder übergeben Sie
die Daten Ihres Dienstes.
Setzen und prüfen
brevier pdf templates/kontoauszug/kontoauszug.html \
--data templates/kontoauszug/sample.json -o kontoauszug.pdf
brevier lint templates/kontoauszug/kontoauszug.html \
--data templates/kontoauszug/sample.jsonDer erste Befehl schreibt das PDF und prüft die Daten gegen
kontoauszug.schema.json. Der zweite listet Text, der nicht in seine Spalte
passt, und andere Layoutprobleme: siehe
Dokument mit lint prüfen.
Wenn der Import ein Element nennt
Fügen Sie dem Detail-Band eine line hinzu, als Trennlinie unter jeder Zeile:
<detail>
<band height="20">
<!-- die 5 Textfelder -->
<line>
<reportElement x="0" y="18" width="515" height="1"/>
</line>
</band>
</detail>Der Import schreibt weiter die vier Dateien und gibt eine Zeile mehr aus:
Imported kontoauszug.jrxml: wrote kontoauszug.html, kontoauszug.css, kontoauszug.schema.json, sample.json
Not converted: line 137: line in the detail bandline 137 ist die Zeile des Elements <line> in Ihrer .jrxml. Die Tabelle unter
Auswege sagt, was zu tun ist: ein
CSS-Rahmen an den Zellen, tbody td { border-bottom: 0.5pt solid #000; }.
Weiter
Ersetzen Sie den Aufruf, der den Bericht füllt, durch den Brevier-Aufruf: Den Aufruf ersetzen.