Dynamic Report Generation হল এমন একটি প্রক্রিয়া যার মাধ্যমে রিপোর্টগুলো রানটাইমে তৈরি করা হয়, অর্থাৎ রিপোর্টের কাঠামো এবং ডেটা নির্ভর করে ব্যবহারকারীর ইনপুট বা ডেটা সোর্সের ওপর। এটি স্ট্যাটিক রিপোর্টের থেকে আলাদা, যেখানে রিপোর্ট আগে থেকেই প্রস্তুত থাকে। JasperReports-এ Dynamic Report Generation-এ ডেটা এবং রিপোর্টের কাঠামো সময় অনুযায়ী পরিবর্তিত হতে পারে।
JasperReports-এর মাধ্যমে Dynamic Report Generation-এর জন্য JRXML ফাইলটি পরিবর্তন বা তৈরি করা যায়, এবং রিপোর্টটি কাস্টম ডেটা সোর্স থেকে তৈরি করা যায়। ডাইনামিক রিপোর্ট তৈরির জন্য সাধারণত Java code, JasperReports API, এবং XML templates ব্যবহার করা হয়।
Dynamic Report Generation-এর ধাপ
1. Data Source:
- Dynamic রিপোর্ট তৈরি করার জন্য প্রথমে ডেটা সোর্স তৈরি করতে হবে। এটি হতে পারে JDBC, JavaBeans, CSV, বা XML ফাইল।
2. Dynamic JRXML Creation:
- JRXML ফাইল (JasperReports Markup Language) একটি XML ফাইল যেখানে রিপোর্টের লেআউট, স্টাইল, এবং কনটেন্ট ডিফাইন করা থাকে।
- Dynamic রিপোর্টের ক্ষেত্রে, JRXML তৈরি বা কাস্টমাইজ করার জন্য Java code ব্যবহার করা যেতে পারে।
3. Compiling JRXML:
- JasperCompileManager.compileReportToFile() এর মাধ্যমে JRXML ফাইলটি .jasper ফরম্যাটে কম্পাইল করা হয়।
4. Filling the Report:
- JasperFillManager.fillReport() ব্যবহার করে রিপোর্টে ডেটা ফিল করা হয়। রিপোর্টটি ফিল করার সময় parameters এবং data source ব্যবহার করা হয়।
5. Exporting the Report:
- রিপোর্টটি রেন্ডার করার জন্য বিভিন্ন ফরম্যাটে JasperExportManager ব্যবহার করা হয় (যেমন PDF, HTML, Excel, CSV)।
Dynamic Report Generation Example in JasperReports
ধরা যাক, আপনি একটি Sales Report তৈরি করতে চান, যেখানে রিপোর্টের ডেটা এবং কাঠামো কাস্টম ইনপুট বা রানটাইম ডেটা সোর্সের উপর নির্ভরশীল।
Step 1: Create Dynamic JRXML with Java Code
Dynamic JRXML Creation Using Java Code:
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import java.util.*;
public class DynamicReportGeneration {
public static void main(String[] args) {
try {
// Step 1: Prepare Dynamic JRXML content as a String (or use existing JRXML file)
String jrxmlContent = createDynamicJRXML();
// Step 2: Compile JRXML to JasperReport
JasperReport jasperReport = JasperCompileManager.compileReport(jrxmlContent);
// Step 3: Prepare Data Source (For example, using a collection of JavaBeans)
List<Product> products = getProducts(); // Assume getProducts() provides a list of product data
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(products);
// Step 4: Fill the report with data
Map<String, Object> parameters = new HashMap<>();
parameters.put("ReportTitle", "Dynamic Sales Report");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
// Step 5: Export the report to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "DynamicSalesReport.pdf");
} catch (Exception e) {
e.printStackTrace();
}
}
private static String createDynamicJRXML() {
// Dynamically creating JRXML as a String (for simplicity)
String 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/jasperreports.xsd\" "
+ "name=\"DynamicSalesReport\" pageWidth=\"595\" pageHeight=\"842\" "
+ "columnWidth=\"515\" leftMargin=\"40\" rightMargin=\"40\" "
+ "topMargin=\"40\" bottomMargin=\"40\">"
+ "<title>"
+ "<band height=\"60\">"
+ "<textField>"
+ "<reportElement x=\"0\" y=\"0\" width=\"515\" height=\"50\"/>"
+ "<textFieldExpression><![CDATA[\"Dynamic Sales Report\"]]"
+ "</textFieldExpression>"
+ "</textField>"
+ "</band>"
+ "</title>"
+ "<columnHeader>"
+ "<band height=\"40\">"
+ "<textField>"
+ "<reportElement x=\"0\" y=\"0\" width=\"100\" height=\"30\"/>"
+ "<textFieldExpression><![CDATA[\"Product Name\"]]</textFieldExpression>"
+ "</textField>"
+ "<textField>"
+ "<reportElement x=\"100\" y=\"0\" width=\"100\" height=\"30\"/>"
+ "<textFieldExpression><![CDATA[\"Price\"]]</textFieldExpression>"
+ "</textField>"
+ "</band>"
+ "</columnHeader>"
+ "<detail>"
+ "<band height=\"30\">"
+ "<textField>"
+ "<reportElement x=\"0\" y=\"0\" width=\"100\" height=\"30\"/>"
+ "<textFieldExpression><![CDATA[$F{productName}]]></textFieldExpression>"
+ "</textField>"
+ "<textField>"
+ "<reportElement x=\"100\" y=\"0\" width=\"100\" height=\"30\"/>"
+ "<textFieldExpression><![CDATA[$F{price}]]></textFieldExpression>"
+ "</textField>"
+ "</band>"
+ "</detail>"
+ "</jasperReport>";
return jrxml;
}
// Example method to fetch product data
private static List<Product> getProducts() {
List<Product> products = new ArrayList<>();
products.add(new Product("Product 1", 50.0));
products.add(new Product("Product 2", 100.0));
return products;
}
}
class Product {
private String productName;
private Double price;
public Product(String productName, Double price) {
this.productName = productName;
this.price = price;
}
public String getProductName() {
return productName;
}
public Double getPrice() {
return price;
}
}
Explanation:
- Dynamic JRXML Creation: createDynamicJRXML() মেথডে একটি JRXML ফাইল কনফিগার করা হয়েছে, যা
Product NameএবংPriceনিয়ে একটি ডাইনামিক রিপোর্ট তৈরি করবে। - Data Source: ডেটা সোর্স হিসেবে JRBeanCollectionDataSource ব্যবহার করা হয়েছে, যা Product ক্লাসের একটি List ব্যবহার করে রিপোর্টে ডেটা প্রবাহিত করবে।
- Filling the Report: JasperFillManager.fillReport() ব্যবহার করে রিপোর্টের মধ্যে ডেটা এবং প্যারামিটারগুলো পূর্ণ করা হয়েছে।
- Exporting to PDF: JasperExportManager.exportReportToPdfFile() ব্যবহার করে রিপোর্টটিকে PDF ফরম্যাটে এক্সপোর্ট করা হয়েছে।
Dynamic Reports with Conditional Logic
JasperReports-এ conditional logic ব্যবহার করে আপনি রিপোর্টের কনটেন্ট এবং ফরম্যাট কাস্টমাইজ করতে পারেন। উদাহরণস্বরূপ, আপনি Sales Amount এর উপর ভিত্তি করে কিছু নির্দিষ্ট স্টাইল বা শর্ত প্রয়োগ করতে পারেন।
Example: Conditional Formatting Based on Sales Amount
<styles>
<style name="highSales" isDefault="false" fontSize="12" bold="true" forecolor="#FF0000"/>
<style name="lowSales" isDefault="true" fontSize="12" bold="false" forecolor="#0000FF"/>
</styles>
<textField>
<reportElement x="0" y="100" width="200" height="30"/>
<textFieldExpression><![CDATA[$F{price}]]></textFieldExpression>
<textElement>
<conditionalStyle>
<conditionExpression><![CDATA[$F{price} > 75]]></conditionExpression>
<style name="highSales"/>
<style name="lowSales"/>
</conditionalStyle>
</textElement>
</textField>
এখানে, Sales Amount (Price) ৭৫ এর বেশি হলে red text হবে এবং কম হলে blue text হবে।
- Dynamic Report Generation JasperReports-এ ডেটার উপর ভিত্তি করে রিপোর্ট তৈরি করার একটি শক্তিশালী উপায়।
- Java Code ব্যবহার করে JRXML ফাইল তৈরি এবং কাস্টমাইজ করা যায়।
- Data Source এবং Parameters এর মাধ্যমে রিপোর্টে ডেটা পাস করা যায়, যা ডাইনামিক রিপোর্ট তৈরির জন্য অত্যন্ত গুরুত্বপূর্ণ।
- Conditional Logic ব্যবহার করে রিপোর্টের কনটেন্ট এবং ফরম্যাট কাস্টমাইজ করা সম্ভব।
JasperReports-এ ডাইনামিক রিপোর্ট তৈরি করার মাধ্যমে আপনি আরও উন্নত এবং কাস্টমাইজড রিপোর্ট তৈরি করতে পারবেন যা পরিবর্তনশীল ডেটা এবং শর্ত অনুযায়ী সময়োপযোগী হতে পারে।
Read more