JasperReports একাধিক subreports তৈরি করার জন্য একটি শক্তিশালী রিপোর্টিং টুল। আপনি যখন মূল রিপোর্টে বিভিন্ন রিপোর্ট যোগ করতে চান, তখন আপনি subreports ব্যবহার করতে পারেন। এই subreports মূল রিপোর্টের অন্তর্ভুক্ত অংশ হিসাবে কাজ করে এবং প্রতিটি subreport এর নিজস্ব ডেটা সোর্স, ফিল্ড, এবং লেআউট থাকতে পারে।
এছাড়াও, আপনি nested subreports ব্যবহার করে একাধিক স্তরের রিপোর্ট তৈরি করতে পারেন। এটি তখন ব্যবহৃত হয় যখন একটি subreport অন্য একটি subreport-কে অন্তর্ভুক্ত করে।
এখানে আমরা দেখব multiple subreports এবং nested subreports কিভাবে JasperReports-এ তৈরি ও হ্যান্ডল করা যায়।
ধাপ ১: Multiple Subreports তৈরি করা
1.1. Subreport Model তৈরি করা
ধরা যাক, আমাদের মূল রিপোর্টে Employee তথ্য দেখানো হবে এবং প্রতিটি Employee এর জন্য একটি Project রিপোর্ট তৈরি করা হবে। প্রথমে একটি subreport তৈরি করি, যেখানে কর্মচারী প্রতি প্রকল্পের তথ্য থাকবে।
Employee Subreport (EmployeeReport.jrxml)
<?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="EmployeeReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<!-- Employee Fields -->
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="department" class="java.lang.String"/>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="50" height="20"/>
<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="60" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="270" y="0" width="150" height="20"/>
<textFieldExpression><![CDATA[$F{department}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এটি একটি সাধারণ Employee রিপোর্ট যেখানে id, name, এবং department ফিল্ড ব্যবহার করা হয়েছে।
1.2. Main Report-এ Subreport অন্তর্ভুক্ত করা
এখন, মূল রিপোর্টে EmployeeReport subreport অন্তর্ভুক্ত করা হবে। মূল রিপোর্টের জন্য subreport ফাইলের রেফারেন্স যোগ করতে হবে।
<?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="MainReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<parameter name="EmployeeDataSource" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource"/>
<!-- Main Report Fields -->
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="department" class="java.lang.String"/>
<!-- Subreport Integration -->
<subreport>
<reportElement x="0" y="20" width="555" height="200"/>
<subreportExpression><![CDATA["EmployeeReport.jasper"]]></subreportExpression>
<dataSourceExpression><![CDATA[$P{EmployeeDataSource}]]></dataSourceExpression>
</subreport>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="50" height="20"/>
<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="60" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="270" y="0" width="150" height="20"/>
<textFieldExpression><![CDATA[$F{department}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এখানে, মূল রিপোর্টের মধ্যে subreportExpression ব্যবহার করা হয়েছে, যা আমাদের EmployeeReport.jasper ফাইলকে রেফারেন্স করবে। EmployeeDataSource প্যারামিটার দ্বারা subreport-এ ডেটা পাঠানো হবে।
1.3. Java কোডে Subreport Render করা
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JasperReportsMultipleSubreportsExample {
public static void main(String[] args) {
try {
// Sample Employee Data
List<Employee> employees = new ArrayList<>();
employees.add(new Employee(1, "John Doe", "HR"));
employees.add(new Employee(2, "Jane Smith", "Finance"));
// JRBeanCollectionDataSource for Employee data
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(employees);
// Compile the main report and subreport
JasperReport mainReport = JasperCompileManager.compileReport("MainReport.jrxml");
JasperReport subReport = JasperCompileManager.compileReport("EmployeeReport.jrxml");
// Parameters for the main report
Map<String, Object> parameters = new HashMap<>();
parameters.put("EmployeeDataSource", dataSource);
// Fill the report
JasperPrint jasperPrint = JasperFillManager.fillReport(mainReport, parameters, new JREmptyDataSource());
// Export the report to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "MainReportWithSubreports.pdf");
System.out.println("Report Generated with Multiple Subreports!");
} catch (JRException e) {
e.printStackTrace();
}
}
}
এখানে, JasperCompileManager.compileReport এর মাধ্যমে প্রধান রিপোর্ট এবং subreport কম্পাইল করা হয়, এবং পরে JasperFillManager.fillReport দ্বারা রিপোর্টটি পূর্ণ করা হয়। রিপোর্টটি PDF ফরম্যাটে এক্সপোর্ট করা হচ্ছে।
ধাপ ২: Nested Subreport তৈরি করা
Nested Subreport হল একটি subreport যা অন্য একটি subreport এর মধ্যে থাকে। উদাহরণস্বরূপ, প্রতিটি Employee এর জন্য আমরা একটি subreport তৈরি করতে পারি যা তাদের প্রকল্পের (Projects) তালিকা দেখাবে।
Nested Subreport উদাহরণ:
- Main Report: প্রধান রিপোর্ট যেখানে Employee রিপোর্ট এবং তার প্রকল্পের (Projects) রিপোর্ট অন্তর্ভুক্ত থাকবে।
- Project Subreport: Employee এর প্রকল্প সম্পর্কিত রিপোর্ট।
Nested Subreport: Employee Report (with Project Subreport)
<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="EmployeeReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<subreport>
<reportElement x="0" y="20" width="555" height="200"/>
<subreportExpression><![CDATA["ProjectReport.jasper"]]></subreportExpression>
<dataSourceExpression><![CDATA[$F{projectsDataSource}]]></dataSourceExpression>
</subreport>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="50" height="20"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এখানে, subreportExpression এর মধ্যে একটি নতুন subreport যোগ করা হয়েছে, যা ProjectReport.jasper থেকে প্রকল্পের তথ্য দেখাবে।
- Multiple Subreports: আপনি একটি মূল রিপোর্টের মধ্যে একাধিক subreport অন্তর্ভুক্ত করতে পারেন, যেখানে প্রতিটি subreport নিজস্ব রিপোর্ট তৈরি করতে সক্ষম।
- Nested Subreports: আপনি nested subreports ব্যবহার করে একাধিক স্তরের রিপোর্ট তৈরি করতে পারেন। একটি subreport অন্য একটি subreport অন্তর্ভুক্ত করতে পারে, যা রিপোর্টের কাঠামোকে আরো জটিল এবং বিস্তারিত করতে সাহায্য করে।
- Java Integration: JasperReports এর সাথে Java অ্যাপ্লিকেশন ইন্টিগ্রেট করে আপনি ডায়নামিকভাবে ডেটা পাঠাতে এবং রিপোর্টগুলি প্রজেক্টে রেন্ডার করতে পারেন।
- Exporting: JasperReports-এর মাধ্যমে তৈরি রিপোর্টগুলো বিভিন্ন ফরম্যাটে এক্সপোর্ট করা যায়, যেমন PDF, HTML, Excel (XLS), CSV, ইত্যাদি।
JasperReports এর মাধ্যমে subreports এবং nested subreports তৈরি করা একটি শক্তিশালী টুল যা business reporting এবং data visualization কাজকে সহজতর করে।
Read more