Jasper 报告 - 不显示列表的第一行
Jasper report - the first line from a list is not displayed
我使用 Jasper 报告 6.17,我在 Jasper Studio 中制作了一个列表。
该列表只有名为“test1”和“test2”的 2 个项目,但只显示一个,我不知道为什么。生成的 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;}
}
我找到了解决方案,但我仍然不知道为什么原始代码无法正常工作。
解决方案是将数据集从
- “使用另一个连接”= $P{REPORT_DATA_SOURCE} to
- “使用 JRDatasource 表达式”= $P{Item}。我还创建了一个名为 Item of type net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
的新参数
在代码中,我设置了新参数:parameters.put("Item", itemsJRBean);
因此,我没有在 fillReport 的最后一个参数中提供 JRDataSource,而是在第二个参数中传输了 JRDataSource。在第一个解决方案中,似乎有什么东西将数据源中的光标移动到第二条记录,我不知道是什么以及为什么,这个问题仍然存在,我只是绕过了它。
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);
}
}
}
这不是一个很好的答案,我明白了,但我无法在评论中对其进行格式化。
- 你在做什么。
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()
]
显然您需要为您的 JRBeanCollectionDatasource
计算对象,但您希望它们看起来像那样。
public class ReportItem {
private List<String> items;
}
然后构建一个传递到数据源的 List<ReportItem>
就可以了。
我使用 Jasper 报告 6.17,我在 Jasper Studio 中制作了一个列表。
该列表只有名为“test1”和“test2”的 2 个项目,但只显示一个,我不知道为什么。生成的 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;}
}
我找到了解决方案,但我仍然不知道为什么原始代码无法正常工作。
解决方案是将数据集从
- “使用另一个连接”= $P{REPORT_DATA_SOURCE} to
- “使用 JRDatasource 表达式”= $P{Item}。我还创建了一个名为 Item of type net.sf.jasperreports.engine.data.JRBeanCollectionDataSource 的新参数
在代码中,我设置了新参数:parameters.put("Item", itemsJRBean);
因此,我没有在 fillReport 的最后一个参数中提供 JRDataSource,而是在第二个参数中传输了 JRDataSource。在第一个解决方案中,似乎有什么东西将数据源中的光标移动到第二条记录,我不知道是什么以及为什么,这个问题仍然存在,我只是绕过了它。
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);
}
}
}
这不是一个很好的答案,我明白了,但我无法在评论中对其进行格式化。
- 你在做什么。
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()
]
显然您需要为您的 JRBeanCollectionDatasource
计算对象,但您希望它们看起来像那样。
public class ReportItem {
private List<String> items;
}
然后构建一个传递到数据源的 List<ReportItem>
就可以了。