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即可;
1 <?xml version="1.0" encoding="UTF-8"?> 2 <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"> 3 <property name="ireport.zoom" value="1.0"/> 4 <property name="ireport.x" value="0"/> 5 <property name="ireport.y" value="0"/> 6 <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false"> 7 <defaultValueExpression><![CDATA["F:\\Users\\wenbo\\Desktop\\"]]></defaultValueExpression> 8 </parameter> 9 <queryString language="xPath"> 10 <![CDATA[/NameList/Person]]> 11 </queryString> 12 <field name="Name" class="java.lang.String"> 13 <fieldDescription><![CDATA[Name]]></fieldDescription> 14 </field> 15 <field name="Gender" class="java.lang.String"> 16 <fieldDescription><![CDATA[Gender]]></fieldDescription> 17 </field> 18 <field name="Age" class="java.lang.String"> 19 <fieldDescription><![CDATA[Age]]></fieldDescription> 20 </field> 21 <group name="GroupName" footerPosition="ForceAtBottom" keepTogether="true"> 22 <groupExpression><![CDATA[$F{Gender}]]></groupExpression> 23 <groupHeader> 24 <band splitType="Immediate"/> 25 </groupHeader> 26 </group> 27 <title> 28 <band height="79" splitType="Stretch"/> 29 </title> 30 <pageHeader> 31 <band height="35" splitType="Stretch"/> 32 </pageHeader> 33 <columnHeader> 34 <band height="61" splitType="Stretch"> 35 <staticText> 36 <reportElement mode="Transparent" x="141" y="41" width="100" height="20" uuid="506dc39b-345d-40cf-af57-e6d2264b4324"/> 37 <text><![CDATA[Name]]></text> 38 </staticText> 39 <staticText> 40 <reportElement x="41" y="41" width="100" height="20" uuid="eb47f825-0875-488a-be9f-d047df0cc967"/> 41 <text><![CDATA[Gender]]></text> 42 </staticText> 43 <staticText> 44 <reportElement x="241" y="41" width="100" height="20" uuid="06a53662-6d2a-4f55-b7ca-88880fbf55a4"/> 45 <text><![CDATA[Age]]></text> 46 </staticText> 47 </band> 48 </columnHeader> 49 <detail> 50 <band height="21" splitType="Stretch"> 51 <rectangle> 52 <reportElement x="41" y="1" width="100" height="20" uuid="8016a9b4-352b-4a7b-a4db-281be1b1acff"/> 53 </rectangle> 54 <rectangle> 55 <reportElement x="141" y="1" width="100" height="20" uuid="9fcc48a6-004b-4298-a1a0-8096d1f98a5d"/> 56 </rectangle> 57 <rectangle> 58 <reportElement x="241" y="1" width="100" height="20" uuid="155963b8-fb26-4e85-8d94-49baae947444"/> 59 </rectangle> 60 <textField> 61 <reportElement x="141" y="1" width="100" height="20" uuid="2f3e4e70-3bd1-41a1-b815-de41a96fd504"/> 62 <textFieldExpression><![CDATA[$F{Name}]]></textFieldExpression> 63 </textField> 64 <textField> 65 <reportElement x="41" y="1" width="100" height="20" uuid="51f31db4-daf2-4521-bf60-988384f93caa"/> 66 <textFieldExpression><![CDATA[$F{Gender}]]></textFieldExpression> 67 </textField> 68 <textField> 69 <reportElement x="241" y="0" width="100" height="20" uuid="80c2563c-ae7c-41ed-adcd-6ba8e09bb53d"/> 70 <textFieldExpression><![CDATA[$F{Age}]]></textFieldExpression> 71 </textField> 72 </band> 73 </detail> 74 </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 }
TestXML
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>
NameList
本文版翻译权归__馋猫和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
这里需要注意的是,如果你想自己写jxml文件,一定要注意顺序,有些标签出现顺序有排位,如果错位的话,DynamicReport里面会报错。还有好多坑,,,下次贴代码。