รายงานส่วน
เราจะกล่าวถึงโครงสร้างของแม่แบบรายงานที่เรียบง่ายในบทเริ่มต้น ในบรรทัดที่คล้ายกัน JasperReports จัดโครงสร้างเทมเพลตรายงานออกเป็นหลายส่วน ส่วนคือส่วนของรายงานที่มีความสูงที่ระบุและสามารถมีออบเจ็กต์รายงานเช่นเส้นสี่เหลี่ยมรูปภาพหรือฟิลด์ข้อความ
เอ็นจินรายงานวนซ้ำผ่านเร็กคอร์ดเสมือนของแหล่งข้อมูลรายงานที่ให้มา ณ เวลากรอกรายงาน ขึ้นอยู่กับลักษณะการทำงานที่กำหนดไว้ของแต่ละส่วนจากนั้นเครื่องมือจะแสดงผลรายงานแต่ละส่วนตามความเหมาะสม ตัวอย่างเช่นส่วนรายละเอียดจะแสดงผลสำหรับแต่ละระเบียนในแหล่งข้อมูล เมื่อเกิดการแบ่งหน้าส่วนหัวของหน้าและส่วนท้ายของหน้าจะแสดงผลตามต้องการ
ใน JasperReports คำศัพท์และส่วนรายงานเรียกอีกอย่างว่า report bands. ส่วนประกอบด้วยวงดนตรีอย่างน้อยหนึ่งวง ส่วนเหล่านี้จะกรอกข้อมูลซ้ำ ๆ ในเวลาสร้างรายงานและเตรียมเอกสารขั้นสุดท้าย
ส่วนหลัก
เทมเพลตรายงานใน JasperReports มีส่วนหลักดังต่อไปนี้ -
<title></title>
<pageheader></pageheader>
<columnheader></columnheader>
<groupheader></groupheader>
<detail></detail>
<groupfooter></groupfooter>
<columnfooter></columnfooter>
<pagefooter></pagefooter>
<lastpagefooter></lastpagefooter>
<summary></summary>
<nodata></nodata>
<background></background>
ตารางต่อไปนี้สรุปแต่ละส่วน -
ส. อบจ | ส่วนและคำอธิบาย |
---|---|
1 | Title ส่วนนี้จะปรากฏเพียงครั้งเดียวที่จุดเริ่มต้นของรายงาน |
2 | Page Header ส่วนนี้จะปรากฏที่จุดเริ่มต้นของแต่ละหน้าในเอกสารที่สร้างขึ้น |
3 | Column Header ส่วนนี้ปรากฏที่จุดเริ่มต้นของแต่ละคอลัมน์ในเอกสารที่สร้างขึ้น หากรายงานมีการกำหนดเพียงคอลัมน์เดียวส่วนหัวคอลัมน์และส่วนท้ายจะถูกละเว้น |
4 | Group Header ส่วนนี้แนะนำโดยกลุ่มรายงาน ( กลุ่มบท) ทุกครั้งที่นิพจน์การจัดกลุ่มเปลี่ยนค่าส่วนหัวของกลุ่มจะพิมพ์อยู่เหนือส่วนรายละเอียด ในกรณีถ้ามีการกำหนดมากกว่าหนึ่งกลุ่มส่วนหัวของกลุ่มจะถูกพิมพ์ตามลำดับของนิยามกลุ่ม |
5 | Detail ส่วนนี้จะทำซ้ำสำหรับแต่ละบรรทัดของข้อมูลที่มาจากแหล่งข้อมูลของรายงาน ส่วนรายละเอียดสามารถสร้างได้จากหลายแถบ |
6 | Group Footer ส่วนนี้แนะนำโดยกลุ่มรายงาน ( กลุ่มบท) ส่วนท้ายกระดาษของกลุ่มจะพิมพ์อยู่ด้านล่างส่วนรายละเอียดก่อนที่ค่าของนิพจน์การจัดกลุ่มจะเปลี่ยนไป ส่วนท้ายของกลุ่มจะถูกพิมพ์สำหรับบรรทัดสุดท้ายของข้อมูลในแหล่งข้อมูลเสมอ ในกรณีถ้ามีการกำหนดมากกว่าหนึ่งกลุ่มส่วนท้ายของกลุ่มจะถูกพิมพ์ในลำดับย้อนกลับของนิยามกลุ่ม |
7 | Column Footer ส่วนนี้จะปรากฏที่ด้านล่างของแต่ละคอลัมน์ หากจำนวนคอลัมน์ของรายงานเท่ากับ 1 ส่วนหัวคอลัมน์และส่วนท้ายจะถูกละเว้น |
8 | Page Footer ส่วนนี้จะปรากฏที่ด้านล่างของแต่ละหน้า |
9 | Last Page Footer ส่วนนี้จะแทนที่ส่วนท้ายของหน้าปกติในหน้าสุดท้ายของรายงาน ในกรณีที่มีส่วนสรุปอยู่ด้วยดังนั้นนี่อาจไม่ใช่หน้าสุดท้ายของเอกสาร บางครั้งส่วนนี้จะมีประโยชน์เมื่อต้องแสดงข้อมูลสรุปที่ด้านล่างของหน้าสุดท้าย |
10 | Summary ส่วนนี้จะปรากฏเพียงครั้งเดียวในตอนท้ายของรายงาน |
11 | No Data ในส่วนนี้จะมีการพิมพ์เมื่อเมื่อพิมพ์รายงานไม่พบข้อมูลการตั้งค่าคุณสมบัติไม่มีข้อมูลมาตรา หากส่วน <noData> ถูกกำหนดไว้ในเทมเพลตรายงานและหากแหล่งข้อมูลว่างเปล่าส่วน <noData> จะเป็นส่วนเดียวที่นำมาพิจารณาในเวลาเติมข้อมูลและเนื้อหาจะสร้างเอาต์พุตรายงาน |
12 | Background ส่วนพื้นหลังจะแสดงในทุกหน้าและไม่สามารถล้นไปยังหน้าถัดไปได้ องค์ประกอบที่วางในส่วนนี้จะได้รับการประเมิน ณ เวลาเริ่มต้นของเพจและจะแสดงในพื้นหลัง ออบเจ็กต์หน้าอื่น ๆ ทั้งหมดจะแสดงที่ด้านบนของวัตถุพื้นหลัง ส่วนนี้มีประโยชน์สำหรับการสร้างลายน้ำของเพจ |
มาตราองค์ประกอบและความสัมพันธ์ของแอตทริบิวต์
แผนภาพต่อไปนี้แสดงความสัมพันธ์ขององค์ประกอบและแอตทริบิวต์ในส่วนของรายงาน
องค์ประกอบของส่วน
ส่วนรายงานที่กล่าวถึงข้างต้นทั้งหมดเป็นทางเลือก แต่เทมเพลตรายงานใด ๆ จะมีส่วนดังกล่าวอย่างน้อยหนึ่งส่วน แต่ละส่วนเหล่านี้ประกอบด้วย <band> เป็นองค์ประกอบย่อยเพียงอย่างเดียว ก <band> สามารถมีองค์ประกอบย่อยต่อไปนี้เป็นศูนย์หรือมากกว่า -
<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> หรือ <elementGroup>
แต่ละองค์ประกอบเหล่านี้ต้องมี <reportElement> เป็นองค์ประกอบแรก (ยกเว้น elementGroup) ก <reportElement> กำหนดวิธีการจัดวางข้อมูลสำหรับองค์ประกอบนั้น ๆ ไม่เหมือนกับตัวแปรและพารามิเตอร์องค์ประกอบรายงานไม่จำเป็นต้องมีชื่อเพราะโดยปกติคุณไม่จำเป็นต้องได้รับองค์ประกอบใด ๆ ภายในเทมเพลตรายงาน
ตารางด้านล่างสรุปคุณลักษณะของ <reportElement> -
แอตทริบิวต์ | คำอธิบาย | ค่าที่ถูกต้อง |
---|---|---|
x | ระบุพิกัด x ขององค์ประกอบวงดนตรี | ค่าจำนวนเต็มระบุพิกัด x ขององค์ประกอบเป็นพิกเซล ต้องระบุแอตทริบิวต์นี้ |
ย | ระบุพิกัด y ขององค์ประกอบวงดนตรี | ค่าจำนวนเต็มระบุพิกัด y ขององค์ประกอบเป็นพิกเซล ต้องระบุแอตทริบิวต์นี้ |
ความกว้าง | ระบุความกว้างขององค์ประกอบวงดนตรี | ค่าจำนวนเต็มระบุความกว้างขององค์ประกอบเป็นพิกเซล ต้องระบุแอตทริบิวต์นี้ |
ความสูง | ระบุความสูงขององค์ประกอบวงดนตรี | ค่าจำนวนเต็มแสดงความสูงขององค์ประกอบเป็นพิกเซล ต้องระบุแอตทริบิวต์นี้ |
สำคัญ | ตัวระบุเฉพาะขององค์ประกอบวงดนตรี | ค่าสตริงที่ไม่ซ้ำกัน |
StretchType | ระบุว่าองค์ประกอบยืดออกอย่างไรเมื่อแถบที่มีอยู่ยืดออก | NoStretch (default) - องค์ประกอบจะไม่ยืดออก RelativeToTallestObject - องค์ประกอบจะยืดออกเพื่อรองรับวัตถุที่สูงที่สุดในกลุ่ม RelativeToBand - องค์ประกอบจะยืดออกให้พอดีกับความสูงของวง |
positionType | ระบุตำแหน่งขององค์ประกอบเมื่อวงดนตรียืดออก | Float - องค์ประกอบจะเคลื่อนที่ขึ้นอยู่กับขนาดขององค์ประกอบโดยรอบ FixRelativeToTop (default) - องค์ประกอบจะรักษาตำแหน่งคงที่เทียบกับด้านบนของวงดนตรี FixRelativeToBottom - องค์ประกอบจะรักษาตำแหน่งคงที่โดยสัมพันธ์กับด้านล่างของวงดนตรี |
isPrintRepeatedValues | ระบุว่าพิมพ์ค่าซ้ำหรือไม่ | true (default) - ระบบจะพิมพ์ค่าซ้ำ false - ค่าที่ซ้ำกันจะไม่ถูกพิมพ์ |
โหมด | ระบุโหมดพื้นหลังขององค์ประกอบ | ทึบแสงโปร่งใส |
isRemoveLineWhenBlank | ระบุว่าควรลบองค์ประกอบหรือไม่เมื่อว่างและไม่มีองค์ประกอบอื่นในพื้นที่แนวนอนเดียวกัน | ถูกผิด |
isPrintInFirstWholeBand | ระบุว่าองค์ประกอบต้องพิมพ์เป็นวงดนตรีทั้งหมดหรือไม่นั่นคือวงดนตรีที่ไม่ได้แบ่งระหว่างหน้ารายงานหรือคอลัมน์ | ถูกผิด |
isPrintWhenDetailOverFlows | ระบุว่าองค์ประกอบจะถูกพิมพ์เมื่อวงดนตรีล้นไปยังหน้าหรือคอลัมน์ใหม่ | ถูกผิด |
printWhenGroupChanges | ระบุว่าองค์ประกอบจะถูกพิมพ์เมื่อกลุ่มที่ระบุเปลี่ยนไป | ค่าสตริง |
forecolor | ระบุสีพื้นหน้าขององค์ประกอบ | ทั้งค่า RGB เลขฐานสิบหกที่นำหน้าด้วยอักขระ # หรือค่าที่กำหนดไว้ล่วงหน้าอย่างใดอย่างหนึ่งต่อไปนี้: ดำ, น้ำเงิน, ฟ้า, darkGray, เทา, เขียว, lightGray, ม่วงแดง, ส้ม, ชมพู, แดง, เหลือง, ขาว |
backcolor | ระบุสีพื้นหลังขององค์ประกอบ | เหมือนกับค่าที่ถูกต้องสำหรับforecolor |
แอตทริบิวต์ส่วน
ต่อไปนี้เป็นคุณลักษณะของส่วนรายงาน -
ความสูง
ความสูงของส่วนจะระบุความสูงเป็นพิกเซลสำหรับส่วนนั้น ๆ และมีความสำคัญมากในการออกแบบรายงานโดยรวม
พิมพ์เมื่อนิพจน์
นิพจน์บูลีนที่กำหนดว่าควรพิมพ์ส่วนหรือไม่
อนุญาตให้แยก
แฟล็กที่ระบุว่าส่วนนั้นได้รับอนุญาตให้แบ่งเมื่อไม่พอดีกับเพจปัจจุบันหรือไม่ หากเป็นจริงส่วนจะถูกโอนไปยังหน้าถัดไป โปรดทราบว่าในกรณีที่ส่วนนั้นไม่พอดีกับหน้าถัดไปส่วนนั้นจะถูกแบ่งออกโดยไม่คำนึงถึงค่าของธง SplitTypeสามารถรับค่าต่อไปนี้ -
SplitType = "Stretch:"แยกเนื้อหาที่ยืดออก หากส่วนขยายบนหน้าปัจจุบัน (หากพื้นที่ว่างน้อยกว่าความสูงที่ประกาศไว้) พื้นที่ที่เพิ่มไปยังความสูงเดิมจะได้รับอนุญาตให้แบ่งไปยังหน้าถัดไป
splitType = "ป้องกัน:"ป้องกันการแยกในครั้งแรก หากส่วนไม่พอดีกับหน้าถัดไปการแบ่งจะเกิดขึ้นตามปกติเนื่องจากการป้องกันการแยกแถบจะมีผลเฉพาะในการพยายามแยกครั้งแรกเท่านั้น
SplitType = "ทันที:"แยกทันที วงดนตรีได้รับอนุญาตให้แยกที่ใดก็ได้ยกเว้นด้านบนซึ่งเป็นองค์ประกอบที่อยู่บนสุด
ตัวอย่าง
เพื่อสาธิตแต่ละส่วนให้เขียนเทมเพลตรายงาน (jasper_report_template.jrxml) บันทึกไฟล์นี้เป็นC:\tools\jasperreports-5.0.1\testไดเรกทอรี ในไฟล์นี้เราจะแสดงข้อความในแต่ละส่วน (เราจะกล่าวถึงข้างต้น) เนื้อหาของไฟล์มีดังต่อไปนี้ -
<?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 = "jasper_report_template" pageWidth = "300" pageHeight = "300"
columnWidth = "300" leftMargin = "0" rightMargin = "0"
topMargin = "0" bottomMargin = "0" >
<title>
<band height = "50">
<textField>
<reportElement x = "100" y = "16" width = "100" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Title"]]>
</textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height = "40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20"/>
<textElement>
<font isBold = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Page Header"]]>
</textFieldExpression>
</textField>
</band>
</pageHeader>
<columnHeader>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement>
<font isItalic = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Column Header"]]>
</textFieldExpression>
</textField>
</band>
</columnHeader>
<detail>
<band height ="40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20" backcolor = "#99CCFF"/>
<textElement/>
<textFieldExpression>
<![CDATA["Report Details"]]>
</textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Column Footer"]]>
</textFieldExpression>
</textField>
</band>
</columnFooter>
<pageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</pageFooter>
<lastPageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Last Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</lastPageFooter>
<summary>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Summary"]]>
</textFieldExpression>
</textField>
</band>
</summary>
</jasperReport>
รหัส java เพื่อเติมและสร้างรายงานมีให้ด้านล่าง มาบันทึกไฟล์นี้กันJasperReportFill.java ไปยังไดเร็กทอรี C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint
package com.tutorialspoint;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
public class JasperReportFill {
public static void main(String[] args) {
String sourceFileName = "C://tools/jasperreports-5.0.1/test/" +
"jasper_report_template.jasper";
try {
JasperFillManager.fillReportToFile(sourceFileName, null,
new JREmptyDataSource());
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ที่นี่เราใช้อินสแตนซ์ของ JREmptyDataSource เมื่อกรอกรายงานเพื่อจำลองแหล่งข้อมูลที่มีระเบียนเดียวอยู่ในนั้น แต่ฟิลด์ทั้งหมดในระเบียนเดียวนี้เป็นค่าว่าง
การสร้างรายงาน
เราจะรวบรวมและเรียกใช้ไฟล์ข้างต้นโดยใช้กระบวนการสร้าง ANT ปกติของเรา เนื้อหาของไฟล์ build.xml (บันทึกภายใต้ไดเร็กทอรี C: \ tools \ jasperreports-5.0.1 \ test) มีดังต่อไปนี้
ไฟล์อิมพอร์ต - baseBuild.xml ถูกเลือกจากบทEnvironment Setupและควรอยู่ในไดเร็กทอรีเดียวกับ build.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<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>
ต่อไปให้เปิดหน้าต่างบรรทัดคำสั่งและไปที่ไดเร็กทอรีที่วาง build.xml สุดท้ายรันคำสั่งant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport เป็นเป้าหมายเริ่มต้น) ดังนี้ -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
warning: 'includeantruntime' was not set, defau
[javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes
compilereportdesing:
[jrc] Compiling 1 report design files.
[jrc] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFac
[jrc] log4j:WARN Please initialize the log4j system properly.
[jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
[echo] Runnin class : com.tutorialspoint.JasperReportFill
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 18 minutes 22 seconds
จากการรวบรวมข้างต้นหน้าต่าง JasperViewer จะเปิดขึ้นตามหน้าจอด้านล่าง -
ที่นี่เราจะเห็นข้อความถูกพิมพ์ออกมาในแต่ละส่วน เป็นที่น่าสังเกตว่าเนื่องจาก JRXML มีองค์ประกอบ <lastPageFooter> จึงจะแสดงในหน้าสุดท้ายของรายงานแทนที่จะแสดงองค์ประกอบ <pageFooter> องค์ประกอบ <columnHeader> และ <columnFooter> จะแสดงในรายงานเท่านั้นหากมีมากกว่าหนึ่งคอลัมน์