ออก report เป็น PDF ด้วย Jasper Report part 1

Phai Panda
4 min readJan 11, 2021

--

ผมพอรู้ภาษา Java อยู่บ้าง งานต้องการให้แสดง report เป็น PDF บทความนี้ผมจึงเขียนขึ้นเพื่อฝึกฝนและทำความเข้าใจว่า Jasper Report Library สามารถทำงานนี้ได้อย่างไร

เชื่อว่าเพื่อนโปรแกรมเมอร์ Java ยุคเก่าน้อยคนจะไม่รู้จัก Jasper Report และตัวเครื่องมือวาด report ของเขาที่ชื่อ iReport ทั้ง Jasper Report Library และ iReport สามารถดาวน์โหลดได้ ที่นี่

สำหรับนักพัฒนารุ่นใหม่ที่พอจะรู้จักภาษา Java การเลือกเขียน report ด้วย Jasper Report ก็เป็นหนทางหนึ่งที่ไม่ลำบากนัก ยังไงน่ะเหรอ? เรียนรู้ไปพร้อมกับผมสิ!

เครื่องมือในการพัฒนา

  • ทำงานบน MS Windows 10
  • JDK 1.7 สำหรับ iReport (เวอร์ชัน 1.8 เป็นต้นไป ผมพบว่าไม่สามารถใช้ run iReport ได้) ดาวน์โหลด ที่นี่
  • JDK 1.8 สำหรับโปรเจกต์ของเรา ดาวน์โหลด ที่นี่
  • IntelliJ IDEA สำหรับพัฒนาโปรเจกต์ของเรา ดาวน์โหลด ที่นี่

ติดตั้ง JDK 1.7 ก่อนแล้วจึงติดตั้ง JDK 1.8

จากนั้นผมกำหนดค่า JAVA_HOME ให้ชี้ไปยัง JDK 1.7 เพื่อให้ iReport เปิดได้

setup JAVA_HOME variable

ตรวจสอบ java -version ต้องได้เวอร์ชัน 1.7

check java version

ทดสอบเปิดโปรแกรม iReport ต้องเปิดได้

try to open iReport

สำหรับมือใหม่ที่ทำได้จนถึงขั้นตอนนี้อาจจะงง ผมขออธิบายเล็กน้อยครับ

กระบวนการพัฒนา

เราจะเขียน Java ให้ไปอ่านไฟล์ที่มีนามสกุล .jrxml ซึ่งรูปแบบของไฟล์คือ XML

ไฟล์ XML นี้เราสามารถสร้างเองได้ครับ จะเขียนด้วย text editor ตัวใดก็ได้ แต่ถ้าเราใช้โปรแกรม iReport มันจะช่วยเขียนไฟล์นี้ให้ ซึ่งช่วยลดเวลาในการพัฒนาไปมากโข

ดูรูปนี้ด้วยกันนะ

jasper report life cycle

รูปข้างต้นคือ Jasper Report Life Cycle ว่าด้วยการสร้างไฟล์สกุล .jrxml ขึ้นมาก่อน จากนั้น compile ด้วย Jasper Report Library แล้วเพิ่มข้อมูลใส่ report (เรียกแหล่งของข้อมูลว่า data source) ก่อนจะ export หรือแปลงให้อยู่ในรูปของไฟล์ผลลัพธ์ที่ต้องการ เลือกได้ไม่ว่าจะเป็น .xml, .html, .pdf, .csv และอื่นๆ

Hello World

ชักคันไม้คันมือแล้วใช่ไหม เอาใจสาย dev ที่ชอบเขียนโค้ดเหมือนกัน เราจะ Hello World เจ้า Jasper Report ด้วยการสร้าง .jrxml ขึ้นมา จากนั้นเปลี่ยนมันให้กลายเป็น .pdf

ไม่รอช้าเปิด IntelliJ IDEA ขึ้นมา เลือก Maven เลือก JDK 1.8

select Maven & JDK 1.8
ไฟล์ pom.xml จะระบุไว้ว่าเราใช้ JDK 1.8

บอกกับมือใหม่ที่ไม่รู้จัก Maven มันคือ build tool หรือง่ายๆว่าผู้ช่วยในการจัดการโปรเจกต์ หัวใจของมันคือไฟล์ pom.xml ที่เอาไว้ระบุว่าจะทำงานกับ Java library ใดบ้างและทำงานอย่างไร

ตัว Maven มี life cycle ที่เราต้องไปเรียนรู้เพิ่มเติมเอาเอง หรืออ่านจากของผมที่เคยศึกษา ที่นี่

