รายงานส่วน

เราจะกล่าวถึงโครงสร้างของแม่แบบรายงานที่เรียบง่ายในบทเริ่มต้น ในบรรทัดที่คล้ายกัน 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> จะแสดงในรายงานเท่านั้นหากมีมากกว่าหนึ่งคอลัมน์