สอนสร้างรายงานด้วย JasperReports
JasperReports เป็นไลบรารี Java สำหรับออกแบบและสร้างรายงาน โดยกำหนดรูปแบบรายงานในไฟล์ `.jrxml` แล้วเติมข้อมูลจากฐานข้อมูลหรือจากรายการในโค้ด จากนั้นส่งออกเป็น PDF, Excel หรือ HTML บทความนี้จะให้โครงสร้างพื้นฐานของ template และตัวอย่างโค้ดที่สร้างรายงานจากรายการข้อมูล
หมายเหตุการทดสอบ: เครื่องที่ใช้เขียนบทความนี้ไม่มีไลบรารี JasperReports และยังไม่ได้รันโค้ดในบทความ ก่อนใช้งานให้เพิ่มดีเพนเดนซีตามเอกสารของโครงการแล้วทดสอบเอง
สิ่งที่ต้องเตรียม
- JDK 17 ขึ้นไป
- ไลบรารี JasperReports ผ่าน Maven เช่น `net.sf.jasperreports:jasperreports`
- โปรแกรมออกแบบ template เช่น Jaspersoft Studio (ตัวออกแบบแบบลากวาง)
ภาพรวมการทำงาน
ขั้นที่ 1: ออกแบบ template
ไฟล์ `.jrxml` เป็น XML ที่กำหนดฟิลด์ข้อมูล ส่วนหัว รายละเอียด และส่วนท้ายของรายงาน ตัวอย่างฟิลด์
<field name="name" class="java.lang.String"/>
<field name="score" class="java.lang.Integer"/>
ในส่วน `<detail>` ใส่ `textField` ที่อ้างถึง `$F{name}` และ `$F{score}` เพื่อแสดงค่าของแต่ละแถว
ขั้นที่ 2: เตรียมข้อมูลและสร้างรายงาน
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.List;
import java.util.Map;
public class ReportDemo {
public static class Row {
private final String name;
private final int score;
public Row(String name, int score) { this.name = name; this.score = score; }
public String getName() { return name; }
public int getScore() { return score; }
}
public static void main(String[] args) throws Exception {
List<Row> rows = List.of(new Row("สมชาย", 85), new Row("สมหญิง", 72));
JasperReport report = JasperCompileManager.compileReport("scores.jrxml");
JasperPrint print = JasperFillManager.fillReport(report, Map.of(), new JRBeanCollectionDataSource(rows));
JasperExportManager.exportReportToPdfFile(print, "scores.pdf");
}
}
- `compileReport` แปลง `.jrxml` เป็นรูปแบบที่รันได้
- `fillReport` รวม template กับข้อมูลเข้าด้วยกัน
- `exportReportToPdfFile` บันทึกผลเป็นไฟล์ PDF
ข้อผิดพลาดที่มักพบ
- **ชื่อฟิลด์ใน template ไม่ตรงกับ getter ของคลาสข้อมูล:** ชื่อต้องตรงกันทุกตัวอักษร
- **ฟอนต์ภาษาไทยไม่แสดง:** ต้องกำหนดฟอนต์ที่รองรับภาษาไทยใน template และในระบบ
- **ไม่ได้ตั้งค่า encoding:** ตรวจว่าไฟล์ `.jrxml` และข้อความในโค้ดเป็น UTF-8
ขั้นต่อไป
ลองเพิ่มกลุ่มข้อมูลในรายงาน เช่น รวมคะแนนแยกตามวิชา หรือใช้พารามิเตอร์ส่งชื่อโรงเรียนเข้าไปในรายงาน
สรุป
JasperReports แยกการออกแบบรายงานออกจากข้อมูล template กำหนดหน้าตา โค้ดเติมข้อมูล และส่งออกเป็นไฟล์ที่ต้องการ การแยกส่วนนี้ทำให้ปรับแบบรายงานได้โดยไม่ต้องแก้โค้ดหลัก