在 JasperServer 中填写报告的位置数据

Location data for filling the report in JasperServer

我在 JasperSoft Studio 中开发了模板设计并将 jrxml 文件上传到 JasperServer。我想从我的 python 应用程序发送数据(JSON 或 XML)以填充报告模板,并使用 REST API 以一些流行的格式(如 PDF、XLS)取回报告。 我不想将数据存储在服务器上。我怎样才能做到这一点?或者数据 必须存储在服务器上 并且没有其他方式通过 WEB 服务传输它们?

API 分为三个域:

  • 行政服务
  • 存储库服务
  • 报告服务

要生成报告,首先必须通过存储库服务将它们部署到服务器。如果稍后需要生成报告,则通过报告服务调用它。在这里,也可以启动同步或异步报告生成。

因此报告需要在存储库中。

编辑

由于还需要传递参数,参考this example就这样:

  • 添加报告参数
  • 为报表参数添加输入控件
  • 使用您的输入参数调用 API:http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/reports/samples/EmployeeAccounts.html?EmployeeID=sarah_id
  • 其他参数根据需要做

数据不一定要驻留在服务器上。

您可以按照@tobi6 建议的方式设计您的模板,以便您可以通过输入控制参数传递数据。 然后您可以使用报告服务或报告执行服务来获得所需的输出。

在您的情况下,数据可以是实际数据(XML 或 JSON)或数据源(URL 到数据文件)。

这里有一些使用 XML 数据的基本示例(对于 JSON 非常相似):

以实际数据为参数

JasperReports 模板:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.1.1.final using JasperReports Library version 6.1.1  -->
<!-- 2016-05-25T14:18:00 -->
<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="XmlDSReport_with_data" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="85d7b9ad-6feb-43dc-84cc-5175bf629546">
  <parameter name="xmlString" class="java.lang.String">
    <defaultValueExpression><![CDATA["<?xml version=\"1.0\" encoding=\"UTF-8\"?><a><b><val>val1</val></b><b><val>val2</val></b></a>"]]></defaultValueExpression>
  </parameter>
  <parameter name="XML_INPUT_STREAM" class="java.io.InputStream">
    <defaultValueExpression><![CDATA[new java.io.ByteArrayInputStream($P{xmlString}.getBytes("UTF-8"))]]></defaultValueExpression>
  </parameter>
  <queryString language="xPath">
    <![CDATA[/a/b]]>
  </queryString>
  <field name="value" class="java.lang.String">
    <fieldDescription><![CDATA[val]]></fieldDescription>
  </field>
  <columnHeader>
    <band height="31" splitType="Stretch">
      <staticText>
        <reportElement x="150" y="0" width="100" height="30" uuid="b33a123d-8987-4da4-b21b-1f9ccc50e92d"/>
        <text><![CDATA[value]]></text>
      </staticText>
    </band>
  </columnHeader>
  <detail>
    <band height="30" splitType="Stretch">
      <textField>
        <reportElement x="150" y="0" width="100" height="30" uuid="14c51219-5ce2-47ce-abb9-71bc11a6f28c"/>
        <textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
      </textField>
    </band>
  </detail>
</jasperReport>

部署报表并为 xmlString 参数创建输入控件后,您可以对其进行测试。假设您想传递此 XML 而不是保留默认值:

<?xml version="1.0" encoding="UTF-8"?>
<a>
  <b><val>new_val1</val></b>
  <b><val>new_val2</val></b>
</a>

要测试报告服务,您 运行 在终端中使用类似的东西(我 URL 对 XML 字符串进行了编码)并检查结果:

curl  -u user:password \ 
      http://localhost:8080/jasperserver/rest_v2/reports/reports/XmlDSReport_with_data.pdf?xmlString=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%20%20%20%20%3Ca%3E%0A%20%20%20%20%20%20%3Cb%3E%3Cval%3Enew_val1%3C%2Fval%3E%3C%2Fb%3E%0A%20%20%20%20%20%20%3Cb%3E%3Cval%3Enew_val2%3C%2Fval%3E%3C%2Fb%3E%0A%20%20%20%20%3C%2Fa%3E > report.pdf

测试reportExecutions服务,主要步骤为:

1.Create 包含请求的 XML 文件(将其命名为 reportExecutionRequest.xml

<reportExecutionRequest>
    <reportUnitUri>/reports/XmlDSReport_with_data</reportUnitUri>
    <outputFormat>pdf</outputFormat>
    <freshData>true</freshData>
    <saveDataSnapshot>false</saveDataSnapshot>
    <interactive>true</interactive>    
    <allowInlineScripts>true</allowInlineScripts>
    <async>false</async>
    <parameters>
        <reportParameter name="xmlString">
            <value><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
                <a><b><val>new_val1</val></b><b><val>new_val2</val></b></a>]]></value>
        </reportParameter>
    </parameters>
</reportExecutionRequest>

2.Make 请求(您需要保存会话 cookie 以检索输出):

curl  -u user:password \
      -H "Content-Type: application/xml" \
      -d @reportExecutionRequest.xml \
      -c cookies.txt \
      http://localhost:8080/jasperserver/rest_v2/reportExecutions

3.Get 上一个请求结果中带有 requestIDexportID 的输出:

curl  -b cookies.txt \
      http://localhost:8080/jasperserver/rest_v2/reportExecutions/cc57b351-cfb6-429e-8c92-d0aebebbed66/exports/b71d6353-1eec-4304-8713-5d0f3105680e/outputResource > report.pdf

以数据为源URL

这是相同的报告模板,但将两个参数替换为:

<parameter name="xmlSource" class="java.lang.String">
  <defaultValueExpression><![CDATA["http://serverwithdata/xmlData.xml"]]></defaultValueExpression>
</parameter>
<parameter name="net.sf.jasperreports.xml.source" class="java.lang.String">
  <defaultValueExpression><![CDATA[$P{xmlSource}]]></defaultValueExpression>
</parameter>

注意:我在这里创建了两个参数只是因为我想在通过报告服务传递参数时为参数保留一个较短的名称。我还为 xmlSource 参数创建了一个输入控件。

这种情况下的测试是相似的。

编辑:要使用JSON代替XML,原来的JasperReports模板需要这样调整:

对于数据作为参数,只需将xmlString参数、XML_INPUT_STREAM参数和queryString更改为:

<parameter name="jsonString" class="java.lang.String">
  <defaultValueExpression><![CDATA["{\"a\": [ {\"b\": { \"val\": \"val1\"}}, {\"b\": { \"val\": \"val2\" }}]}"]]></defaultValueExpression>
</parameter>
<parameter name="JSON_INPUT_STREAM" class="java.io.InputStream">
  <defaultValueExpression><![CDATA[new java.io.ByteArrayInputStream($P{jsonString}.getBytes("UTF-8"))]]></defaultValueExpression>
</parameter>
<queryString language="json">
  <![CDATA[a.b]]>
</queryString>

For data as source URL,将xmlString参数、XML_INPUT_STREAM参数和queryString更改为此:

<parameter name="jsonSource" class="java.lang.String">
  <defaultValueExpression><![CDATA["http://serverwithdata/jsonData.json"]]></defaultValueExpression>
</parameter>
<parameter name="net.sf.jasperreports.json.source" class="java.lang.String">
  <defaultValueExpression><![CDATA[$P{jsonSource}]]></defaultValueExpression>
</parameter>
<queryString language="json">
  <![CDATA[a.b]]>
</queryString>

REST 服务的 cURL 测试基本相同,主要区别在于您将通过 JSON 而不是 XML 并使用 JSON具体参数 jsonStringjsonSource.