Rendering SQL Server Reports as Excel Documents with PHP

I wrote a post a while back about getting started with SQL Server Reporting Services (SSRS) and PHP that has generated lots of questions (both in the comments and in e-mail and conversations I’ve had since then). One of the most common questions has been “How do I render a report as an Excel document?” I’ve been telling folks that this is easy with the SSRS SDK for PHP (and it is easy), but when I sat down to do it, I ran into a problem. So, in this post, I’ll show you how to render a SSRS report as an Excel document and how to avoid the one problem that caused me headaches. I will assume you have read my previous post about getting started with SSRS and PHP.

Once you have generated a report (as described here) and worked through the prerequisites (here), rendering a report in Excel format simply requires creating a new RenderAsEXCEL object and passing it to the Render2 method on the SSRSReport object. The resulting stream can then be written to the desired folder:

require_once ‘SSRSReport.php’;
define(“SERVICE_URL”, “
define(“REPORT”, “/SalesReport/SalesByCategory”);

$ssrs_report = new SSRSReport(new Credentials(‘machineName\PHPDemoUser’, ‘pwd’), SERVICE_URL);
$ssrs_report->LoadReport2(REPORT, NULL);
$renderAsEXCEL = new RenderAsEXCEL();
$result_EXCEL = $ssrs_report->Render2($renderAsEXCEL,

$handle = fopen(“C:\\Path\\to\\desired\\folder\\” . “report.xls”, ‘wb’);
fwrite($handle, $result_EXCEL);

That is all very straightforward…very similar to rendering a report in any of the other available formats…so what was the problem that had me stumped for a while? SSRS supports the .xls format for Excel documents. Was trying to save my report in the newer .xlsx format, which just produced garbage. So, consider yourself warned: be sure to save Excel documents in the older .xls format.

Attached to this post is a simple script that will allow you to render a report in a format of your choice: HTML, PDF, or EXCEL.

That’s it for today.



Share this on Twitter

Comments (4)

  1. razvantim says:

    Great news. Now I can power my reports from PHP.

  2. Excellent! Let us know how things work for you…we'd love feedback.


  3. Robert says:

    Thanks for the short and sweet tutorial!

  4. Struan says:


    I've been using the SDK for a couple of years to publish reports via PHP.  I want to render to Excel but the file is always corrupted.  I've read the web articles about the additional blank space in front of <?php in the RenderAsEXCEL.php and removed it as well as all trailing empty lines from other php files in the SDK but no change.  Is there anything else that you are aware of that causes Excel files to corrupt when being rendered via the SDK?

    My report works when rendered to HTML, PDF and even CSV. Here is my code:

        $renderAsExcel = new RenderAsEXCEL();
        $resultExcel = $ssrs_report-&gt;Render2($renderAsExcel,
         &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PageCountModeEnum::$Estimate,
         &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $Extension,
         &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $MimeType,
         &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $Encoding,
         &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $Warnings,
         &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $StreamIds
        header(&quot;Content-Type: application/force-download&quot;);
        header(&quot;Content-Disposition: attachment; filename=&quot;RebateReport.xls&quot;&quot;);
                //header(&quot;Content-Type: application/;);
        header(&quot;Content-length: &quot;.(string)(strlen($resultExcel)));
        header(&quot;Expires: &quot;.gmdate(&quot;D, d M Y H:i:s&quot;, mktime(date(&quot;H&quot;)+2, date(&quot;i&quot;),date(&quot;s&quot;),date(&quot;m&quot;), date(&quot;d&quot;),date(&quot;Y&quot;))).&quot; GMT&quot;);
        header(&quot;Last-Modified: &quot;.gmdate(&quot;D, d M Y H:i:s&quot;).&quot; GMT&quot;);
        header(&quot;Cache-Control: no-cache, must-revalidate&quot;);
        header(&quot;Pragma: no-cache&quot;);
                echo $resultExcel;