10

I try to create xls file from array and download it with the browser with this code:

$sheet = array(
    array(
      'a1 data',
      'b1 data',
      'c1 data',
      'd1 data',
    )
  );

  $doc = new PHPExcel();
  $doc->getActiveSheet()->fromArray($sheet, null, 'A1');

  header('Content-Type: application/vnd.ms-excel');
  header('Content-Disposition: attachment;filename="your_name.xls"');
  header('Cache-Control: max-age=0');

  // Do your stuff here

  $writer = PHPExcel_IOFactory::createWriter($doc, 'Excel5');

The problem is that i get a empty file.Any idea what can be the issue?

2
  • It looks like you're missing a line of code: you're creating an object $writer, but then not actually doing anything with it. Commented Apr 28, 2014 at 18:25
  • You're never printing any information. Commented Apr 28, 2014 at 18:25

4 Answers 4

24

Please try : As per official documentation, you first need to save the file with the object writer

Please let me know if this is what you wanted

<?php
date_default_timezone_set('America/Los_Angeles');

require_once('PHPExcel.php');

$sheet = array(
    array(
      'a1 data',
      'b1 data',
      'c1 data',
      'd1 data',
    )
  );

  $doc = new PHPExcel();
  $doc->setActiveSheetIndex(0);

  $doc->getActiveSheet()->fromArray($sheet, null, 'A1');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="your_name.xls"');
header('Cache-Control: max-age=0');

  // Do your stuff here
  $writer = PHPExcel_IOFactory::createWriter($doc, 'Excel5');

$writer->save('php://output');
?>
Sign up to request clarification or add additional context in comments.

2 Comments

Hi guys this example saved my ass but it do not work in firefox, and safari do you know what can I do about it?
mimetype is wrong for Excel5 it should be application/vnd.ms-excel. application/vnd.openxmlformats-officedocument.spreadsheetml.sheet is for Excel2007 files with xlsx extension.
8

Sometimes we just can't use an external library/class like PHPExcel, in this case, I recommend you to use HTML table and change headers as xls, you can create it easily from array, very simple example:

<?php
date_default_timezone_set('America/Los_Angeles');

$sheet = array(
    array(
      'a1 data',
      'b1 data',
      'c1 data',
      'd1 data',
    )
);

$table = '<table><tbody><tr><td>A1</td><td>B1</td><td>C1</td><td>D1</td></tr>';
foreach ($sheet as $row) {
    $table.= '<tr><td>'.  implode('</td><td>', $row) . '</td></tr>';
}
$table.= '</tbody></table>';

header('Content-Encoding: UTF-8');
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
header ("Content-type: application/x-msexcel;charset=UTF-8");
header ("Content-Disposition: attachment; filename=productsExport.xls" );

echo $table;
?>

3 Comments

This is pretty cool, I never knew excel would open table markup like this
very simple and useful
For a simple one-off, this is an excellent solution that doesn't require any external dependencies. Would recommend.
3
        $header = ['c1.', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'c10', 'c11']; 
        header('Content-Disposition: attachment; filename="data'.date('d-m-y').'.xls"');
        header("Content-Type: application/vnd.ms-excel");

        $output = fopen('php://output', 'w');
        fputcsv($output,  $header  , "\t");
        foreach ($Data as $value) { 
            $tmp_data = [];  
            array_push($tmp_data, $value['c1']);
            array_push($tmp_data, $value['c2']);
            array_push($tmp_data, $value['c3']);
            array_push($tmp_data, $value['c4']);
            array_push($tmp_data, $value['c5'] );
            array_push($tmp_data, $value['c6']);
            array_push($tmp_data, $value['c7']);
            array_push($tmp_data, $value['c8']);
            array_push($tmp_data,  $value['c9']);
            array_push($tmp_data, $value['c10']); 
            array_push($tmp_data, $value['c11']);
            fputcsv($output,  $tmp_data ,  "\t" );  
        }
        fclose($output);

Comments

-1
        $list=array();
        $list['tableheading'] =array('No','Name','Age','Sex');
        $fichier = 'sample.xls';
        header( "Content-Type: text/csv;charset=utf-8" );
        header( "Content-Disposition: attachment;filename=\"$fichier\"" );
        header("Pragma: no-cache");
        header("Expires: 0");
        $fp= fopen('php://output', 'w');
        fputcsv($fp,$list['tableheading'] );
        $slno=1;
        foreach($databasefetch AS $tabledata) {              
            $data['list']=array($slno,$tabledata['name'],$tabledata['Age'],$tabledata['sex']);
            fputcsv($fp, $data['list']);
            $slno++;
        }
        fclose($fp);
        exit();

2 Comments

code-only answers are discouraged. Please, consider adding some information.
Also this is generating a csv file, not a real xls format. So this method will fail when the viewer is expecting a real xls format.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.