Hello World ออก console ธรรมดาดูก่อน

สวัสดีชาวโลก แฮ่!

ถัดไปเราจะสร้างไฟล์ hello.jrxml ไว้ภายในโปรเจกต์ ณ ตำแหน่งนี้

โดยปกติ element สำคัญในไฟล์ XML จะมีการประกาศรายละเอียดการอ้างอิง element ต่างๆในเอกสาร ในที่นี้คือ jasperReport element แต่ไว้ก่อน

ไฟล์ hello.jrxml เขียนเข้าไปแค่นี้พอ

<?xml version="1.0" encoding="UTF-8" ?>
<jasperReport></jasperReport>

จากนั้น search google พิมพ์ไปว่า jasper report maven

คัดลอกผลลัพธ์ที่ได้ไปวางไว้ในไฟล์ pom.xml ในส่วนที่เรียกว่า dependencies

<dependencies>
<dependency>
<groupId>jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>3.5.3</version>
</dependency>
</dependencies>

รูปข้างต้นอย่าลืมกดสัญลักษณ์ m เพื่อบอกกับ Maven ให้โหลด library

จากนั้นกลับไปฟังก์ชัน main เขียนให้โหลดไฟล์

String filePath = "hello.jrxml";
JasperReport jasperReport = JasperCompileManager.compileReport(filePath);

พบ error

Parse Error at line 2 column 15: cvc-complex-type.4: Attribute ‘name’ must appear on element ‘jasperReport’.

มันต้องการ name ใน jasperReport element กลับไปแก้

<jasperReport name="hello"></jasperReport>

รันใหม่

สำเร็จ! รันได้เป็นปกติ

ประเด็นคือเราจะรู้ได้อย่างไรว่า jrxml นั้นมีโครงสร้างประกอบด้วย element ใดบ้าง ในแต่ละแอตทริบิวต์ของ element มีอะไรบ้าง?

อย่างแรกเลยคือกลับไปที่ jasperReport element เราจะประกาศรายละเอียดของเอกสารนี้เพื่อให้เครื่องมือช่วยเขียน (ที่ฉลาดมากพอ) สามารถช่วยตรวจสอบความถูกต้องของ element เหล่านั้น มาดูกัน

search google ไปว่า jrxml doc เลือกผลลัพธ์ที่เป็นของ community.jaspersoft.com

ล้ำค่าที่สุด คงจะปัจจบุันที่สุดเท่าที่หาได้จาก tutorial ในขณะนี้

เลื่อนลงไปด้านล่าง เราจะพบกับรายละเอียดการอ้างอิงที่ว่า

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"

คิดลอกมาแปะที่ hello.jrxml

ทดสอบรันต้องไม่พัง

สำหรับ IntelliJ IDEA ให้เพื่อนๆลองพิมพ์เปิดแท็กก็จะทราบว่าตอนนี้มันรู้แล้วว่า element ใดเขียนได้และใช้แอตทริบิวต์ใดได้บ้าง แจ่มไปเลยใช่ไหมล่ะ

เราได้เดินมาถึงครึ่งทางของบทความ part แรกนี้แล้ว จับสายเป้ให้แน่นหนทางด้านหน้ายังรออยู่

ขอให้เพิ่ม elements ต่อไปนี้แทรกเข้าไปเป็น element ลูกของ jasperReport element

<detail>
<band height="16">
<staticText>
<reportElement x="0" y="0" width="100" height="16" />
<text>Hello World</text>
</staticText>
</band>
</detail>

ที่ hello.jrxml แน่นอนว่าหากทำถูกต้องจะไม่ปรากฏ error ทดสอบรันดูก็ไม่พังด้วย

ย้ายมาฝั่ง Java กันต่อ เพิ่มโค้ดการแปลงให้เป็น pdf ตั้งชื่อว่า hello.pdf

String filePath = "hello.jrxml";
JasperReport jasperReport = JasperCompileManager.compileReport(filePath);
JasperPrint jasperPrint = JasperFillManager.fillReport(
jasperReport,
new HashMap(),
new JREmptyDataSource()
);
JasperExportManager.exportReportToPdfFile(jasperPrint, "hello.pdf");

รันแล้วได้ผลลัพธ์

generate PDF file

ดู PDF ด้วย Google Chrome

สำเร็จ!

part ถัดไปผมจะใช้ iReport มาทำงานเขียน jrxml แทนการเขียน XML เพียวๆ ขอขอบคุณที่ติดตามมาจนจบบทความครับ สวัสดีจ้า

--

--