Execl is getting generated only with column name but the data inside is not getting generated using php

Viewed 50

I have been trying to generate excel of database earlier I was trying this with mysql And the code was working but when I started trying with SQL-SERVER I am facing several issues Like excel is getting generated but with only column names it is unable to fetch data stored inside it and my error log is also not generating anything I am sharing my code too except the designing part .. feel free to edit my code and any help would be highly appreciated

<?php
session_start();
date_default_timezone_set("Asia/Kolkata");
ini_set('display_errors',1);
ini_set('log_errors',1);
ini_set('error_log',dirname(__FILE__).'/errorlog.txt');
error_reporting(E_ALL);


$serverName = "192.168.22.68"; //serverName\instanceName
$connectionInfo = array( "Database"=>"Interopdb", "UID"=>"uatkrasqluser", "PWD"=>"CV!u@t2018");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if($conn) {
    
    

}else{
 echo "Connection could not be established.<br />";
    die( print_r( sqlsrv_errors(), true));
}


require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Writer\Xls;
use PhpOffice\PhpSpreadsheet\Writer\Csv;

if(isset($_POST['export_excel_btn']))
{
    $file_ext_name = $_POST['export_file_type'];
    $fileName = "student-sheet";

    $student = "SELECT * FROM priyat";
    $query_run = sqlsrv_query($conn, $student, array(), array("Scrollable"=>"buffered"));
    

    if(sqlsrv_num_rows($query_run) > 0)
    {
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();

        $sheet->setCellValue('A1', 'ID');
        $sheet->setCellValue('B1', 'Full Name');
        $sheet->setCellValue('C1', 'Email');
        $sheet->setCellValue('D1', 'Phone');
        $sheet->setCellValue('E1', 'Course');

        $rowCount = 2;
        if (is_array($query_run) || is_object($query_run))
        {
        foreach($query_run as $data)
        {
            $sheet->setCellValue('A'.$rowCount, $data['id']);
            $sheet->setCellValue('B'.$rowCount, $data['fullname']);
            $sheet->setCellValue('C'.$rowCount, $data['email']);
            $sheet->setCellValue('D'.$rowCount, $data['phone']);
            $sheet->setCellValue('E'.$rowCount, $data['course']);
            $rowCount++;
            
            while($row = sqlsrv_fetch_array($query_run, SQLSRV_FETCH_ASSOC)) {
    var_dump($row);
}

    
            
        }
        
    
        
        }

        if($file_ext_name == 'xlsx')
        {
            $writer = new Xlsx($spreadsheet);
            $final_filename = $fileName.'.xlsx';
        }
        elseif($file_ext_name == 'xls')
        {
            $writer = new Xls($spreadsheet);
            $final_filename = $fileName.'.xls';
        }
        elseif($file_ext_name == 'csv')
        {
            $writer = new Csv($spreadsheet);
            $final_filename = $fileName.'.csv';
        }

        // $writer->save($final_filename);
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attactment; filename="'.urlencode($final_filename).'"');
        $writer->save('php://output');

    }
    else
    {
        $_SESSION['message'] = "No Record Found";
        header('Location: index.php');
        exit(0);
    }
}

?>

1 Answers

sqlsrv_query only returns the cursor to the statement. You can't itereate over the cursor. To itereate over the results you can use:

//Fetching Data by array
while($row = sqlsrv_fetch_array($query_run, SQLSRV_FETCH_ASSOC)) {
    var_dump($row);
}

Or

//Fetching Data by object
while($row = sqlsrv_fetch_object($query_run)) {
    var_dump($row);
}
Related