Friday, April 27, 2012

[PHP] 超簡單 讓網頁匯出Excel檔案

「請問,網頁上的XX表單,可以匯出成excel讓我下載嗎?」,我想大家在工作上應該會聽到這樣的需求,PHP透過header的設定,可以很簡單的達到...
<?php if ($_GET['action'] == 'excel') {     header('Content-type:application/vnd.ms-excel');  //宣告網頁格式     header('Content-Disposition: attachment; filename=myexcel.xls');  //設定檔案名稱 } else {     $html_button = '<form action=""><input type="submit" name="action" value="excel"></form>'; } ?> <html>     <head>         <meta charset="UTF-8">     </head>     <body>         <?=$html_button?>         <table border="1">             <tr>                 <th>a欄</th>                 <th>b欄</th>                 <th>c欄</th>             </tr>             <tr>                 <td>資料1</td>                 <td>資料2</td>                 <td>資料3</td>             </tr>         </table>     </body> </html> 上面是一個最基本的範例,再依不同需求去更改就好了。

註1:
有些人會採用fopen跟fwrite的方式,直接產生excel檔案再寫入內容,如果是採取這種方式,請使用 "\t"來換格、"\n"來換行 ,並且注意一定要用雙引號去包,單引號的話就僅是呈現\t或\n的文字。

註2:
如果發生 Excel 的中文字變成亂碼的情形,有兩種方式可以解決:
1. 整個網頁採用BIG5編碼方式
2. 假設網頁一定要保持UTF-8的話,就用iconv("UTF-8","Big5","中文字")去個別處理。

註3:
如果header語法在IE會失敗的話(原因),可以改用另一種語法。(參考)
header('Pragma:public');
header('Content-Type:application/x-msexecl;name="myexcel.xls"');
header('Content-Disposition:inline;filename="myexcel.xls"');

註4:
如果匯出的資料量太大,會出現空白的狀況,這時候就要加大記憶體用量,請在程式最上方加入以下語法:
ini_set("memory_limit", "256M");

註5:
如果匯出的數字前面有零,例如:000123,會發現在 Excel 上面只會顯示 123 ,如果要強制顯示前面的零,可以用 =T("000123") ,去強制顯示零。
或是增加下面的CSS也可以強制轉成文字格式。 參考這裡
mso-number-format:"\@";

註6:
如果資料是包含<br>的一段文字,例如:123<br>456,會發現在 Excel 會自動增加一列 (123一列、然後456一列),如果我們希望123跟456能在同一個儲存格內換行,直覺會先試著將<br>替換成"\n"、"\r\n" 或 PHP_EOL,但轉成Excel後會發現無法換行,此時解法是不要替換<br>,然後直接加上下面的CSS,就會發現轉成Excel後,資料就神奇的在儲存格內換行了。
br {mso-data-placement:same-cell;}

7 comments:

  1. 試用完您的語法,是連圖檔那些都有,請問有辦法只抓取內容的部分嗎?!

    ReplyDelete
    Replies
    1. 如果你不想要 img 圖檔標籤,只要用 strip_tags 語法過濾掉就好了,請參考
      http://www.w3school.com.cn/php/func_string_strip_tags.asp

      Delete
  2. 請問一下 試完語法後 再匯出excel 上面那個匯出的按鈕也會同時匯出至excel 請問有方法可以避免掉麼?

    ReplyDelete
    Replies
    1. 已增加GET判斷,程式碼只是很陽春舉例,本篇重點在 header 的宣告,所以範例程式沒有寫的很周詳,還請見諒。

      Delete
  3. This comment has been removed by the author.

    ReplyDelete
  4. 不好意思,
    想問一下EXCEL檔開啟前會先跳出檔案毀損(按確定之後EXCEL可以正常開啟),有沒有甚麼辦法可以解決?

    ReplyDelete
  5. 您好,首先謝謝您提供這麼好的方法,其次我遇到一個問題,當我丟個變數進到該網頁後,網頁秀出的資料是對的,但匯出的excel資料卻是錯的,似乎是變數沒有作用。

    ReplyDelete