Создать форму отчета Jasper PDF из объекта JSON или JSON String
Это прекрасно, когда вы создаете отчет Jasper (PDF, Excel, Csv) с помощью JRBeanCollectionDataSource. Это означает, что файл .jrxml принимает коллекцию pojo в качестве входа для обработки отчета.
Теперь я пытаюсь создать отчет jasper с тем же .jrxml, но из объекта JSON.
Я попробовал следующее, но все значения равны нулю в отчете в формате pdf
Resource resource = new ClassPathXmlApplicationContext().getResource("classpath:reports/project.jrxml");
JsonDataSource ds = new JsonDataSource(new File("c:\myjson.json"));
jasperDesign = JRXmlLoader.load(resource.getInputStream());
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds);
JasperExportManager.exportReportToPdfFile(jasperPrint, destination+fileName+".pdf");
Может ли кто-нибудь мне помочь?
Ответы
Ответ 1
Я только пытался бороться с использованием JSON в качестве источника данных в отчете Jasper и с отсутствием достойных примеров в сети. Я думал, что разместил это здесь для дальнейшего использования.
В этом примере показано, как использовать iReport Designer и JSON DataSource.
Во-первых, вход JSON:
{
"userName": "Evil Raat",
"details": {
"email": "[email protected]"
}
}
Затем создайте JSON DataSource в iReport Designer и укажите его в свой файл (оставив все остальные данные в качестве значений по умолчанию)
Затем вы можете использовать следующий шаблон jrxml, чтобы отобразить указанный выше JSON в отчете:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="sample" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a894078a-929b-4aae-a1d0-46485f0f8835">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString language="json">
<![CDATA[]]>
</queryString>
<field name="userName" class="java.lang.String">
<fieldDescription><![CDATA[userName]]></fieldDescription>
</field>
<field name="userEmail" class="java.lang.String">
<fieldDescription><![CDATA[details.email]]></fieldDescription>
</field>
<title>
<band height="200" splitType="Stretch">
<textField>
<reportElement uuid="3b74775b-4555-43c3-bdf2-1677145c8660" x="0" y="31" width="555" height="20"/>
<textElement textAlignment="Right">
<font fontName="Helvetica" size="12" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$F{userName}]]></textFieldExpression>
</textField>
<textField>
<reportElement uuid="aa6cc7c8-2ca1-4f0f-92e2-c466083daba0" x="0" y="54" width="555" height="20"/>
<textElement textAlignment="Right">
<font fontName="Helvetica" size="12" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$F{userEmail}]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
ПРИМЕЧАНИЕ. Сначала необходимо определить элементы поля, прежде чем они могут быть использованы. Они должны быть JSON-путём из корня входного файла JSON с использованием стандартной точечной нотации. См. Приведенные выше элементы описания полей.
Как только ваше поле определено, вы можете использовать его вычисленное значение в текстовом поле или что-то еще:
Надеюсь, что это помогает некоторым людям.
Ответ 2
Вот как я обрабатываю json-массивы в jasper
Предположим, я хочу сообщить о следующем массиве.
[
{"name":"Jerry", "value":"Jesus"},
{"name":"Gideon", "value": "Loves"},
{"name":"Eva", "value": "You"}
]
При разработке отчета убедитесь, что вы назовите поля с тем же именем, что и имя вашего json-поля. Поэтому в дизайнере я бы добавил два поля: имя и значение. Вы даже можете добавить столько параметров в конструктор отчетов, сколько необходимо. В этом примере я добавлю параметр title в Jasper Studio.
Теперь вот код Java, который создаст отчет яшмы, основанный на этом тестовом массиве. Я буду жестко кодировать json-данные в коде, но вы можете загрузить из файла или что-то, что вы считаете лучшим. Я прокомментировал код, чтобы объяснить, что происходит.
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.data.JsonDataSource;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperPrint;
import org.apache.commons.codec.binary.Base64;
import java.util.HashMap;
import java.util.Locale;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.io.*;
//Class Name. This must match the class name you put in your build.gradle file
public class JasperPDFExample {
public static void main(String[] args) {
try {
try {
//Our json object. This can be loaded from file
String rawJsonData = "[{\"name\":\"Jerry\", \"value\":\"Jesus\"},"
+ "{\"name\":\"Gideon\", \"value\": \"Loves\"},"
+ "{\"name\":\"Eva\", \"value\": \"You\"}"
+ "]";
//Load compiled jasper report that we created on first section.
JasperReport report = (JasperReport) JRLoader.loadObject(new File("/home/jerry/Sample.jasper"));
//Convert json string to byte array.
ByteArrayInputStream jsonDataStream = new ByteArrayInputStream(rawJsonData.getBytes());
//Create json datasource from json stream
JsonDataSource ds = new JsonDataSource(jsonDataStream);
//Create HashMap to add report parameters
Map parameters = new HashMap();
//Add title parameter. Make sure the key is same name as what you named the parameter in jasper report.
parameters.put("title", "Jasper PDF Example");
//Create Jasper Print object passing report, parameter json data source.
JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameters, ds);
//Export and save pdf to file
JasperExportManager.exportReportToPdfFile(jasperPrint,"/home/jerry/jasperpdfexample.pdf");
} catch (JRException ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
}
Благодаря https://mis.io/pub/how-to-create-a-jasper-pdf-report-from-a-json-datasource-in-java/ Мне удалось заставить это работать вместе с настройкой java для jasper с помощью инструмента сборки gradle.