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

Community

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:

kontoauszug.jrxml
<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/kontoauszug
Imported kontoauszug.jrxml: wrote kontoauszug.html, kontoauszug.css, kontoauszug.schema.json, sample.json

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

kontoauszug.html
<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:

kontoauszug.schema.json
{
  "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:

sample.json
{
  "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.json

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

kontoauszug.jrxml
<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 band

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