ob_start();
            $spreadsheet = new Spreadsheet();
            $spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(10);
            $spreadsheet->getActiveSheet()->getColumnDimension('B')->setWidth(20);
            $spreadsheet->getActiveSheet()->getColumnDimension('C')->setWidth(30);
            $spreadsheet->getActiveSheet()->getColumnDimension('D')->setWidth(40);
            $spreadsheet->getActiveSheet()->getColumnDimension('E')->setWidth(20);
            $spreadsheet->getActiveSheet()->getColumnDimension('F')->setWidth(20);
            $spreadsheet->getActiveSheet()->getColumnDimension('G')->setWidth(20);
            $spreadsheet->getActiveSheet()->getColumnDimension('H')->setWidth(20);
            $spreadsheet->getActiveSheet()->getColumnDimension('I')->setWidth(20);

            $sheet = $spreadsheet->getActiveSheet();
            $sheet->setCellValue('A1', 'SL No.');
            $sheet->setCellValue('B1', 'Student Name');
            $sheet->setCellValue('C1', 'Admission Roll');
            $sheet->setCellValue('D1', 'Transaction No.');
            $sheet->setCellValue('E1', 'API Payment Date');
            $sheet->setCellValue('F1', 'Only Fee');
            $sheet->setCellValue('G1', 'Bank Charge');
            $sheet->setCellValue('H1', 'Additional Charge');
            $sheet->setCellValue('I1', 'Customer Paid Amount');

            $sn = 2;
            $pattern = '/^\d{1,2}\/\d{1,2}\/\d{2}, \d{1,2}:\d{2} [APap][Mm]$/';
            foreach ($transactionHistories as $index => $transactionHistory) {
                $apiPaymentDate = $transactionHistory->api_payment_date;
                if (preg_match($pattern, $transactionHistory->api_payment_date)) {
                    $data = Time::createFromFormat('n/j/y, h:i A', $transactionHistory->api_payment_date);
                    $apiPaymentDate = $data->format('Y-m-d H:i:s');
                }

                $sheet->setCellValueExplicit('A' . $sn, ($index + 1), DataType::TYPE_STRING);
                $sheet->setCellValueExplicit('B' . $sn, $transactionHistory->full_name_en, DataType::TYPE_STRING);
                $sheet->setCellValueExplicit('C' . $sn, $transactionHistory->admission_roll, DataType::TYPE_STRING);
                $sheet->setCellValueExplicit('D' . $sn, $transactionHistory->transaction_no, DataType::TYPE_STRING);
                $sheet->setCellValueExplicit('E' . $sn, $apiPaymentDate, DataType::TYPE_STRING);
                $sheet->setCellValueExplicit('F' . $sn, $transactionHistory->only_fee, DataType::TYPE_STRING);
                $sheet->setCellValueExplicit('G' . $sn, $transactionHistory->bank_charge, DataType::TYPE_STRING);
                $sheet->setCellValueExplicit('H' . $sn, $transactionHistory->additional_charge, DataType::TYPE_STRING);
                $sheet->setCellValueExplicit('I' . $sn, $transactionHistory->customer_paid_amount, DataType::TYPE_STRING);
                $sn++;
            }

            $fileName = 'ekpay Transaction History report'. date('d-m-Y') . '.xlsx';
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            header("Content-Disposition: attachment;filename=$fileName");
            header('Cache-Control: max-age=0');
            header('Cache-Control: max-age=1');
            header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
            header('Cache-Control: cache, must-revalidate');
            header('Pragma: public');
            $writer = new Xlsx($spreadsheet);
            return $writer->save('php://output');
            ob_end_flush();