如何使用 JasperReports 在 Abstract Book 中正确编译 table 的内容?
How to compile table of contents correctly in Abstract Book using JasperReports?
我正在处理摘要书类型的报告。它包括 ToC(table 的内容) 和子报告 (JRXML):
<group name="cover">
<groupHeader>
<part evaluationTime="Report" uuid="56ab525c-754f-4f48-a52c-7cc23934be3d">
<property name="net.sf.jasperreports.bookmarks.data.source.parameter" value="REPORT_DATA_SOURCE"/>
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd">
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression>
<![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("combinedReport")]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[$P{tocReport}]]></subreportExpression>
</p:subreportPart>
</part>
</groupHeader>
</group>
<detail>
<part uuid="9431bc63-c820-403c-a317-e7ffe3295dcf">
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd">
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression>
<![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("combinedReport")]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[$P{subreport}]]></subreportExpression>
</p:subreportPart>
</part>
</detail>
我在子报表的文本字段中添加了一个超链接:
<textField textAdjust="StretchHeight" hyperlinkType="LocalAnchor" bookmarkLevel="1">
<reportElement x="0" y="0" width="280" height="30" uuid="8a8b1b38-78d3-4ab5-a728-6c0f2796371d"/>
<textElement>
<font size="14" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA["Bla bla"]]></textFieldExpression>
<anchorNameExpression><![CDATA["Bla bla"]]></anchorNameExpression>
</textField>
然而table of contents是空的,只在页面顶部显示静态文本“Table of contents”。
这是我编写报告的方式(简短版):
subReport = JasperCompileManager.compileReport(jrxmlContentOutputPath);
tocReport = JasperCompileManager.compileReport(jrxmlTocOutputPath);
InputStream templateIs = ReportPdfService.class.getClassLoader().getResourceAsStream("jasper-reports/Abstract_Book.jrxml");
Map<String, Object> parameters = new HashMap<>();
parameters.put("REPORT_DATA_SOURCE", jsonDataSource);
parameters.put("subreport", subReport);
parameters.put("tocReport", tocReport);
JasperReport report = JasperCompileManager.compileReport(templateIs);
JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameters);
JasperExportManager.exportReportToPdfFile(jasperPrint, outputReportPdfPath);
我认为问题出在编译 toc 之后创建的超链接之类的。但是没有任何效果。
问题出在具有参数 splitType="Immediate" 的细节带区。当我删除它时,ToC 开始工作。不知道为什么会这样。
我正在处理摘要书类型的报告。它包括 ToC(table 的内容) 和子报告 (JRXML):
<group name="cover">
<groupHeader>
<part evaluationTime="Report" uuid="56ab525c-754f-4f48-a52c-7cc23934be3d">
<property name="net.sf.jasperreports.bookmarks.data.source.parameter" value="REPORT_DATA_SOURCE"/>
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd">
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression>
<![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("combinedReport")]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[$P{tocReport}]]></subreportExpression>
</p:subreportPart>
</part>
</groupHeader>
</group>
<detail>
<part uuid="9431bc63-c820-403c-a317-e7ffe3295dcf">
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd">
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression>
<![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("combinedReport")]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[$P{subreport}]]></subreportExpression>
</p:subreportPart>
</part>
</detail>
我在子报表的文本字段中添加了一个超链接:
<textField textAdjust="StretchHeight" hyperlinkType="LocalAnchor" bookmarkLevel="1">
<reportElement x="0" y="0" width="280" height="30" uuid="8a8b1b38-78d3-4ab5-a728-6c0f2796371d"/>
<textElement>
<font size="14" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA["Bla bla"]]></textFieldExpression>
<anchorNameExpression><![CDATA["Bla bla"]]></anchorNameExpression>
</textField>
然而table of contents是空的,只在页面顶部显示静态文本“Table of contents”。 这是我编写报告的方式(简短版):
subReport = JasperCompileManager.compileReport(jrxmlContentOutputPath);
tocReport = JasperCompileManager.compileReport(jrxmlTocOutputPath);
InputStream templateIs = ReportPdfService.class.getClassLoader().getResourceAsStream("jasper-reports/Abstract_Book.jrxml");
Map<String, Object> parameters = new HashMap<>();
parameters.put("REPORT_DATA_SOURCE", jsonDataSource);
parameters.put("subreport", subReport);
parameters.put("tocReport", tocReport);
JasperReport report = JasperCompileManager.compileReport(templateIs);
JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameters);
JasperExportManager.exportReportToPdfFile(jasperPrint, outputReportPdfPath);
我认为问题出在编译 toc 之后创建的超链接之类的。但是没有任何效果。
问题出在具有参数 splitType="Immediate" 的细节带区。当我删除它时,ToC 开始工作。不知道为什么会这样。