Link to home
Start Free TrialLog in
Avatar of mrcandu2
mrcandu2

asked on

PHP export to Excel: Define Excel Sheetname

Hi,
I am currently exporting data from php to excel using the following method:

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=ExcelFile.xls;");
header("Pragma: no-cache");
header("Expires: 0");
echo $data;

This works fine, but the generated excel file has a sheetname of: ".xls]ExcelFile(1)" , and when you try to rename the sheet it causes an error in excel.

How can I define the sheetname in my php file?

Many Thanks,
Matthew Cohen
Avatar of hiteshgupta1
hiteshgupta1

Give a try to following code

// connection to mysql server
$con = mysql_connect("localhost","username","password");

// selecting the db
mysql_select_db("DBName",$con);

// preparing sql query
$query = "Select Query";
$result = mysql_query($query);

<B>// this is the title of the excel sheet
$title = "Title\n";
</b>

// looping the query resuls
while ($row = mysql_fetch_array($result)) {
   $cnt++;
   // concatinating the contents with \n character
   $content .= $cnt.",".$row['Field1'].",".$row['Field2'].."\n";
}

$export_data = $title.$content;

$filename = "your writable folder/export.csv";

// Let's make sure the file exists and is writable first.
if (is_writable($filename)) {

   // In our example we're opening $filename in write mode.
   // that's where $export_data will go when we fwrite() it.
   if (!$handle = fopen($filename, 'w')) {
        print "Cannot open file ($filename)";
        exit;
   }

   // Write $export_data to our opened file.
   if (!fwrite($handle, $export_data)) {
       print "Cannot write to file ($filename)";
       exit;
   }
   
   print "Success, wrote to file ($filename)";
   
   fclose($handle);
   header("Pragma: public"); // required
   header("Expires: 0");
   header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
   header("Cache-Control: private",false); // required for certain browsers
   header("Content-Type: application/ms-excel");
   header("Content-Disposition: attachment; filename=Sales_Report.csv");
   header("Content-Transfer-Encoding: binary");
   header("Content-Length: ".filesize($filename));
   readfile("$filename");
} else {
   print "The file $filename is not writable";
}

Hope this helps
Avatar of mrcandu2

ASKER

Thanks hiteshgupta1 , but I am really looking for an solution to generate an xls file and without writing to a file.
Here is my code in full ........

include("dbconnect.php");

$query = $_POST['query'];
$result = odbc_exec($conn,$query);
$count = odbc_num_fields($result);

//Define Data Variable of ODBC
$data = "";

//header info
for ($i = 1; $i <= $count; $i++)
    {
        $data .= odbc_field_name($result, $i)."\t";
    }
$data .= "\n";

//data Info
while(odbc_fetch_row($result))
    {
        for ($j = 1; $j <= $count; $j++)
      {
      $data .= odbc_result($result, $j)."\t";
      }
        $data .= "\n";
    }
      
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=ExcelFile.xls;");
header("Pragma: no-cache");
header("Expires: 0");

echo $data;

odbc_close($conn);
ASKER CERTIFIED SOLUTION
Avatar of Richard Quadling
Richard Quadling
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Ahhhh...... Genius stuff.
This will allow me to do more than what I wanted to do, I will post my final code when finished.
Thanks Very Much.
Mr Candu
In fact, EVERYTHING that goes into an XLS file can be put into the XML file. It is just a case of knowing what.

There is a GREAT set of dox on the MS website for MS Office and XML ...

http://www.microsoft.com/downloads/details.aspx?familyid=fe118952-3547-420a-a412-00a2662442d9&displaylang=en

is a start point.
My Final Code.....................

include("dbconnect.php");
$title = $_POST['title'];
$query = $_POST['query'];
$result = odbc_exec($conn,$query);
$count = odbc_num_fields($result);

//XML Blurb
$data = '<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <Worksheet ss:Name="'.$title.'">
  <Table>
   <Row>';

//Field Name Data
for ($i = 1; $i <= $count; $i++)
      {
          $data .= '<Cell><Data ss:Type="String">'.odbc_field_name($result, $i).'</Data></Cell>';
      }
$data .= '</Row>';

//Row Data
while(odbc_fetch_row($result))
    {
            $data .= '<Row>';
            for ($j = 1; $j <= $count; $j++)
                  {
                        $data .= '<Cell><Data ss:Type="String">'.odbc_result($result, $j).'</Data></Cell>';
                  }
            $data .= '</Row>';
      }

//Final XML Blurb
$data .= '</Table>
 </Worksheet>
</Workbook>';
      
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$title.xls;");
header("Content-Type: application/ms-excel");
header("Pragma: no-cache");
header("Expires: 0");

echo $data;

odbc_close($conn);