У меня есть три объекта (iPhone, ipad и shoe), которые заполняют список (itemList), который используется в качестве данных для моего отчета. Объекты имеют тип Item и имеют имя, связанное с ними. Мне бы хотелось, чтобы имя первого объекта печаталось рядом с полем stati c «Phone Name», затем имя второго объекта рядом с полем stati c «Game Name», а затем имя третьего объекта рядом с полем stati c. «Название обуви». Я знаю, что это можно сделать, если у вас только одно текстовое поле и одно и то же имя поля stati c, но я хотел бы, чтобы у каждого объекта было свое имя поля stati c, и я хотел бы, чтобы имена только напечатать один раз (без повторных имен). В настоящее время это выглядит так: Текущий вывод отчета Jasper
Мне бы хотелось, чтобы это выглядело так:
Требуемый вывод отчета Jasper
Мой код указан ниже:
Персона. java
package packageOne;
public class Person {
private String name;
private int age;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
Артикул. java
package packageOne;
import java.util.ArrayList;
import java.util.List;
public class Item {
private String name;
private int price;
private List<Person> people = new ArrayList<Person>();
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getPrice(){
return price;
}
public void setPrice(int price){
this.price = price;
}
public List<Person> getPeople(){
return people;
}
public void setPeople(List<Person> people){
this.people=people;
}
}
Подарки. java
package packageOne;
import java.util.ArrayList;
import java.util.List;
public class Gifts {
private List<Item> items = new ArrayList<Item>();
public List<Item> getItems(){
return items;
}
public void setItems(List<Item> items){
this.items = items;
}
}
JasperTest. java
package packageOne;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.JasperPrint;
public class JasperTest {
public static void main(String[] args){
Gifts gift = new Gifts();
Item iphone = new Item();
Item ipad = new Item();
Item shoe = new Item();
Person person = new Person();
person.setName("Carl");
person.setAge(15);
List<Person> personList = new ArrayList<Person>();
personList.add(person);
iphone.setName("iPhone");
iphone.setPrice(1500);
ipad.setName("iPad");
ipad.setPrice(1500);
shoe.setName("Nike");
shoe.setPrice(100);
iphone.setPeople(personList);
List<Item> itemList = new ArrayList<Item>();
itemList.add(iphone);
itemList.add(ipad);
itemList.add(shoe);
gift.setItems(itemList);
String fileName = "FILEPATH";
String outputName = "FILEPATH";
try {
Map<String, Object> parameters = new HashMap<String, Object>();
JasperPrint jasperPrint = JasperFillManager.fillReport(fileName, parameters, new JRBeanCollectionDataSource(gift.getItems()));
OutputStream outputStream = new FileOutputStream(new File(outputName));
JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
System.out.println("File Generated");
}
catch(JRException ex){
ex.printStackTrace();
} catch(FileNotFoundException ex){
ex.printStackTrace();
}
}
}
JasperTest.jr xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1 -->
<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="PlantVO" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="55da4c97-0a7c-447f-b3a7-2713d483523d">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["FILEPATH"]]></defaultValueExpression>
</parameter>
<field name="name" class="java.lang.String"/>
<field name="price" class="java.lang.Integer"/>
<field name="people" class="java.util.List"/>
<detail>
<band height="41" splitType="Stretch">
<textField>
<reportElement isPrintRepeatedValues="false" x="100" y="0" width="200" height="20" uuid="f2d206d5-61fb-4238-93cf-c7dd16403a48"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<subreport>
<reportElement x="100" y="20" width="400" height="20" uuid="f3ca3eba-cb93-4ab4-8931-c399a8430841"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{people})]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "JasperTest_subreport.jasper"]]></subreportExpression>
</subreport>
<staticText>
<reportElement x="0" y="0" width="100" height="20" uuid="36a89b56-5476-4d8f-8b12-6bc7b551f0a5"/>
<text><![CDATA[Phone Name: ]]></text>
</staticText>
</band>
<band height="20">
<staticText>
<reportElement x="0" y="0" width="100" height="20" uuid="7097f9ab-d16b-4a10-b595-c8252c719c69"/>
<text><![CDATA[Game Name: ]]></text>
</staticText>
<textField evaluationTime="Band">
<reportElement isPrintRepeatedValues="false" x="100" y="0" width="200" height="20" uuid="52f89bfe-4d83-4ff8-a753-ea6af9503233"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
</band>
<band height="20">
<staticText>
<reportElement x="0" y="0" width="100" height="20" uuid="ea595ee3-209e-41ba-a496-270368ba92f6"/>
<text><![CDATA[Shoe Name: ]]></text>
</staticText>
<textField evaluationTime="Band">
<reportElement isPrintRepeatedValues="false" x="100" y="0" width="100" height="20" uuid="2701da16-fa78-4f7c-b753-2e461653f1e8"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
JasperTest_subreport.jr xml (не очень нужно, но я просто добавил, потому что он идет с другим отчетом)
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1 -->
<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="PlantAllocationVO_subreport" pageWidth="400" pageHeight="802" columnWidth="400" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="417a7f13-6776-4773-94ab-0be5c01605c7">
<field name="name" class="java.lang.String"/>
<field name="age" class="java.lang.Integer"/>
<detail>
<band height="20" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="200" height="20" uuid="34424fa2-18d0-4859-825a-a07f2a826f55"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField pattern="###0">
<reportElement x="200" y="0" width="200" height="20" uuid="a0e2ae10-906e-4d0f-aebd-30fc0c694aca"/>
<textElement textAlignment="Right" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{age}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>