从JSON对象或JSON字符串创建Jasper报告PDF表单

使用JRBeanCollectionDataSource创建Jasper报告(PDF,Excel,Csv)时很好。 这意味着.jrxml文件接受pojo集合作为处理报告的输入。

现在,我一直在尝试使用相同的.jrxml创建jasper报告,但是来自JSON Object。 我尝试了以下内容,但所有值在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"); 

谁能帮我?

我一直在努力使用JSON作为Jasper报告的DataSource,并且在网上缺乏体面的例子,我想我会在这里发布这个以供将来参考。

此示例是如何使用iReport Designer和JSON DataSource。

首先,输入JSON:

 { "userName": "Evil Raat", "details": { "email": "not_really@test.com" } } 

然后在iReport Designer中创建一个JSON DataSource并将其指向您的文件(将所有其他详细信息保留为默认值)

接下来,您可以使用以下jrxml模板将上述JSON呈现为报表:

                <band height="200" splitType="Stretch"> <textfield> <reportelement uuid="3b74775b-4555-43c3-bdf2-1677145c8660" x="0" y="31" width="555" height="20"></reportelement> <textelement textAlignment="Right"> <font fontName="Helvetica" size="12" isBold="true"></font> </textelement> <textfieldexpression><![CDATA[$F{userName}]]></textfieldexpression> </textfield> <textfield> <reportelement uuid="aa6cc7c8-2ca1-4f0f-92e2-c466083daba0" x="0" y="54" width="555" height="20"></reportelement> <textelement textAlignment="Right"> <font fontName="Helvetica" size="12" isBold="true"></font> </textelement> <textfieldexpression><![CDATA[$F{userEmail}]]></textfieldexpression> </textfield> </band>   

注意:必须首先定义字段元素,然后才能使用它们。 它们应该是使用标准点表示法从JSON输入文件的根目录开始的JSON路径。 有关示例,请参阅上面的fieldDescription元素。

定义字段后,您可以在文本字段中使用其计算值或其他:

希望能帮助一些人。

这就是我在jasper中处理json数组的方法

让我们说我想报告以下数组。

 [ {"name":"Jerry", "value":"Jesus"}, {"name":"Gideon", "value": "Loves"}, {"name":"Eva", "value": "You"} ] 

在设计报告时,请确保将字段命名为与json字段名称完全相同的名称。 所以在设计器中我会添加两个名为namevalue的字段。 您甚至可以根据需要向报表设计器添加任意数量的参数。 在本例中,我将在Jasper Studio中添加一个名为title的参数。

现在这里是java代码,它将根据此测试数组创建jasper报告。 我将在代码中硬编码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 for jasper using gradle build tool。