【问题标题】:Location data for filling the report in JasperServer在 JasperServer 中填写报告的位置数据
【发布时间】:2016-09-21 09:20:09
【问题描述】:

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

【问题讨论】:

  • 你指的是哪个数据? JRXML 源还是生成的报告?
  • 填写报表模板的数据。我的意思是 JRXML 数据源。
  • 只是出于好奇:为什么不想将报表数据存储在报表服务器上?你有其他类型的存储库吗?
  • 这是由于不同的用户希望收到报告,但数据不同,因此我必须将请求中的数据传输到服务器。这可能吗?
  • 这是报表参数的主要用例。详情见我的回答。

标签: web-services rest jasper-reports datasource jasperserver


【解决方案1】:

API 分为三个域:

  • 管理服务
  • 存储库服务
  • 报告服务

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

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

编辑

由于您还需要传递参数,请参考this example,它的工作方式如下:

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

【讨论】:

    【解决方案2】:

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

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

    在您的情况下,数据可以是实际数据(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>
    

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

    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.用请求创建一个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.发出请求(你需要保存会话cookie来检索输出):

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

    3.从上一个请求的结果中获取带有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
    

    以数据为源网址

    它是同一个报告模板,但两个参数替换为:

    <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模板需要这样调整:

    对于data as parameter,只需将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>
    

    对于作为源 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

    【讨论】:

    • 我找到了解决问题的方法。我使用远程 XML,描述为 here。有一个参数XML_URL可以让你动态设置数据源的URL。这个参数可以在reportExecutionRequest请求的描述过程中设置,但最后一件事,我不明白我应该如何从服务器下载文件。当我发送请求时,正如您在第 3 段中所写,我从服务器描述请求状态中得到响应。如何直接在笔记本电脑上下载文件?
    • 已弃用的RemoteXmlDataAdapterService中使用了XML_URL参数,请谨慎使用。使用reportExecutions 服务,获取报告的输出至少涉及两个步骤:发出请求和获取输出。我刚刚关注了最新的指南here。要一步获取文件,只需使用更简单的reports 服务。
    • 你应该在我的回答中拥有你需要的一切。只需按照示例一步一步进行操作,并查阅官方 REST API 指南即可。我强烈建议在升级到 Python API 之前手动执行操作(在命令行中查看它们是否正常工作)。如果你真的没有成功,请在 GitHub gist 中发布你的命令和输出并添加链接。
    • 报告摘录 - 一个单独的问题。让我们离开吧。当我尝试从您描述的方式(With data as source URL)运行报告并将正确的 url 传递给填充报告时,我得到字段的空值。我不理解为什么。我的 jrxml 文件here
    • 如果您在预览时在 Studio 中看到 null 值,只需将数据适配器从 One Empty Record 更改为另一个,例如 Sample DB .通常,您应该在没有数据或数据适配器的情况下预览它,但不幸的是,目前还没有这样的选项。
    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多