JasperReports এ time-based report generation এবং delivery একটি শক্তিশালী ফিচার যা আপনাকে রিপোর্ট নির্দিষ্ট সময়ের মধ্যে স্বয়ংক্রিয়ভাবে জেনারেট এবং বিতরণ করতে সাহায্য করে। এই ধরনের ফিচার সাধারণত ব্যবহার করা হয় যখন রিপোর্টগুলি রেগুলার ইন্টারভাল বা সময় নির্ধারণ অনুযায়ী তৈরি এবং পাঠানো প্রয়োজন হয়, যেমন দৈনিক, সাপ্তাহিক, বা মাসিক রিপোর্ট।
Time-based report generation সাধারণত scheduler এবং cron jobs ব্যবহার করে, এবং email delivery বা file storage এর মাধ্যমে রিপোর্ট স্বয়ংক্রিয়ভাবে পাঠানো হয়। এই উদাহরণে, আমরা দেখব কিভাবে JasperReports ব্যবহার করে time-based report generation এবং automated report delivery তৈরি করা যায়।
ধাপ ১: Time-based Report Generation
JasperReports এবং Spring Boot ব্যবহার করে একটি time-based report generation তৈরি করা যেতে পারে, যেখানে রিপোর্ট স্বয়ংক্রিয়ভাবে নির্দিষ্ট সময়ের মধ্যে জেনারেট হবে।
1.1. Spring Boot Project Setup
প্রথমে Spring Boot প্রজেক্ট তৈরি করতে হবে এবং প্রয়োজনীয় ডিপেনডেন্সি যুক্ত করতে হবে।
<dependencies>
<!-- Spring Boot Starter Web (for REST API) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JasperReports dependency -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.16.0</version>
</dependency>
<!-- Spring Boot Scheduler -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-scheduled</artifactId>
</dependency>
<!-- Email Sending (optional) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
</dependencies>
এখানে আমরা Spring Boot এবং JasperReports ডিপেনডেন্সি যুক্ত করেছি। এছাড়া Spring Boot Scheduler দিয়ে রিপোর্টের জন্য সিডিউল তৈরি করা যাবে এবং spring-boot-starter-mail দিয়ে রিপোর্ট ইমেইল মারফত পাঠানো যাবে।
1.2. Scheduler Configuration
Spring Boot-এ Scheduled tasks ব্যবহার করার জন্য আপনাকে @EnableScheduling অ্যানোটেশন দিয়ে task scheduler সক্রিয় করতে হবে।
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class ReportScheduler {
@Scheduled(cron = "0 0 8 * * ?") // Run daily at 8 AM
public void generateDailyReport() {
// Call method to generate report
System.out.println("Generating daily report at 8 AM...");
generateReport(); // Your JasperReport generation logic
}
// Method to generate report
public void generateReport() {
// Your JasperReport generation logic goes here
System.out.println("Report generated!");
}
}
এখানে @Scheduled(cron = "0 0 8 * * ?") ব্যবহার করা হয়েছে যা daily 8 AM-এ রিপোর্ট জেনারেট করবে।
- Cron expression:
0 0 8 * * ?এর মানে প্রতিদিন ৮:০০ AM-এ এই মেথডটি চালানো হবে।
ধাপ ২: JasperReports দিয়ে রিপোর্ট তৈরি করা
এখন আমরা JasperReports দিয়ে একটি সাধারণ Sales Report তৈরি করব এবং এটি scheduled time এ জেনারেট করব।
2.1. JasperReports 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="SalesReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<!-- Fields -->
<field name="salesRep" class="java.lang.String"/>
<field name="productName" class="java.lang.String"/>
<field name="salesAmount" class="java.lang.Double"/>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[$F{salesRep}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="120" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{productName}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="330" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[$F{salesAmount}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এটি একটি Sales Report যা salesRep, productName, এবং salesAmount এর তথ্য প্রদর্শন করবে।
2.2. Java কোড দিয়ে রিপোর্ট জেনারেট করা
import net.sf.jasperreports.engine.*;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class ReportGenerationService {
@Scheduled(cron = "0 0 8 * * ?") // This method runs daily at 8 AM
public void generateReport() {
try {
// Sample data
List<SalesData> salesDataList = new ArrayList<>();
salesDataList.add(new SalesData("John Doe", "Product A", 5000));
salesDataList.add(new SalesData("Jane Smith", "Product B", 3000));
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(salesDataList);
JasperReport jasperReport = JasperCompileManager.compileReport("SalesReport.jrxml");
// Parameters
Map<String, Object> parameters = new HashMap<>();
parameters.put("ReportTitle", "Daily Sales Report");
// Fill the report with data
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
// Export to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "DailySalesReport.pdf");
System.out.println("Report Generated Successfully!");
} catch (JRException e) {
e.printStackTrace();
}
}
}
এখানে @Scheduled(cron = "0 0 8 * * ?") ব্যবহার করা হয়েছে, যার মাধ্যমে রিপোর্টটি প্রতিদিন ৮ AM-এ স্বয়ংক্রিয়ভাবে জেনারেট হবে।
ধাপ ৩: Automated Report Delivery
আপনি চাইলে রিপোর্টটি ইমেইলের মাধ্যমে পাঠাতে পারেন। নিচে দেখানো হল কিভাবে Spring Boot ইমেইলের মাধ্যমে রিপোর্ট পাঠানো যায়।
3.1. Email Configuration
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import javax.mail.internet.MimeMessage;
@Component
public class EmailService {
@Autowired
private JavaMailSender mailSender;
public void sendEmail(String to, String subject, String body, String attachmentPath) {
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(body);
helper.addAttachment("SalesReport.pdf", new java.io.File(attachmentPath));
mailSender.send(message);
System.out.println("Email sent successfully!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.2. Report Delivery Integration
এখন, আমরা report generation এবং email sending মেথড একত্রিত করব।
@Component
public class ReportGenerationService {
@Autowired
private EmailService emailService;
@Scheduled(cron = "0 0 8 * * ?") // This method runs daily at 8 AM
public void generateAndSendReport() {
try {
// Generate Report
List<SalesData> salesDataList = new ArrayList<>();
salesDataList.add(new SalesData("John Doe", "Product A", 5000));
salesDataList.add(new SalesData("Jane Smith", "Product B", 3000));
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(salesDataList);
JasperReport jasperReport = JasperCompileManager.compileReport("SalesReport.jrxml");
Map<String, Object> parameters = new HashMap<>();
parameters.put("ReportTitle", "Daily Sales Report");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
String filePath = "DailySalesReport.pdf";
JasperExportManager.exportReportToPdfFile(jasperPrint, filePath);
// Send email with the report
emailService.sendEmail("recipient@example.com", "Daily Sales Report", "Please find the attached sales report.", filePath);
System.out.println("Report Generated and Sent Successfully!");
} catch (JRException e) {
e.printStackTrace();
}
}
}
এখন, রিপোর্ট প্রতিদিন ৮ AM-এ তৈরি হবে এবং recipient@example.com ইমেইলে পাঠানো হবে।
- Time-based report generation এবং automated delivery JasperReports এবং Spring Boot ব্যবহার করে সহজে বাস্তবায়িত করা যায়।
- @Scheduled অ্যানোটেশন এবং cron expressions ব্যবহার করে রিপোর্ট তৈরি করার সময় নির্ধারণ করা যায়।
- রিপোর্টটি ইমেইলের মাধ্যমে automatically delivered করা যায় JavaMailSender ব্যবহার করে।
Read more