Java Reports
JasperReports:
Java Reports
JasperReports ابزاری متن باز و مبتنی بر جاوا برای تهیه انواع گزارش است که از آن در هر جایی که نیاز به گزارش گیری باشد می توان استفاده کرد (برنامه دسکتاپی ، تحت وب و …).
JasperReporst مبتنی بر جاواست و یادگیری زبان یا الگوی خاصی را به شما تحمیل نمی کند و استفاده از آن بسیار ساده است.
در حقیقت JasperReoprts یک کتابخانه جاوایی است که ابزار های لازم برای تهیه گزارش را در اختیار شما قرار می دهد.
JfreeChart:
Java Reports
JFreeChart کتباخانه رایگان جاوایی است که با استفاده از آن می توانید انواع نمودار های مختلف (مانند نمودار های میله ای ، دایره ای و …) را به صورت دو بعدی یا سه بعدی ایجاد کنید. ترکیب JasperReporst با JFreeChart گزارش های بسیار زیبایی را ایجاد می کند.
آشنایی سریع با نحوه ساخت گزارش با JasperReports:
Java Reports
فرآیند ساخت گزارش با استفاده از JasperReports از چهار قسمت تشکیل شده است :
- طراحی : این مرحله شامل ساخت فایل JRXML (فایلی با پسوند jrxml. و با ساختار xml) است که قالب و شکل کلی گزارش را مشخص می کند.
- کامپایل : این مرحله شامل تبدیل فایل jrxml. به فایلی با پسوند jasper. است.هنگامی که برنامه ای طراحی می کنید فایل های با پسوند jasper. فایل هایی هستند که برای اجرای صحیح گزارش ها به آن ها نیاز دارید.(پس از کامپیال کردن فایل های jrxml. به jasper. مشتری نیازی به فایل های jrxml. نخواهد داشت ).
- اجرا : در این مرحله قالب کامپایل شده گزارش با داده های برنامه پر می شود.
- خروجی : در این مرحله می توانیم خروجی دلخواه خود را از گزارش تهیه کنیم. خروجی می تواند pdf یا xml یا HTML یا … باشد که در ادامه به انواع خروجی قابل تهیه اشاره خواهیم کرد.
آغاز به کار :
Java Reports
بهتر است دست به کار شویم. یک پوشه خالی به نام safecompreport در هر جایی از کامپیوترتان که دوست دارید ایجاد کنید.
در داخل پوشه safecompreport پوشه جدیدی به نام jasper ایجاد کنید.
JasperReports را از حالت فشرده خارج کنید و پوشه های lib و dist را در داخل پوشه jasper که در پوشه safecompreport ایجاد کردید کپی کنید.
در داخل پوشه safecompreport فایل جدیدی به نام base.xml ایجاد می کنیم که این فایل حاوی دستورات ant برای کامپایل برنامه های جاوایی است( به همراه پاک سازی).اگر با دستورات ant آشنایی داشته باشید درک این فایل بسیار ساده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?xml version="1.0" encoding="UTF-8"?> <project name="SafecompReport" basedir="."> <description>Jasper Reports Tutorial</description> <property name="file.name" value="jasper_report_template" /> <property name="jasper.dir" value="jasper" /> <property name="dist.dir" value="${jasper.dir}/dist" /> <property name="lib.dir" value="${jasper.dir}/lib" /> <property name="src.dir" value="src" /> <property name="classes.dir" value="classes" /> <path id="classpath"> <pathelement location="./" /> <pathelement location="${classes.dir}" /> <fileset dir="${lib.dir}"> <include name="**/*.jar" /> </fileset> <fileset dir="${dist.dir}"> <include name="**/*.jar" /> </fileset> </path> <target name="compile" depends="clean"> <mkdir dir="${classes.dir}"/> <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" /> </target> <target name="clean"> <delete dir="${classes.dir}" /> </target> </project> |
طراحی :
Java Reports
همانطور که قبلاً اشاره کردم اولین مرحله در ساخت گزارش مرحله طراحی است. در این مرحله یه فایل با پسوند jrxml. ایجاد می کنیم که حاوی شکل کلی گزارش است.در ادامه کم کم با ساختار این فایل آشنا خواهیم شد.
گزارش چیست؟
Java Reports
قبل از اینکه فایل jrxml. مورد نظرمان را ایجاد کنیم بهتر است بیشتر با مفهوم گزارش آشنا شویم.
یک گزارش نمایش دهنده اطلاعات معنا داری در قالب جداول ، نمودار ها و گراف هاست که این اطلاعات از منابع مختلف (معمولاً پایگاه داده) می آیند.
هیچ چیز پیچیده ای در کار نیست ، این قالب کلی یک گزارش است که بعداً می توان آن را به صورت pdf یا html یا … ذخیره نمود.
معمولاً یک گزارش از قسمت های زیر (که در عکس فوق نام برده شده اند) تشکیل شده است :
Tilte : شامل عنوان گزارش خواهد بود.
Page Header : سر صفحه ، معمولاً اطلاعات مروبط به شرکت ، سازمان و … در این قسمت قرار داده می شود (هیچ الزامی در کار نیست).
Column Header : عنوان ستون ها ، اگر داده ها به صورت جدولی باشند معمولاً عنوان ستون ها را در این قسمت قرار می دهیم .
Detail 1 : شامل اطلاعات گزارش است
Column Footer : اطلاعات آخرین سطر جداول معمولاً در این قسمت قرار می گیرند (مثلاً جمع مقادیر ستون ها و …)
Page Footer : پا صفحه.
Summary : خلاصه گزارش.
توجه کنید که الزامی وجود ندارد که یک گزارش از تمام قسمت های فوق ایجاد شود ، بلکه هدف این است که با ساختار کلی یک گزارش آشنا شویم.
ساختار اولیه گزارش اینچنینی در قالب یک فایل با پسوند jrxml. به صورت زیر نمایش داده می شود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <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="jasper_report_template" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <title> </title> <pageHeader> </pageHeader> <columnHeader> </columnHeader> <detail> </detail> <columnFooter> </columnFooter> <pageFooter> </pageFooter> <summary> </summary> </jasperReport> |
همانطور که مشاهده می کنید این فایل یک فایل ساده xml است که از تگ های مختلف برای ایجاد بخش های مختلف در آن استفاده شده است. تگ jasperReport تگ ریشه (root) این فایل و الزامی است. ما بقی تگ ها (تگ های داخلی) اختیاری هستند.
برای اینکه بهتر با ساختار فایل های jrxml. آشنا شویم بهتر است دست به کار شویم و در قالب مثال بیشتر این ساختار را یاد بگیریم.
در داخل پوشه safecompreport فایل جدیدی به نام jasper_report_template.jrxml ایجاد می کنیم و در داخل این فایل کد زیر را می نویسیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <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="jasper_report_template" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <columnHeader> <band height="23"> <staticText> <reportElement mode="Opaque" x="0" y="3" width="555" height="15" backcolor="#ff0000" /> </staticText> </band> </columnHeader> <detail> </detail> </jasperReport> |
همانطور که مشاهده می کنید در این مثال فقط تگ های columnHeader و detail1 را نگه داشته ام و مابقی تگ ها را حذف کردم. تگ detail1 نیز کاملاً خالی است.در داخل تگ columnHeader تگ جدیدی به نام band داریم ، این تگ فقط یک ناحیه را مشخص می کند که در این مثال ارتفاع این ناحیه برابر با ۲۳ است.
در داخل تگ band تگ دیگری به نام staticText مشاهده می کنیم که برای مشخص متن ثابت از آن استفاده می شود و البته در این مثال هیچ متنی به کار نرفته است.با استفاده از reportElement نیز یک ناحیه رنگی ایجاد کردیم.
مشاهده قالب در مرحله طراحی :
Java Reports
پیش نمایش قالب گزارش در طی فرآیند طراحی بسیار مفید خواهد بود ، برای پیش نمایش فایل های JRXML می توانیم از ابزار net.sf.jasperreports.view.JasperDesignViewer استفاده کنیم که برنامه ای مبتنی بر Swing و برای پیش نمایش گزارش هاست. برای استفاده از این برنامه به صورت زیر عمل می کنیم :
در داخل پوشه safecompreport فایل جدیدی به نام build.xml ایجاد می کنیم و در داخل آن کد زیر را می نویسیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?xml version="1.0" encoding="UTF-8"?> <project name="JasperReportTest" default="viewJRXML" basedir="."> <import file="base.xml" /> <target name="viewJRXML" description="preview JRXML template"> <java classname= "net.sf.jasperreports.view.JasperDesignViewer" fork="true"> <arg value="-XML" /> <arg value="-F${file.name}.jrxml" /> <classpath refid="classpath" /> </java> </target> </project> |
همانطور که مشاهده می کنید یک target پیش فرض به نام viewJRXML ایجاد کردیم که filename را به عنوان پارامتر ورودی به برنامه net.sf.jasperreports.view.JasperDesignViewer می دهد ، توجه کنید که base.xml در ابتدای این فایل import شده است و filename به نام قالب گزارش (jasper_report_template) اشاره می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <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="jasper_report_template" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <field name="name" class="java.lang.String"> </field> <field name="lastName" class="java.lang.String"> </field> <field name="age" class="java.lang.Integer"> </field> <title> <band height="79"> <staticText> <reportElement mode="Transparent" x="150" y="13" width="267" height="56" forecolor="#00B60D"/> <textElement textAlignment="Center"> <font size="40"/> </textElement> <text><![CDATA[Safecomp.ir]]></text> </staticText> </band> </title> <pageHeader> <band height="35"> <staticText> <reportElement x="10" y="14" width="386" height="20" forecolor="#0033FF" /> <textElement> <font size="14"/> </textElement> <text><![CDATA[Jasper Reports Tutorial by Safeallah Ramezanzadeh]]></text> </staticText> </band> </pageHeader> <columnHeader> <band height="23"> <staticText> <reportElement mode="Opaque" x="0" y="3" width="555" height="20" backcolor="#ff0000" /> </staticText> <staticText> <reportElement mode="Opaque" x="5" y="5" width="150" height="15" backcolor="#00ff00" /> <textElement textAlignment="Center"/> <text><![CDATA[Name :]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="160" y="5" width="235" height="15" backcolor="#0055ff" /> <textElement textAlignment="Center"/> <text><![CDATA[Last Name :]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="400" y="5" width="150" height="15" backcolor="#ffff00" /> <textElement textAlignment="Center"/> <text><![CDATA[Age :]]></text> </staticText> </band> </columnHeader> <detail> <band height="30"> <textField> <reportElement mode="Opaque" x="5" y="5" width="150" height="20" backcolor="#C0F0A8" /> <textElement textAlignment="Center"/> <textFieldExpression class="java.lang.String"><![CDATA[$F{name}]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="160" y="5" width="235" height="20" backcolor="#C0F0A8" /> <textElement textAlignment="Center"/> <textFieldExpression class="java.lang.String"><![CDATA[$F{lastName}]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="400" y="5" width="150" height="20" backcolor="#C0F0A8" /> <textElement textAlignment="Center"/> <textFieldExpression class="java.lang.Integer"><![CDATA[$F{age}]]></textFieldExpression> </textField> </band> </detail> </jasperReport> |
کامپایل :
Java Reports
پس از طراحی قالب کلی گزارش نوبت به کامپایل فایل های jrxml. به فایل های jasper. می رسد.برای این کار دو راه حل وجود دارد :
- یک کد جاوایی بنویسیم که مسئولیت کامپایل را به عهده بگیرد.
- مستقیماً از دستورات ant استفاده کنیم .
در اینجا هر دو روش را بررسی می کنیم :
کامپیال با استفاده از یک برنامه جاوایی :
Java Reports
یک پوشه جدید به نام src در داخل پوشه safecompreport ایجاد می کنیم. در داخل پوشه src فایل جدیدی به نام CompileJRXML2Jasper.java ایجاد می کنیم و در داخل این فایل کد بسیار ساده زیر را می نویسیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 | import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; public class CompileJRXML2Jasper { public static void main(String args[]){ try{ System.out.println("Comipling...."); JasperCompileManager.compileReportToFile("e:/safecompreport/jasper_report_template.jrxml"); System.out.println("Done!"); }catch(Exception ex){ ex.printStackTrace(); } } } |
این فایل مسیر قالب (فایل jrxml.) را گرفته و سپس آن را به فایل jasper. کامپایل می کند. برای اجرای این برنامه باید دستورات جدیدی به فایل build.xml اضافه کنیم. build.xml را به صورت زیر تغییر می دهیم و یک target جدید برای اجرای برنامه CompileJRXML2Jasper.java در آن تعریف می کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="UTF-8"?> <project name="JasperReportTest" default="viewJRXML" basedir="."> <import file="base.xml" /> <target name="viewJRXML" description="preview JRXML template"> <java classname= "net.sf.jasperreports.view.JasperDesignViewer" fork="true"> <arg value="-XML" /> <arg value="-F${file.name}.jrxml" /> <classpath refid="classpath" /> </java> </target> <target name="compileJRXML" depends="compile" description="compile JRXML template"> <java classname= "CompileJRXML2Jasper" fork="true"> <classpath refid="classpath" /> </java> </target> </project> |
فایل های داخل پوشه src همگی کامپایل شده و پوشه classes ایجاد شده و سپس برنامه compileJRXML2Jasper.java اجرا شده و در نهایت فایل jasper_report_template.jasper در داخل پوشه safecompreport ایجاد می شود.(الآن آماده اید که به مرحله اجرا بروید).
کامپایل به صورت مستقیم با استفاده از دستورات ant :
Java Reports
برای کامپایل قالب های JRXML از طریق دستورات ant کتابخانه JasperReports دستور اختصاصی ant ای دارد که مخصوص این کار است.این دستور jrc نامیده می شود و با استفاده از کلاس net.sf.jasperreports.ant.JRAntCompileTask پیاده سازی شده است و نحوه استفاده از آن بسیار شبیه javac است.
قبل از ادامه این بخش بهتر است فایل jasper_report_template.jasper ساخته شده در مرحله قبل را پاک کنید.
فایل build.xml را به صورت زیر تغییر می دهیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?xml version="1.0" encoding="UTF-8"?> <project name="JasperReportTest" default="viewJRXML" basedir="."> <import file="base.xml" /> <target name="viewJRXML" description="preview JRXML template"> <java classname= "net.sf.jasperreports.view.JasperDesignViewer" fork="true"> <arg value="-XML" /> <arg value="-F${file.name}.jrxml" /> <classpath refid="classpath" /> </java> </target> <target name="compileJRXML" depends="compile" description="compile JRXML template"> <java classname= "CompileJRXML2Jasper" fork="true"> <classpath refid="classpath" /> </java> </target> <target name="compilebyAnt" description="Compiles JXML with jrc"> <taskdef name="jrc" classname="net.sf.jasperreports.ant.JRAntCompileTask"> <classpath refid="classpath" /> </taskdef> <jrc destdir="."> <src> <fileset dir="."> <include name="*.jrxml" /> </fileset> </src> <classpath refid="classpath" /> </jrc> </target> </project> |
همانطور که مشاهده می کنید اینبار یک target جدید به نام compilebyAnt تعریف کردیم که از دستور jrc استفاده می کند و تمام فایل های با پسوند jrxml. را به فایل های jasper. کامپایل می کند.
نکته : اگر فایل jrxml. در زمان اجرا ساخته شود (توسط یک برنامه خاص) آنگاه از روش مبتنی بر ant نمی توان استفاده کرد.
اجرا :
Java Reports
در مرحله قبل فایل طراحی (jrxml.) را کامپایل کردیم و الآن وقت آن رسیده که گزارش با داده های خودمان پر کنیم. JasperReports در زمینه منبع داده بسیار انعطاف پذیر است و انواع مختلفی از منابع را می توان برای آن در نظر گرفت ، انواع منابع مختلفی که برای تهیه گزارش در JasperReports می توان استفاده کرد عبارتند از :
- SQL query : یک پرس و جوی مبتنی که بر sql که داده هایی را از پایگاه داده می خواند
- xml : داده ها را می توان از یک فایل xml نیز خواند.
- CSV : داده ها ممکن است در یک فایل csv باشند.
- HQL
- Java Beans
- و …
در اینجا برای سادگی مطلب از Java Beans استفاده می کنیم.
ابتدا یک فایل جدید به نام Person.java در پوشه src ایجاد می کنیم. این فایل نشان دهنده کلاسی برای نگه داری اطلاعات افراد است (شامل نام و نام خانوادگی و سن).
در داخل فایل Person.java کد زیر را می نویسیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public class Person { private String name; private String lastName; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |
در داخل پوشه src فایل دیگری به نام FillData.java ایجاد می کنیم ، این برنامه یک ArrayList از نوع Person ایجاد می کند سپس با فراخوانی متد createData مقداری داده در این لیست قرار می دهد.سپس با فراخوانی متد fillReport داده ها را در داخل گزارش می نویسد که نتیجه این عمل ساخت یک فایل جدید با پسوند jrprint. خواهد بود.
کد FillData.java به صورت زیر خواهد بود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | import java.util.ArrayList; import java.util.HashMap; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; public class FillData { ArrayList<Person> data = new ArrayList<Person>(); public FillData() { createData(); fillReport(); } void createData() { Person ahad = new Person(); ahad.setName("ahad"); ahad.setLastName("birang"); ahad.setAge(14); Person safe = new Person(); safe.setName("safeallah"); safe.setLastName("ramezanzadeh"); safe.setAge(30); Person mehdi = new Person(); mehdi.setName("mehdi"); mehdi.setLastName("akbari"); mehdi.setAge(25); Person navand = new Person(); navand.setName("navand"); navand.setLastName("namiranian"); navand.setAge(10); data.add(ahad); data.add(safe); data.add(mehdi); data.add(navand); } void fillReport() { JRBeanCollectionDataSource jrbcds = new JRBeanCollectionDataSource(data); HashMap map = new HashMap(); try { JasperFillManager.fillReportToFile("e:/safecompreport/jasper_report_template.jasper", map, jrbcds); } catch (Exception ex) { ex.printStackTrace(); } } public static void main(String args[]) { new FillData(); } } |
برای اجرای برنامه FillData.java باید یک target جدید به build.xml اضافه کنیم. فایل build.xml را به صورت زیر تغییر می دهیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <?xml version="1.0" encoding="UTF-8"?> <project name="JasperReportTest" default="viewJRXML" basedir="."> <import file="base.xml" /> <target name="viewJRXML" description="preview JRXML template"> <java classname= "net.sf.jasperreports.view.JasperDesignViewer" fork="true"> <arg value="-XML" /> <arg value="-F${file.name}.jrxml" /> <classpath refid="classpath" /> </java> </target> <target name="compileJRXML" depends="compile" description="compile JRXML template"> <java classname= "CompileJRXML2Jasper" fork="true"> <classpath refid="classpath" /> </java> </target> <target name="compilebyAnt" description="Compiles JXML with jrc"> <taskdef name="jrc" classname="net.sf.jasperreports.ant.JRAntCompileTask"> <classpath refid="classpath" /> </taskdef> <jrc destdir="."> <src> <fileset dir="."> <include name="*.jrxml" /> </fileset> </src> <classpath refid="classpath" /> </jrc> </target> <target name="fillReport" depends="compile" description="fill Report with data"> <java classname= "FillData" fork="true"> <classpath refid="classpath" /> </java> </target> </project> |
همانطور که می بینید target جدید به نام fillReport برنامه FillData.java را اجرا خواهد کرد.
فایل جدیدی به نام jasper_report_template.jrprint در داخل پوشه safecompreport ایجاد می شود.
خروجی :
Java Reports
قالب گزارش را طراحی کردیم ، کامپایل کردیم و سپس آن را با داده های مورد نظر پر کردیم ، نتیجه مراحل قبل یک فایل با پسوند jrprint. بود الآن آماده ایم تا از گزارشمان خروجی بگیریم .
خروجی در JasperReports بسیار انعطاف پذیر است و انواع مختلف خروجی اعم از XLS و HTML و PDF را می توانیم به عنوان خروجی تولید کنیم ولی شاید بد نباشد قبل از گرفتن خروجی فایل نهایی گزارش را یکبار مشاهده کنیم ، برای مشاهده گزارش نهایی می توانیم از ابزار JasperViewer استفاده کنیم. برای استفاده از JasperViewer یک target جدید به build.xml اضافه می کنیم (viewResult) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <?xml version="1.0" encoding="UTF-8"?> <project name="JasperReportTest" default="viewJRXML" basedir="."> <import file="base.xml" /> <target name="viewJRXML" description="preview JRXML template"> <java classname= "net.sf.jasperreports.view.JasperDesignViewer" fork="true"> <arg value="-XML" /> <arg value="-F${file.name}.jrxml" /> <classpath refid="classpath" /> </java> </target> <target name="compileJRXML" depends="compile" description="compile JRXML template"> <java classname= "CompileJRXML2Jasper" fork="true"> <classpath refid="classpath" /> </java> </target> <target name="compilebyAnt" description="Compiles JXML with jrc"> <taskdef name="jrc" classname="net.sf.jasperreports.ant.JRAntCompileTask"> <classpath refid="classpath" /> </taskdef> <jrc destdir="."> <src> <fileset dir="."> <include name="*.jrxml" /> </fileset> </src> <classpath refid="classpath" /> </jrc> </target> <target name="fillReport" depends="compile" description="fill Report with data"> <java classname= "FillData" fork="true"> <classpath refid="classpath" /> </java> </target> <target name="viewResult" description="view Result"> <java classname= "net.sf.jasperreports.view.JasperViewer" fork="true"> <arg value="-F${file.name}.jrprint" /> <classpath refid="classpath" /> </java> </target> </project> |
همانطور که مشاهده می کنید وظیفه این target این است که برنامه net.sf.jasperreports.view.JasperViewer را اجرا کرده و نام فایل با پسوند jrprint. را به عنوان پارامتر به آن ارسال کند.
گرفتن خروجی :
Java Reports
الآن آماده ایم تا از گزارش خروجی بگیریم.می خواهیم در سه قالب متفاوت HTML و PDF و XLS خروجی بگیریم. برای اینکار فایل جدیدی به نام Export.java در داخل پوشه src ایجاد می کنیم و کد زیر را در داخل آن می نویسیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.export.JRXlsExporter; public class Export { public Export(){ try{ String report="e:/safecompreport/jasper_report_template.jrprint"; // export to PDF JasperExportManager.exportReportToPdfFile(report,"e:/safecompreport/pdf_report.pdf"); // export to HTML JasperExportManager.exportReportToHtmlFile(report,"e:/safecompreport/html_report.html"); // 3- export to Excel sheet JRXlsExporter exporter = new JRXlsExporter(); exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME,report); exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,"e:/safecompreport/xls_report.xls"); exporter.exportReport(); }catch(Exception ex){ ex.printStackTrace(); } } public static void main(String args[]){ new Export(); } } |
برای اجرای این برنامه یک target جدید به نام export به build.xml اضافه می کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | <?xml version="1.0" encoding="UTF-8"?> <project name="JasperReportTest" default="viewJRXML" basedir="."> <import file="base.xml" /> <target name="viewJRXML" description="preview JRXML template"> <java classname= "net.sf.jasperreports.view.JasperDesignViewer" fork="true"> <arg value="-XML" /> <arg value="-F${file.name}.jrxml" /> <classpath refid="classpath" /> </java> </target> <target name="compileJRXML" depends="compile" description="compile JRXML template"> <java classname= "CompileJRXML2Jasper" fork="true"> <classpath refid="classpath" /> </java> </target> <target name="compilebyAnt" description="Compiles JXML with jrc"> <taskdef name="jrc" classname="net.sf.jasperreports.ant.JRAntCompileTask"> <classpath refid="classpath" /> </taskdef> <jrc destdir="."> <src> <fileset dir="."> <include name="*.jrxml" /> </fileset> </src> <classpath refid="classpath" /> </jrc> </target> <target name="fillReport" depends="compile" description="fill Report with data"> <java classname= "FillData" fork="true"> <classpath refid="classpath" /> </java> </target> <target name="viewResult" description="view Result"> <java classname= "net.sf.jasperreports.view.JasperViewer" fork="true"> <arg value="-F${file.name}.jrprint" /> <classpath refid="classpath" /> </java> </target> <target name="export" depends="compile" description="Export"> <java classname= "Export" fork="true"> <classpath refid="classpath" /> </java> </target> </project> |
برای اجرای Export.java از طریق خط فرمان به مسیر پوشه safecompreport می رویم و دستور ant export را اجرا می کنیم. سه فایل pdf_report.pdf و html_report.html و xls_report.xls ساخته می شوند که نشان دهنده گزارش هستند.
تا اینجا با چهار مرحله تهیه گزارش در JasperReports آشنا شدیم و توانستیم یک گزارش کامل ایجاد کنیم و خروجی بگیریم. در ادامه با JFreeChart آشنا می شویم.
JFreeChart :
Java Reports
JFreeChart کتابخانه قدرتمندی است که به ما اجازه رسم انواع نمودار های مختلف را می دهد و می توان به صورت جدا نیز از آن استفاده کرد (یعنی الزامی نیست که از JFreeChart حتماً به همراه JasperReports استفاده کنیم). در اینجا نمی توانیم به تفصیل به شرح این کتابخانه بپردازیم در عوض با چند مثال یاد می گیریم چگونه از آن استفاده کنیم.
قبل از ارائه مثل ها باید این کتابخانه را به برنامه اضافه کنیم. برای اینکار به صورت زیر عمل می کنیم :
- JFreeChart را از لینک ارائه شده در بالای مطلب دانلود می کنیم و در جایی از کامپیوترمان آن را از حالت فشرده خارج می کنیم.
- در داخل پوشه safecompreport پوشه خالی جدیدی به نام jfreechart ایجاد می کنیم.
- به محلی که JFreeChart را از حالت فشرده خارج کرده ایم می رویم و پوشه lib را کپی می کنیم و کپی آن را در پوشه jfreechart که ایجاد کرده ایم قرار می دهیم.
- فایل base.xml را به صورت زیر تغییر می دهیم تا فایل های JFreeChart نیز به برنامه اضافه شوند :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?xml version="1.0" encoding="UTF-8"?> <project name="SafecompReport" basedir="."> <description>Jasper Reports Tutorial</description> <property name="file.name" value="jasper_report_template" /> <property name="jasper.dir" value="jasper" /> <property name="dist.dir" value="${jasper.dir}/dist" /> <property name="lib.dir" value="${jasper.dir}/lib" /> <property name="src.dir" value="src" /> <property name="classes.dir" value="classes" /> <path id="classpath"> <pathelement location="./" /> <pathelement location="${classes.dir}" /> <fileset dir="${lib.dir}"> <include name="**/*.jar" /> </fileset> <fileset dir="${dist.dir}"> <include name="**/*.jar" /> </fileset > <fileset dir="jfreechart/lib"> <include name="*.jar" /> </fileset> </path> <target name="compile" depends="clean"> <mkdir dir="${classes.dir}"/> <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" /> </target> <target name="clean"> <delete dir="${classes.dir}" /> </target> </project> |
نمودار دایره ای :
Java Reports
در اولین مثال از این بخش می خواهیم یک نمودار دایره ای با استفاده از JFreeChart رسم کنیم و آن را در داخل گزارش قرار دهیم. اولین قدم این است که قالب گزارش (فایل jasper_report_template.jrxml) را به صورت زیر تغییر دهیم تا جایی برای تصویر در آن ایجاد کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <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="jasper_report_template" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <parameter name="firstChart" class="java.awt.Image"> </parameter> <field name="name" class="java.lang.String"> </field> <field name="lastName" class="java.lang.String"> </field> <field name="age" class="java.lang.Integer"> </field> <title> <band height="79"> <staticText> <reportElement mode="Transparent" x="150" y="13" width="267" height="56" forecolor="#00B60D"/> <textElement textAlignment="Center"> <font size="40"/> </textElement> <text><![CDATA[Safecomp.ir]]></text> </staticText> </band> </title> <pageHeader> <band height="35"> <staticText> <reportElement x="10" y="14" width="386" height="20" forecolor="#0033FF" /> <textElement> <font size="14"/> </textElement> <text><![CDATA[Jasper Reports Tutorial by Safeallah Ramezanzadeh]]></text> </staticText> </band> </pageHeader> <columnHeader> <band height="23"> <staticText> <reportElement mode="Opaque" x="0" y="3" width="555" height="20" backcolor="#ff0000" /> </staticText> <staticText> <reportElement mode="Opaque" x="5" y="5" width="150" height="15" backcolor="#00ff00" /> <textElement textAlignment="Center"/> <text><![CDATA[Name :]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="160" y="5" width="235" height="15" backcolor="#0055ff" /> <textElement textAlignment="Center"/> <text><![CDATA[Last Name :]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="400" y="5" width="150" height="15" backcolor="#ffff00" /> <textElement textAlignment="Center"/> <text><![CDATA[Age :]]></text> </staticText> </band> </columnHeader> <detail> <band height="30"> <textField> <reportElement mode="Opaque" x="5" y="5" width="150" height="20" backcolor="#C0F0A8" /> <textElement textAlignment="Center"/> <textFieldExpression class="java.lang.String"><![CDATA[$F{name}]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="160" y="5" width="235" height="20" backcolor="#C0F0A8" /> <textElement textAlignment="Center"/> <textFieldExpression class="java.lang.String"><![CDATA[$F{lastName}]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="400" y="5" width="150" height="20" backcolor="#C0F0A8" /> <textElement textAlignment="Center"/> <textFieldExpression class="java.lang.Integer"><![CDATA[$F{age}]]></textFieldExpression> </textField> </band> </detail> <summary> <band height="300"> <image hAlign="Center" vAlign="Middle"> <reportElement x="0" y="0" width="555" height="300"/> <imageExpression class="java.lang.String"><![CDATA[$P{firstChart}]]></imageExpression> </image> </band> </summary> </jasperReport> |
اگر دقت کنید مشاهده می کنید که در بالای قالب گزارش یک parameter نام firstChart از نوع java.awt.Image ایجاد کردیم که نشان دهنده این است که پارامتری از نوع تصویر از داخل برنامه به گزارش فرستاده می شود. سپس این تصویر را در بخش summary نمایش می دهیم.
حال باید فایل FillData.java به گونه ای تغییر دهیم که یک نمودار دایره ای با استفاده از JFreeChart ایجاد کند و آن را با اسم firstChart در داخل گزارش قرار دهد. کد FillData.java به صورت زیر خواهد شد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import java.util.ArrayList; import java.util.HashMap; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import org.jfree.chart.JFreeChart; public class FillData { ArrayList<Person> data = new ArrayList<Person>(); public FillData() { createData(); fillReport(); } void createData() { Person ahad = new Person(); ahad.setName("ahad"); ahad.setLastName("birang"); ahad.setAge(14); Person safe = new Person(); safe.setName("safeallah"); safe.setLastName("ramezanzadeh"); safe.setAge(30); Person mehdi = new Person(); mehdi.setName("mehdi"); mehdi.setLastName("akbari"); mehdi.setAge(25); Person navand = new Person(); navand.setName("navand"); navand.setLastName("namiranian"); navand.setAge(10); data.add(ahad); data.add(safe); data.add(mehdi); data.add(navand); } void fillReport() { JRBeanCollectionDataSource jrbcds = new JRBeanCollectionDataSource(data); HashMap map = new HashMap(); try { map.put("firstChart",createFirstChart()); JasperFillManager.fillReportToFile("e:/safecompreport/jasper_report_template.jasper", map, jrbcds); } catch (Exception ex) { ex.printStackTrace(); } } java.awt.Image createFirstChart() { // create a dataset... DefaultPieDataset data = new DefaultPieDataset(); // fill dataset data.setValue("c++",.2); data.setValue("python",.8); data.setValue("php",.12); data.setValue("java",.6); // create a chart with the dataset JFreeChart chart = ChartFactory.createPieChart("Programming Languages", data, true, true, true); // create and return the image return chart.createBufferedImage(500, 220); } public static void main(String args[]) { new FillData(); } } |
متد createFirstChart یک نمودار دایره ای ایجاد می کند و تصویر حاصل از آن را بر می گرداند. در این نمودار دایره چهار زبان برنامه نویسی اضافه کردیم و به هر کدام یک عدد اعشاری معادل درصد آن نسبت دادیم.با استفاده از خط زیر این تصویر را به عنوان پارامتر firstChart در داخل گزارش قرار می دهیم :
1 | map.put("firstChart",createFirstChart()); |
فایل ها را ذخیره می کنیم. از طریق خط فرمان به مسیر safecompreport می رویم ، ابتدا دستور ant compilebyAnt سپس دستور ant fillReport و سپس دستور ant viewResult را اجرا می کنیم.
نمودار میله ای :
Java Reports
قالب گزارش را به صورت زیر تغییر می دهیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <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="jasper_report_template" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <parameter name="firstChart" class="java.awt.Image"> </parameter> <parameter name="secondChart" class="java.awt.Image"> </parameter> <field name="name" class="java.lang.String"> </field> <field name="lastName" class="java.lang.String"> </field> <field name="age" class="java.lang.Integer"> </field> <title> <band height="79"> <staticText> <reportElement mode="Transparent" x="150" y="13" width="267" height="56" forecolor="#00B60D"/> <textElement textAlignment="Center"> <font size="40"/> </textElement> <text><![CDATA[Safecomp.ir]]></text> </staticText> </band> </title> <pageHeader> <band height="35"> <staticText> <reportElement x="10" y="14" width="386" height="20" forecolor="#0033FF" /> <textElement> <font size="14"/> </textElement> <text><![CDATA[Jasper Reports Tutorial by Safeallah Ramezanzadeh]]></text> </staticText> </band> </pageHeader> <columnHeader> <band height="23"> <staticText> <reportElement mode="Opaque" x="0" y="3" width="555" height="20" backcolor="#ff0000" /> </staticText> <staticText> <reportElement mode="Opaque" x="5" y="5" width="150" height="15" backcolor="#00ff00" /> <textElement textAlignment="Center"/> <text><![CDATA[Name :]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="160" y="5" width="235" height="15" backcolor="#0055ff" /> <textElement textAlignment="Center"/> <text><![CDATA[Last Name :]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="400" y="5" width="150" height="15" backcolor="#ffff00" /> <textElement textAlignment="Center"/> <text><![CDATA[Age :]]></text> </staticText> </band> </columnHeader> <detail> <band height="30"> <textField> <reportElement mode="Opaque" x="5" y="5" width="150" height="20" backcolor="#C0F0A8" /> <textElement textAlignment="Center"/> <textFieldExpression class="java.lang.String"><![CDATA[$F{name}]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="160" y="5" width="235" height="20" backcolor="#C0F0A8" /> <textElement textAlignment="Center"/> <textFieldExpression class="java.lang.String"><![CDATA[$F{lastName}]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="400" y="5" width="150" height="20" backcolor="#C0F0A8" /> <textElement textAlignment="Center"/> <textFieldExpression class="java.lang.Integer"><![CDATA[$F{age}]]></textFieldExpression> </textField> </band> </detail> <summary> <band height="420"> <image hAlign="Center" vAlign="Middle"> <reportElement x="0" y="0" width="555" height="200"/> <imageExpression class="java.lang.String"><![CDATA[$P{firstChart}]]></imageExpression> </image> <image hAlign="Center" vAlign="Middle"> <reportElement x="0" y="210" width="555" height="200"/> <imageExpression class="java.lang.String"><![CDATA[$P{secondChart}]]></imageExpression> </image> </band> </summary> </jasperReport> |
فایل FillData.java را نیز به صورت زیر تغییر می دهیم تا یک نمودار میله ای نیز ایجاد کند :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | import java.util.ArrayList; import java.util.HashMap; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import org.jfree.chart.JFreeChart; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.chart.plot.PlotOrientation; public class FillData { ArrayList<Person> data = new ArrayList<Person>(); public FillData() { createData(); fillReport(); } void createData() { Person ahad = new Person(); ahad.setName("ahad"); ahad.setLastName("birang"); ahad.setAge(14); Person safe = new Person(); safe.setName("safeallah"); safe.setLastName("ramezanzadeh"); safe.setAge(30); Person mehdi = new Person(); mehdi.setName("mehdi"); mehdi.setLastName("akbari"); mehdi.setAge(25); Person navand = new Person(); navand.setName("navand"); navand.setLastName("namiranian"); navand.setAge(10); data.add(ahad); data.add(safe); data.add(mehdi); data.add(navand); } void fillReport() { JRBeanCollectionDataSource jrbcds = new JRBeanCollectionDataSource(data); HashMap map = new HashMap(); try { map.put("firstChart",createFirstChart()); map.put("secondChart",createSecondChart()); JasperFillManager.fillReportToFile("e:/safecompreport/jasper_report_template.jasper", map, jrbcds); } catch (Exception ex) { ex.printStackTrace(); } } java.awt.Image createFirstChart() { // create a dataset... DefaultPieDataset data = new DefaultPieDataset(); // fill dataset data.setValue("c++",.2); data.setValue("python",.8); data.setValue("php",.12); data.setValue("java",.6); // create a chart with the dataset JFreeChart chart = ChartFactory.createPieChart("Programming Languages", data, true, true, true); // create and return the image return chart.createBufferedImage(500, 220); } java.awt.Image createSecondChart(){ DefaultCategoryDataset dataset = new DefaultCategoryDataset( ); dataset.addValue( 18 , "ahad" , "java" ); dataset.addValue( 15 , "ahad" , "c++" ); dataset.addValue( 10 , "ahad" , "python" ); dataset.addValue( 20 , "ahad" , "php" ); dataset.addValue( 10 , "navand" , "java" ); dataset.addValue( 11 , "navand" , "c++" ); dataset.addValue( 15 , "navand" , "python" ); dataset.addValue( 14 , "navand" , "php" ); dataset.addValue( 8 , "mehdi" , "java" ); dataset.addValue( 5 , "mehdi" , "c++" ); dataset.addValue( 11 , "mehdi" , "python" ); dataset.addValue( 17 , "mehdi" , "php" ); JFreeChart barChart = ChartFactory.createBarChart("users skills","Category", "Score",dataset,PlotOrientation.VERTICAL,true, true, false); return barChart.createBufferedImage(500,220); } public static void main(String args[]) { new FillData(); } } |
Java Reports Java Reports Java Reports Java Reports Java Reports Java Reports Java Reports Java Reports