我正在尝试创建一个JasperReport。但执行“JasperFillManager.fillReport()”大约需要10秒。有人知道为什么需要这么长时间吗?
public JasperViewer createReport(Long termin_id) {
String reportSource = getClass().getResource("/reports/example.jrxml").getPath();
parameters = new HashMap<String, Object>();
parameters.put("Terminnummer", termin_id);
try {
JasperReport jasperReport = JasperCompileManager.compileReport(reportSource);
Connection c = MySQL.getNativeConnection();
JasperPrint print = JasperFillManager.fillReport(jasperReport, parameters, c);
jv = new JasperViewer(print, false);
});
} catch (JRException ex) {
System.out.println(ex.getMessage());
}
return jv;
感谢您的帮助。
这是我用于此报告的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="repTermin" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<style name="Crosstab Data Text" hAlign="Center"/>
<parameter name="Terminnummer" class="java.lang.Long"/>
<parameter name="Bearbeiter" class="java.lang.String"/>
<parameter name="Teilnehmer" class="java.lang.String"/>
<queryString>
<![CDATA[SELECT t.*, a.AKTENZEICHENJAHR, a.AKTENZEICHENNUMMER, a.GRUND, a.BEZEICHNUNG, b.`NAME` AS ANLEGER, b2.`NAME` AS MITARBEITER
FROM demo.TERMIN t, demo.AKTE a, demo.BENUTZER b, demo.BENUTZER b2
WHERE t.ID = $P{Terminnummer} AND b.ID = t.ANLEGER_ID AND a.ID = t.AKTE_ID AND b2.ID = t.MITARBEITER_ID]]>
</queryString>
<field name="ID" class="java.lang.Long"/>
<field name="ART" class="java.lang.String"/>
<field name="BEMERKUNG" class="java.lang.String"/>
<field name="BESCHREIBUNG" class="java.lang.String"/>
<field name="DATUM" class="java.lang.Long"/>
<field name="DAUER" class="java.lang.Long"/>
<field name="ERSTELLT" class="java.lang.Long"/>
<field name="NOTIZEN" class="java.lang.String"/>
<field name="ORT" class="java.lang.String"/>
<field name="PRIVAT" class="java.lang.Boolean"/>
<field name="STATUS" class="java.lang.String"/>
<field name="AKTE_ID" class="java.lang.Long"/>
<field name="ANLEGER_ID" class="java.lang.Long"/>
<field name="MITARBEITER_ID" class="java.lang.Long"/>
<field name="PERSON_ID" class="java.lang.Long"/>
<field name="AKTENZEICHENJAHR" class="java.lang.String"/>
<field name="AKTENZEICHENNUMMER" class="java.lang.String"/>
<field name="GRUND" class="java.lang.String"/>
<field name="BEZEICHNUNG" class="java.lang.String"/>
<field name="ANLEGER" class="java.lang.String"/>
<field name="MITARBEITER" class="java.lang.String"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="146" splitType="Stretch">
<textField pattern="">
<reportElement x="0" y="100" width="555" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center">
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$F{ART}.toString()+" am "+new java.text.SimpleDateFormat("dd.MM.yyyy").format(new Date($F{DATUM}))+" ("+new java.text.SimpleDateFormat("EEEEE").format(new Date($F{DATUM}))+") um "+new java.text.SimpleDateFormat("HH:mm").format(new Date($F{DATUM}))+" Uhr"]]></textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height="6" splitType="Stretch">
<line>
<reportElement x="0" y="0" width="555" height="1"/>
<graphicElement>
<pen lineWidth="3.0"/>
</graphicElement>
</line>
</band>
</pageHeader>
<columnHeader>
<band height="6" splitType="Stretch"/>
</columnHeader>
<detail>
<band height="472" splitType="Stretch">
<staticText>
<reportElement mode="Opaque" x="0" y="0" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Akten und Aktenzeichen]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="18" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Bearbeiter der Akte]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="36" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Termin bestimmt für]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="66" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[weitere Teilnehmer]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="202" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Bemerkung]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="231" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Datum]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="249" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Uhrzeit]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="267" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Dauer]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="285" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Ort des Termins]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="332" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Termin notiert am]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="314" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Termin notiert von]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="0" y="363" width="219" height="18" backcolor="#CCCCCC"/>
<textElement>
<font fontName="Tahoma" size="14" isBold="true"/>
</textElement>
<text><![CDATA[Notizen]]></text>
</staticText>
<textField>
<reportElement x="240" y="0" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[$F{AKTENZEICHENJAHR}+" - "+$F{AKTENZEICHENNUMMER}+" "+$F{GRUND}]]></textFieldExpression>
</textField>
<textField isBlankWhenNull="true">
<reportElement x="240" y="18" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[$P{Bearbeiter}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="240" y="36" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[$F{MITARBEITER}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="240" y="202" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[$F{BEMERKUNG}]]></textFieldExpression>
</textField>
<textField isBlankWhenNull="true">
<reportElement x="240" y="231" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[new java.text.SimpleDateFormat("dd.MMMM yyyy").format(new Date($F{DATUM}))]]></textFieldExpression>
</textField>
<textField>
<reportElement x="240" y="249" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[new java.text.SimpleDateFormat("HH:mm").format(new Date($F{DATUM}))]]></textFieldExpression>
</textField>
<textField>
<reportElement x="240" y="267" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[new java.text.SimpleDateFormat("HH").format(new Date($F{DAUER}))+"h "+new java.text.SimpleDateFormat("mm").format(new Date($F{DAUER}))+" min"]]></textFieldExpression>
</textField>
<textField>
<reportElement x="240" y="285" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[$F{ORT}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="240" y="314" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[$F{ANLEGER}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="240" y="332" width="315" height="18"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[new java.text.SimpleDateFormat("dd.MMMM yyyy, HH:mm").format(new Date($F{ERSTELLT}))]]></textFieldExpression>
</textField>
<textField>
<reportElement x="240" y="363" width="315" height="85"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[$F{NOTIZEN}]]></textFieldExpression>
</textField>
<textField isBlankWhenNull="true">
<reportElement x="240" y="66" width="315" height="114"/>
<textElement>
<font fontName="Tahoma" size="14"/>
</textElement>
<textFieldExpression><![CDATA[$P{Teilnehmer}]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>
答案 0 :(得分:2)
假设您的报告使用sql查询来获取数据,您是否测试了SQL查询运行多长时间?
另一个问题是您在查询中返回了多少数据?它越多,显然需要的时间越长。
此外,您还要在每次运行时重新编译报告。虽然这可能不适合您,但您可以使用报告的缓存版本。
本质:
您可以使用JasperCompileManager.compileReportToStream(inputStream, outputStream);
将其编译为文件,其中输出流是FileOutputStream;
答案 1 :(得分:0)
请尝试使用虚拟器。在这里,我列出了示例代码。
public InputStream xlsReportGen(String xml, String reportTemplate,
String reportPath, Map<String, Object> reportParams)
throws Exception {
ByteArrayOutputStream _out = new ByteArrayOutputStream();
JRDataSource datasource = new JRXmlDataSource(new File(xml));
JasperReport jasperReport = (JasperReport) JRLoader
.loadObjectFromFile(reportPath + reportTemplate);
// creating the virtualizer
JRSwapFile swapFile = new JRSwapFile(reportPath, 4096, 4096);
JRAbstractLRUVirtualizer virtualizer = new JRSwapFileVirtualizer(5000,
swapFile, true);
reportParams.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
JasperPrint _print = JasperFillManager.fillReport(jasperReport,
reportParams, datasource);
if (virtualizer != null) {
virtualizer.cleanup();
}
JRXlsExporter exporter = new JRXlsExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, _print);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, _out);
exporter.setParameter(
JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
Boolean.TRUE);
exporter.exportReport();
return new ByteArrayInputStream(_out.toByteArray());
}
答案 2 :(得分:0)
检查您是否没有使用两个数据源。我发现jasper在交叉表中使用了两个数据源(主数据源和一个子数据集),但我只需要主数据源。