DynamicReport使用XML数据源+ireport的.jxml文件作为模板
DynamicReport好不好用我不知道,但是它是开源的,文档还算全?用户的需求是想自己设计,但是ireport是给开发级别的使用的,据说用户并不想学,他们只想拖拖拽拽就出来一个报表。
功能需求总结:
1、用户自主设计报表样式
2、数据动态加载
解决方案:
将用户拖拽的结果,参照jxml的格式生成jxml文件,作为模板加载到DynamicReport里面;
数据源使用xml格式数据,可以实现动态
本文版翻译权归__馋猫和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
DynamicReport官方文档上面,这两个例子都有很详细的教程,链接如下:
使用模板:http://www.dynamicreports.org/examples/examples-overview#templatedesign
使用xml数据源:http://www.dynamicreports.org/examples/examples-overview#datasource
这里主要给出二者相结合使用的例子,小白级别步骤入下:
1、确定工程里面导入了DynamicReport所需要的各种jar包;
2、将 模板:testTable_subreport1.jxml和 数据源:NameList.xml添加到TestXML.Java同一包下面;
3、run即可;
package a.test.xmlfile; <?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="testTable_subreport1" language="groovy" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="8b0d8ddc-641f-46ec-a711-a5212faff8c4"> <property name="ireport.zoom" value="1.0"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="0"/> <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false"> <defaultValueExpression><![CDATA["F:\\Users\\Desktop\\"]]></defaultValueExpression> </parameter> <queryString language="xPath"> <![CDATA[/NameList/Person]]> </queryString> <field name="Name" class="java.lang.String"> <fieldDescription><![CDATA[Name]]></fieldDescription> </field> <field name="Gender" class="java.lang.String"> <fieldDescription><![CDATA[Gender]]></fieldDescription> </field> <field name="Age" class="java.lang.String"> <fieldDescription><![CDATA[Age]]></fieldDescription> </field> <group name="GroupName" footerPosition="ForceAtBottom" keepTogether="true"> <groupExpression><![CDATA[$F{Gender}]]></groupExpression> <groupHeader> <band splitType="Immediate"/> </groupHeader> </group> <title> <band height="79" splitType="Stretch"/> </title> <pageHeader> <band height="35" splitType="Stretch"/> </pageHeader> <columnHeader> <band height="61" splitType="Stretch"> <staticText> <reportElement mode="Transparent" x="141" y="41" width="100" height="20" uuid="506dc39b-345d-40cf-af57-e6d2264b4324"/> <text><![CDATA[Name]]></text> </staticText> <staticText> <reportElement x="41" y="41" width="100" height="20" uuid="eb47f825-0875-488a-be9f-d047df0cc967"/> <text><![CDATA[Gender]]></text> </staticText> <staticText> <reportElement x="241" y="41" width="100" height="20" uuid="06a53662-6d2a-4f55-b7ca-88880fbf55a4"/> <text><![CDATA[Age]]></text> </staticText> </band> </columnHeader> <detail> <band height="21" splitType="Stretch"> <rectangle> <reportElement x="41" y="1" width="100" height="20" uuid="8016a9b4-352b-4a7b-a4db-281be1b1acff"/> </rectangle> <rectangle> <reportElement x="141" y="1" width="100" height="20" uuid="9fcc48a6-004b-4298-a1a0-8096d1f98a5d"/> </rectangle> <rectangle> <reportElement x="241" y="1" width="100" height="20" uuid="155963b8-fb26-4e85-8d94-49baae947444"/> </rectangle> <textField> <reportElement x="141" y="1" width="100" height="20" uuid="2f3e4e70-3bd1-41a1-b815-de41a96fd504"/> <textFieldExpression><![CDATA[$F{Name}]]></textFieldExpression> </textField> <textField> <reportElement x="41" y="1" width="100" height="20" uuid="51f31db4-daf2-4521-bf60-988384f93caa"/> <textFieldExpression><![CDATA[$F{Gender}]]></textFieldExpression> </textField> <textField> <reportElement x="241" y="0" width="100" height="20" uuid="80c2563c-ae7c-41ed-adcd-6ba8e09bb53d"/> <textFieldExpression><![CDATA[$F{Age}]]></textFieldExpression> </textField> </band> </detail> </jasperReport> testTable_subreport1
1 package a.test.xmlfile; 2 3 import java.io.InputStream; 4 5 import net.sf.dynamicreports.examples.Templates; 6 import net.sf.dynamicreports.jasper.builder.JasperReportBuilder; 7 import net.sf.dynamicreports.report.builder.DynamicReports; 8 import net.sf.dynamicreports.report.builder.style.StyleBuilder; 9 import net.sf.jasperreports.engine.JRException; 10 import net.sf.jasperreports.engine.data.JRXmlDataSource; 11 12 public class TestXML { 13 14 public TestXML() { 15 build(); 16 } 17 18 private void build() { 19 JRXmlDataSource dataSource = null; 20 try { 21 dataSource = new JRXmlDataSource(TestXML.class.getResourceAsStream("NameList.xml"), "/NameList/Person"); 22 } catch (JRException e1) { 23 // TODO Auto-generated catch block 24 e1.printStackTrace(); 25 } 26 27 InputStream is = TestXML.class.getResourceAsStream("testTable_subreport1.jrxml"); 28 JasperReportBuilder report = DynamicReports.report();// 创建空报表 29 StyleBuilder chineseStl = DynamicReports.stl.style().setFontName("FreeUniversalMSY").setFontSize(12); 30 try { 31 // report; 32 33 report.setTemplate(Templates.reportTemplate).setTitleStyle(chineseStl).setTemplateDesign(is) 34 .setDataSource(dataSource).show(); 35 } catch (Exception e) { 36 e.printStackTrace(); 37 } 38 } 39 40 public static void main(String[] args) { 41 new TestXML(); 42 } 43 44 }
1 <?xml version="1.0" encoding="utf-8" ?> 2 <NameList> 3 <Person> 4 <Name>阿美</Name> 5 <Gender>女</Gender> 6 <Age>23</Age> 7 </Person> 8 <Person> 9 <Name>李丽</Name> 10 <Gender>女</Gender> 11 <Age>58</Age> 12 </Person> 13 <Person> 14 <Name>强尼</Name> 15 <Gender>男</Gender> 16 <Age>56</Age> 17 </Person> 18 <Person> 19 <Name>杰森</Name> 20 <Gender>男</Gender> 21 <Age>21</Age> 22 </Person> 23 <Person> 24 <Name>刘三</Name> 25 <Gender>男</Gender> 26 <Age>21</Age> 27 </Person> 28 </NameList>
本文版翻译权归__馋猫和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
这里需要注意的是,如果你想自己写jxml文件,一定要注意顺序,有些标签出现顺序有排位,如果错位的话,DynamicReport里面会报错。还有好多坑,,,下次贴代码。