我正在使用Jasper Reports构建一个简单的报告pdf。我有一个看起来像这样的JSON文件:
{"employees": [ {"firstName" : "John", "lastName" : "Doe"}, {"firstName" : "Anna", "lastName" : "Smith"}, {"firstName" : "Peter", "lastName" : "Jones"} ]}
我正在尝试像这样阅读它:
File file = new File("E:/Workspaces/jasperPDFreport/src/main/resources/emp.json"); JsonDataSource datasource = new JsonDataSource(file); JasperDesign jasperDesign = JRXmlLoader.load("E:/Workspaces/jasperPDFreport/src/main/resources/jsonTemplate.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); Map parameters = new HashMap(); JasperPrint jasperPrint; jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, datasource); JasperExportManager.exportReportToPdfFile(jasperPrint, "BasicReport.pdf"); JasperViewer.viewReport(jasperPrint);
但是我的JSON文件中的值未传递给我的pdf。
这是我的模板:
<?xml version="1.0" encoding="UTF-8"?> <!-- Created with Jaspersoft Studio version 6.1.1.final using JasperReports Library version 6.1.1 --> <!-- 2015-10-22T13:45:32 --> <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="Blank_A4_2" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="9e494ebe-c1fb-4448-bcee-38994e9720f7"> <!--property name="net.sf.jasperreports.json.source" value="emp.json"/--> <queryString language="json"> <![CDATA[employees]]> </queryString> <field name="firstName" class="java.lang.String"> <fieldDescription><![CDATA[firstName]]></fieldDescription> </field> <field name="lastName" class="java.lang.String"> <fieldDescription><![CDATA[lastName]]></fieldDescription> </field> <background> <band splitType="Stretch"/> </background> <detail> <band height="125" splitType="Stretch"> <textField> <reportElement x="100" y="0" width="100" height="30" uuid="02b279da-3795-4655-8571-5a36a3ef378c"/> <textFieldExpression><![CDATA[$F{firstName}]]></textFieldExpression> </textField> <staticText> <reportElement x="0" y="0" width="100" height="30" uuid="671e61ad-8d8f-48cb-969f-78c05a516398"/> <text><![CDATA[firstName]]></text> </staticText> <textField> <reportElement x="100" y="30" width="100" height="30" uuid="9d53f46f-a252-48b3-9213-8c3092c29f49"/> <textFieldExpression><![CDATA[$F{lastName}]]></textFieldExpression> </textField> <staticText> <reportElement x="0" y="30" width="100" height="30" uuid="3b49affb-685a-4df2-a872-c0e6fdcab94b"/> <text><![CDATA[lastName]]></text> </staticText> </band> </detail> </jasperReport>
现在您看到注释掉的行
属性名称=“ net.sf.jasperreports.json.source” value =“ emp.json”
如果我对此发表评论,那么一切都会按预期进行,我不想将我的JSON值硬编码到模板中,因为稍后我想从rest服务中获取它们,这还没有准备好。我不明白,为什么值没有被解析到报表中,相反,我只得到两个空值。
来自JasperReports- JSON数据源示例(版本6.4.3)
内置JSON查询执行程序(请参阅JsonQueryExecuter类)是一种工具,该工具根据特定的内置参数(或等效的报表属性)使用查询字符串生成JsonDataSource实例。该查询执行器通过JsonQueryExecuterFactory工厂类注册。为了准备数据源,JSON查询执行程序查找JSON_INPUT_STREAM参数,该参数包含java.io.InputStream形式的JSON源对象。如果未提供JSON_INPUT_STREAM参数,则查询执行程序将查找备用net.sf.jasperreports.json.source字符串参数或report属性,该参数或报告属性存储JSON源文件位置的路径。JsonQueryExecuter在输入源上运行查询,并将结果存储在内存中的JsonDataSource对象中。
因此,如果您不想使用:
<property name="net.sf.jasperreports.json.source" value="emp.json"/>
您需要java.io.InputStream按照参数传递文件JSON_INPUT_STREAM
java.io.InputStream
JSON_INPUT_STREAM
因此,您当前正在将其作为数据源传递,应该尝试这样的操作
params.put(JsonQueryExecuterFactory.JSON_INPUT_STREAM, new FileInputStream(file)); JasperFillManager.fillReportToFile(jasperReport, params);
相反,如果您想使用新的JsonQLQueryExecuterFactory JSONQL数据源
JsonQLQueryExecuterFactory
params.put(JsonQLQueryExecuterFactory.JSON_INPUT_STREAM, new FileInputStream(file)); JasperFillManager.fillReportToFile(jasperReport, params);