当前位置: 首页 > 知识库问答 >
问题:

Jasper报告-列表中的第一行不显示

微生信鸿
2023-03-14

我用的是Jasper reports 6.17,我在Jasper Studio里做了一个列表。

列表中只有两个名为“test1”和“test2”的项目,但只显示了一个,我不知道为什么。生成的PDF仅显示“test2”,为什么缺少“test1”?如果我添加10项,第一行将丢失。

jrxml文件是:

<?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="LIST" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="e7ee8129-93f1-4ca4-ba39-4b3d41bc1dd1">
    <subDataset name="Item" uuid="e9567b90-2de8-4e93-bad6-f67f0139e348">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
        <queryString>
            <![CDATA[]]>
        </queryString>
        <field name="name" class="java.lang.String"/>
    </subDataset>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <detail>
        <band height="125" splitType="Stretch">
            <componentElement>
                <reportElement x="178" y="31" width="100" height="30" uuid="3c38bb5e-a468-491b-8a3c-e04104fd93fe"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                    <datasetRun subDataset="Item" uuid="16e7dfb2-6696-4eb8-98a9-c590e4c9fc28">
                        <dataSourceExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="30" width="100">
                        <textField>
                            <reportElement x="0" y="0" width="100" height="30" uuid="2ff6723b-b461-420c-b233-ac3963d3b41b"/>
                            <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </detail>
</jasperReport>

java文件是:

public class JasperTestList2 {
    public static void main(String[] args) {
        try {
            List<Item> its = new ArrayList<>();
            
            Item i1 = new Item();
            i1.setName("test1");
            its.add(i1);
            
            Item i2 = new Item();
            i2.setName("test2");
            its.add(i2);
            
            JRBeanCollectionDataSource itemsJRBean = new JRBeanCollectionDataSource(its);

            JasperPrint jasperPrint = JasperFillManager.fillReport("JasperReports/LIST.jasper", null, itemsJRBean);

            OutputStream outputStream = new FileOutputStream(new File("JasperList.pdf"));
            JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
        } catch (JRException | FileNotFoundException ex) {
            Logger.getLogger(JasperTestList2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

public class Item {
    private String name;
    public void setName(String name){this.name = name;}
    public String getName()         {return name;}
}

共有2个答案

段干茂实
2023-03-14

我找到了一个解决方案,但我仍然不知道为什么原始代码不能正常工作。

解决方案是将数据集从

  • “使用另一个连接”=$P{REPORT_DATA_SOURCE}到
  • “使用JRDatasource表达式”=$P{Item}。我还创建了一个名为Item的新参数,类型为net.sf.jasperreports.engine.data.JRBeanCollectionDataSource

在代码中,我已经设置了新的参数:parameters.put("Item ",itemsJRBean);

因此,我没有在fillReport的最后一个参数中给出JRDataSource,而是在第二个参数中传输了JRDataSource。在第一个解决方案中,似乎有什么东西将dataSource中的光标移动到第二条记录,我不知道是什么以及为什么,这个问题仍然存在,我只是绕过了它。

public static JasperPrint fillReport(String sourceFileName, Map<String, Object> params, JRDataSource dataSource)

jrxml现在是:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.16.0.final using JasperReports Library version 6.16.0-48579d909b7943b64690c65c71e07e0b80981928  -->
<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="LIST" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="e7ee8129-93f1-4ca4-ba39-4b3d41bc1dd1">
    <subDataset name="Item" uuid="e9567b90-2de8-4e93-bad6-f67f0139e348">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
        <queryString>
            <![CDATA[]]>
        </queryString>
        <field name="name" class="java.lang.String"/>
    </subDataset>
    <parameter name="Item" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <detail>
        <band height="125" splitType="Stretch">
            <componentElement>
                <reportElement x="178" y="31" width="100" height="30" uuid="3c38bb5e-a468-491b-8a3c-e04104fd93fe"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                    <datasetRun subDataset="Item" uuid="86c960dc-0b5e-41d6-a57e-07e1a638a2d6">
                        <dataSourceExpression><![CDATA[$P{Item}]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="30" width="100">
                        <textField>
                            <reportElement x="0" y="0" width="100" height="30" uuid="2ff6723b-b461-420c-b233-ac3963d3b41b"/>
                            <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </detail>
</jasperReport>

java文件现在是:

public class JasperTestList2 {
    public static void main(String[] args) {
        try {
            List<Item> its = new ArrayList<>();
            
            Item i1 = new Item();
            i1.setName("test1");
            its.add(i1);
            
            Item i2 = new Item();
            i2.setName("test2");
            its.add(i2);

            Item i3 = new Item();
            i3.setName("test3");
            its.add(i3);
            
            JRBeanCollectionDataSource itemsJRBean = new JRBeanCollectionDataSource(its);
            
            Map<String, Object> parameters = new HashMap<>();
            parameters.put("Item", itemsJRBean);
            JasperPrint jasperPrint = JasperFillManager.fillReport("JasperReports/LIST.jasper", parameters, new JREmptyDataSource());

            OutputStream outputStream = new FileOutputStream(new File("JasperList.pdf"));
            JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
        } catch (JRException | FileNotFoundException ex) {
            Logger.getLogger(JasperTestList2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
叶允晨
2023-03-14

这不是一个很好的答案,我明白,但我不能在评论中格式化它。

  1. 你在做什么。
datasource = [
   Item1,  <-- detail band next()
   Item2   <-- list datasource next()
]
parameter(item) = [
   Item1,  <-- list datasource next()
   Item2   <-- list datasource next()
],
datasource = 
datasource = [
   items = [  <-- main datasource next()
       item1, <-- list datasource next()
       item2  <-- list datasource next()
]

显然,您需要为您的JRBeanGrou的数据源制定对象,但您希望它们看起来像这样。

public class ReportItem {
   private List<String> items;
}

然后构建列表

 类似资料:
  • Jasper reports正在努力从vip.user中找到字段。当我将prompt作为false使用defaultValueExpression填充数组列表时,它可以工作。

  • 我是贾斯珀报告的新手。我成功地显示了一个带有碧玉报告的表格。但是如何通过Spring控制器在碧玉报告中显示多个表格? 我没有使用数据库作为数据源,只是在ArrayList中使用普通的POJO。 这是我的Spring配置 这是我的控制器。 人员类 如何定义不同的数据源,以便我可以在报表中使用两个(或更多)列表?或者,也许我可以使用一个包含多个列表的数据源?

  • 我正在从. jasper文件加载jasper报告文件以提高性能,如下所示。 但是我现在有一个要求,动态形成的查询必须设置为. jasper(编译)文件。有没有办法做同样的事情?

  • 我的应用程序中有几个类似的报告,因此我创建了一个基本结构,在标题中有一个子报告,在页脚中有另一个子报告。 我不知道为什么我找不到解决这个问题的方法,如果有人能帮我...谢谢!

  • 如何在jasper子报告中显示当前页码?我只做了第一页,变量如下:$V{page_NUMBER}和“(”$V{page_COUNT}“)”,但我们如何在所有子报告中显示?

  • 我正在使用jasperreport-4.5.0生成报告。它正在正确地生成报告。但是如果我的数据库中有大量数据,那么报告vl会显示在不同的页面中。所以我的要求是,如果我的报告有12页,那么我想显示12页中的第1页,12页中的第2页,12页中的第3页……就像我的页眉带一样。我怎么能做到这一点,任何人都可以对此提出一个想法。