为什么我得到多个图表而不是一个带有系列的图表?
Why do I get multiple charts instead of one chart with series?
按照这里的回答:
我至少设法用我的嵌套列表创建了图表。
我的 java 对象:
public class PoolUserLoginsVO {
private int userLogins;
private String poolId;
private Date date;
//constructor + getter/setters
userLogins 是y 坐标值,图表是时间序列图表所以x 坐标是日期。 poolId 是坐标所属的系列。
我得到了每个系列所需的值列表,并且由于有多个系列,所以我有一个列表列表,我将其传递给 Jasper Reports 的参数映射。
我的 Jasper 报告:
主要 jasper(整个文档很长,所以只有相关部分):
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown -->
<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="test" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="fbaeab5e-6793-456e-9567-e0c5af982904">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<parameter name="poolLogins" class="java.util.List"/>
<queryString>
<![CDATA[]]>
</queryString>
<background>
<band splitType="Stretch"/>
</background>
<detail>
<band height="223">
<subreport>
<reportElement x="0" y="0" width="550" height="200" uuid="9f8a2d4a-1d90-4f88-a08c-1ea2604360c5"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{poolLogins})]]></dataSourceExpression>
<subreportExpression><![CDATA["sub_charts.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
</jasperReport>
$P{poolLogins} 是一个 List<List<PoolUserLoginsVO>
.
sub_charts.jasper :
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown -->
<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="sub_charts" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="bc8c76ba-0b85-4522-bf67-4c62ae87202b">
<field name="_THIS" class="java.util.List">
<fieldDescription><![CDATA[_THIS]]></fieldDescription>
</field>
<detail>
<band height="237" splitType="Stretch">
<subreport>
<reportElement x="0" y="20" width="540" height="200" uuid="1ec1f733-ffee-46f3-859c-f774e5277d19"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{_THIS})]]></dataSourceExpression>
<subreportExpression><![CDATA["sub_chart.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
</jasperReport>
sub_chart.jasper :
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown -->
<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="sub_chart" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4ce41625-c60b-4759-acbe-5fe12a013fb2">
<queryString>
<![CDATA[]]>
</queryString>
<field name="userLogins" class="java.lang.Integer"/>
<field name="poolId" class="java.lang.String"/>
<field name="date" class="java.util.Date"/>
<background>
<band splitType="Stretch"/>
</background>
<detail>
<band height="210" splitType="Stretch">
<timeSeriesChart>
<chart evaluationTime="Report">
<reportElement x="0" y="20" width="540" height="180" uuid="874eee5e-1e71-4870-906b-ef71ef91d274"/>
<chartTitle/>
<chartSubtitle/>
<chartLegend/>
</chart>
<timeSeriesDataset>
<timeSeries>
<seriesExpression><![CDATA[$F{poolId}]]></seriesExpression>
<timePeriodExpression><![CDATA[$F{date}]]></timePeriodExpression>
<valueExpression><![CDATA[$F{userLogins}.intValue()]]></valueExpression>
</timeSeries>
</timeSeriesDataset>
<timeSeriesPlot>
<plot/>
<timeAxisFormat>
<axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
</timeAxisFormat>
<valueAxisFormat>
<axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
</valueAxisFormat>
</timeSeriesPlot>
</timeSeriesChart>
</band>
</detail>
</jasperReport>
PDF 和图表成功生成。但是有两个问题:
1) 我得到了大约 30 页的图表,尽管只有 4 个系列。每个系列精确复制 30 次(每个系列中的坐标数)。不过生成的图表都是正确的。
2) 我不想要单独的图表。我希望所有系列都在一个图表中,具有不同的颜色。
我做错了什么?
编辑:
主要:
public class testmain {
public static void main(String[] args) {
int threshold = 30;
List<List<PoolUserLoginsVO>> poolLogins = new ArrayList<>();
List<PoolUserLoginsVO> userLogins = new ArrayList<>();
for (int i = 0; i < threshold; ++i) {
LocalDate localDate = LocalDate.now().minusDays(threshold - i - 1);
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
PoolUserLoginsVO logins = new PoolUserLoginsVO(i, "pool1", date);
userLogins.add(logins);
}
poolLogins.add(userLogins);
List<PoolUserLoginsVO> userLogins2 = new ArrayList<>();
for (int i = 0; i < threshold; ++i) {
LocalDate localDate = LocalDate.now().minusDays(threshold - i - 1);
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
PoolUserLoginsVO logins = new PoolUserLoginsVO(1, "pool2", date);
userLogins2.add(logins);
}
poolLogins.add(userLogins2);
List<PoolUserLoginsVO> userLogins3 = new ArrayList<>();
for (int i = threshold; i > 0; --i) {
LocalDate localDate = LocalDate.now().minusDays(threshold - i - 1);
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
PoolUserLoginsVO logins = new PoolUserLoginsVO(i, "pool3", date);
userLogins3.add(logins);
}
poolLogins.add(userLogins3);
JRBeanCollectionDataSource vmsJRBean = new JRBeanCollectionDataSource(poolLogins);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("poolLogins", poolLogins);
File file = new File("report.pdf");
try {
FileOutputStream fop = new FileOutputStream(file);
JasperPrint jasperPrint = JasperFillManager.fillReport("test.jasper", parameters, new JREmptyDataSource());
JasperExportManager.exportReportToPdfStream(jasperPrint, fop);
fop.flush();
fop.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
您忽略了细节带在 sub_chart.jasper
中的实际作用
详细信息带将遍历您的数据源(一个又一个记录),为每条记录创建一个图表,而您不希望这样;您需要图表的数据源。
我很难测试您的实际设置以检查其他一切是否正常,但一个很好的猜测是您将图表移动到 汇总带 就足够了,然后完全删除细节带。
您 sub_chart.jasper 中的代码更改为:
<detail>
--> <summary>
</detail>
--> </summary>
我终于修好了!我不应该关注我在 OP 中链接的其他 question/answer。我认为这个问题是在问如何创建多个图表,我只想要一个图表,但所有系列都组合在一起。我通过不将我的数据放在嵌套列表中来解决问题。我只是将所有数据放在一个一维列表中;因为每个 PoolUserLoginsVO 都已经包含它所属的 poolId,所以以嵌套列表开头是没有意义的(除非我想每个池都有多个图表)。所以我传入了一个列表,然后修改了主要的 jasper 报告以直接传递给 sub_chart.jasper 而不是 sub_charts.jasper (我删除了 sub_charts.jasper 因为它不再需要)。结果?
成功!
按照这里的回答:
我至少设法用我的嵌套列表创建了图表。 我的 java 对象:
public class PoolUserLoginsVO {
private int userLogins;
private String poolId;
private Date date;
//constructor + getter/setters
userLogins 是y 坐标值,图表是时间序列图表所以x 坐标是日期。 poolId 是坐标所属的系列。
我得到了每个系列所需的值列表,并且由于有多个系列,所以我有一个列表列表,我将其传递给 Jasper Reports 的参数映射。
我的 Jasper 报告:
主要 jasper(整个文档很长,所以只有相关部分):
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown -->
<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="test" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="fbaeab5e-6793-456e-9567-e0c5af982904">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<parameter name="poolLogins" class="java.util.List"/>
<queryString>
<![CDATA[]]>
</queryString>
<background>
<band splitType="Stretch"/>
</background>
<detail>
<band height="223">
<subreport>
<reportElement x="0" y="0" width="550" height="200" uuid="9f8a2d4a-1d90-4f88-a08c-1ea2604360c5"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{poolLogins})]]></dataSourceExpression>
<subreportExpression><![CDATA["sub_charts.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
</jasperReport>
$P{poolLogins} 是一个 List<List<PoolUserLoginsVO>
.
sub_charts.jasper :
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown -->
<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="sub_charts" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="bc8c76ba-0b85-4522-bf67-4c62ae87202b">
<field name="_THIS" class="java.util.List">
<fieldDescription><![CDATA[_THIS]]></fieldDescription>
</field>
<detail>
<band height="237" splitType="Stretch">
<subreport>
<reportElement x="0" y="20" width="540" height="200" uuid="1ec1f733-ffee-46f3-859c-f774e5277d19"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{_THIS})]]></dataSourceExpression>
<subreportExpression><![CDATA["sub_chart.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
</jasperReport>
sub_chart.jasper :
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown -->
<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="sub_chart" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4ce41625-c60b-4759-acbe-5fe12a013fb2">
<queryString>
<![CDATA[]]>
</queryString>
<field name="userLogins" class="java.lang.Integer"/>
<field name="poolId" class="java.lang.String"/>
<field name="date" class="java.util.Date"/>
<background>
<band splitType="Stretch"/>
</background>
<detail>
<band height="210" splitType="Stretch">
<timeSeriesChart>
<chart evaluationTime="Report">
<reportElement x="0" y="20" width="540" height="180" uuid="874eee5e-1e71-4870-906b-ef71ef91d274"/>
<chartTitle/>
<chartSubtitle/>
<chartLegend/>
</chart>
<timeSeriesDataset>
<timeSeries>
<seriesExpression><![CDATA[$F{poolId}]]></seriesExpression>
<timePeriodExpression><![CDATA[$F{date}]]></timePeriodExpression>
<valueExpression><![CDATA[$F{userLogins}.intValue()]]></valueExpression>
</timeSeries>
</timeSeriesDataset>
<timeSeriesPlot>
<plot/>
<timeAxisFormat>
<axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
</timeAxisFormat>
<valueAxisFormat>
<axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
</valueAxisFormat>
</timeSeriesPlot>
</timeSeriesChart>
</band>
</detail>
</jasperReport>
PDF 和图表成功生成。但是有两个问题:
1) 我得到了大约 30 页的图表,尽管只有 4 个系列。每个系列精确复制 30 次(每个系列中的坐标数)。不过生成的图表都是正确的。
2) 我不想要单独的图表。我希望所有系列都在一个图表中,具有不同的颜色。
我做错了什么?
编辑:
主要:
public class testmain {
public static void main(String[] args) {
int threshold = 30;
List<List<PoolUserLoginsVO>> poolLogins = new ArrayList<>();
List<PoolUserLoginsVO> userLogins = new ArrayList<>();
for (int i = 0; i < threshold; ++i) {
LocalDate localDate = LocalDate.now().minusDays(threshold - i - 1);
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
PoolUserLoginsVO logins = new PoolUserLoginsVO(i, "pool1", date);
userLogins.add(logins);
}
poolLogins.add(userLogins);
List<PoolUserLoginsVO> userLogins2 = new ArrayList<>();
for (int i = 0; i < threshold; ++i) {
LocalDate localDate = LocalDate.now().minusDays(threshold - i - 1);
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
PoolUserLoginsVO logins = new PoolUserLoginsVO(1, "pool2", date);
userLogins2.add(logins);
}
poolLogins.add(userLogins2);
List<PoolUserLoginsVO> userLogins3 = new ArrayList<>();
for (int i = threshold; i > 0; --i) {
LocalDate localDate = LocalDate.now().minusDays(threshold - i - 1);
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
PoolUserLoginsVO logins = new PoolUserLoginsVO(i, "pool3", date);
userLogins3.add(logins);
}
poolLogins.add(userLogins3);
JRBeanCollectionDataSource vmsJRBean = new JRBeanCollectionDataSource(poolLogins);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("poolLogins", poolLogins);
File file = new File("report.pdf");
try {
FileOutputStream fop = new FileOutputStream(file);
JasperPrint jasperPrint = JasperFillManager.fillReport("test.jasper", parameters, new JREmptyDataSource());
JasperExportManager.exportReportToPdfStream(jasperPrint, fop);
fop.flush();
fop.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
您忽略了细节带在 sub_chart.jasper
中的实际作用详细信息带将遍历您的数据源(一个又一个记录),为每条记录创建一个图表,而您不希望这样;您需要图表的数据源。
我很难测试您的实际设置以检查其他一切是否正常,但一个很好的猜测是您将图表移动到 汇总带 就足够了,然后完全删除细节带。
您 sub_chart.jasper 中的代码更改为:
--> <detail>
<summary>
--> </detail>
</summary>
我终于修好了!我不应该关注我在 OP 中链接的其他 question/answer。我认为这个问题是在问如何创建多个图表,我只想要一个图表,但所有系列都组合在一起。我通过不将我的数据放在嵌套列表中来解决问题。我只是将所有数据放在一个一维列表中;因为每个 PoolUserLoginsVO 都已经包含它所属的 poolId,所以以嵌套列表开头是没有意义的(除非我想每个池都有多个图表)。所以我传入了一个列表,然后修改了主要的 jasper 报告以直接传递给 sub_chart.jasper 而不是 sub_charts.jasper (我删除了 sub_charts.jasper 因为它不再需要)。结果?
成功!