File extension or file is not valid at the time export excel using spout library in php

1.8k views Asked by At

I am facing problem in export excel using spout library. I don't know where is the issue in my code. I don't know much about spout library. I have tried many times but the same error occurs again and again. Please guide me where is the issue.

Code:

<?php 
include('php_script/db.php');
use Box\Spout\Common\Type;
use Box\Spout\Writer\Style\Border;
use Box\Spout\Writer\Style\BorderBuilder;
use Box\Spout\Writer\Style\Color;
use Box\Spout\Writer\Style\StyleBuilder;
use Box\Spout\Writer\WriterFactory;
include('php_script/spout/src/Spout/Autoloader/autoload.php');  
$sql = mysqli_query($con,"select * from person ");
$border = (new BorderBuilder())
        ->setBorderBottom(Color::GREEN, Border::WIDTH_THIN, Border::STYLE_DASHED)
        //->setFontColor(Color::BLUE)
        //->setBackgroundColor(Color::YELLOW)
        ->build();
    $style = (new StyleBuilder())
        ->setBorder($border)
        ->build();
    $filePath = "person".date("Y-m-d-H-i-s").'.xlsx';
    $writer = WriterFactory::create(Type::XLSX);
    $writer->openToFile($filePath);

    $array = ['TYPE'];
    
    $writer->addRowWithStyle($array, $style);

    
   
    while( $rows = mysqli_fetch_assoc($sql)) {
   
    $Type_subsidiary = $rows['Type_subsidiary'];
    $data =  [$Type_subsidiary];
    $writer->addRow($data);
    }

    $writer->close();
     if (file_exists($filePath)) {
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.basename($filePath).'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($filePath));
            readfile($filePath);
            exit;
        }


?>

Error:

Excel cannot open the file 'person2018-09-19-07-20-30.xlsx' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file

enter image description here

1

There are 1 answers

2
S. Bureau On

have you tried to let spout create and "send" the file directly to browser without specifying headers as specified in their doc http://opensource.box.com/spout/getting-started/ ?

$writer->openToBrowser($fileName); // stream data directly to the browser

Hope this helps, in our applications (based on Symfony), we use spout but no need to specify headers and filepath.