Search code examples
phphtmlcodeigniterexport-to-excel

Export / Download Table HTML-PHP to Excel file


I have a table on HTML/PHP that extract data from mySQL. Please see in this link. For example, please search this shipment code to get the result inside the table: 42-7278954.

After that, I want to export the result to excel (you also can see the button there).

Below is my table code in view (I've deleted some columns to shorten the code):

$body = "";

$display =  "<table class='table_searchshipment' id='table_searchshipment' cellpadding='0' cellspacing='0' border='0'>";

            echo $display;
            $body .= $display;

            $display  = "<thead>
                        <tr>
                          <th>CN No.</th>
                          <th>Doc No.</th>
                        </tr>
                      </thead>";
            echo $display;
            $body .= $display;  

            while($row = mysqli_fetch_array($result)) {
                $CN_no= $row['CN_no'];
                $doc_no= $row['doc_no'];

                $display  = "<tr>
                        <td>".$CN_no."</td>
                        <td>".$doc_no."</td>
                      </tr>";
               echo $display;
               $body .= $display;
            }

            $display  = "</table>";
            echo $display;
            $body .= $display;
            $body = htmlspecialchars($body);

            echo '<form action = "setheader" method = "post">
                    <input type = "hidden" name = "body" value = "<?php echo $body ; ?>">
                <input type = "submit" name = "submit" Value = "Export to excel">
            </form>'; 

            if(isset($_POST['submit'])){ 
                    $body = $_POST['body'];
                    setHeader("export.xls");

                    echo $body;
                }

And in the controller, I make function setheader:

public function setheader($excel_file_name)//this function used to set the header variable
{   
    header("Content-type: application/octet-stream");//A MIME attachment with the content type "application/octet-stream" is a binary file.
    //Typically, it will be an application or a document that must be opened in an application, such as a spreadsheet or word processor. 
    header("Content-Disposition: attachment; filename=$excel_file_name");//with this extension of file name you tell what kind of file it is.
    header("Pragma: no-cache");//Prevent Caching
    header("Expires: 0");//Expires and 0 mean that the browser will not cache the page on your hard drive
   }

The download pop-up is appear, but it only download "setheader" file that contains of error notification. Please see it here.


Solution

  • Firstly,

    This line needs to change from:

    echo '<form action = "setheader" method = "post">
            <input type = "hidden" name = "body" value = "<?php echo $body ; ?>">
        <input type = "submit" name = "submit" Value = "Export to excel">
    </form>';
    

    to:

    echo '<form action = "setheader" method = "post">
            <input type = "hidden" name = "body" value = "'.$body.'">
        <input type = "submit" name = "submit" Value = "Export to excel">
    </form>';
    

    Secondly, $body = htmlspecialchars($body); is most likely returning an empty string.

    From the PHP Docs

    If the input string contains an invalid code unit sequence within the given encoding an empty string will be returned, unless either the ENT_IGNORE or ENT_SUBSTITUTE flags are set.

    Without knowing what data is coming from the database, it is hard to test that further.

    But you could try:

    $body = htmlspecialchars($body, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); to see if it solves that issue.