header()實現PHP最簡單的導出excel,不需要引入操作excel類庫

最新的項目,因爲涉及到資金,需要導出excel。先找到項目後臺原本的導出功能,挺簡陋的不滿足項目要求,需要優化。它沒有引入任何操作excel的類庫,直接獲取數據拼接,中間用iconv()函數將字符串從utf8編碼轉爲gbk,然後echo打印出來,就變成導出excel。

然後我發現一句代碼:

header("Content-Disposition: attachment; filename=refund_list.csv");

這裏的refund_list.csv就是每次導出的excel文件名。參考到以前用PHP的下載頭代碼:

header("Content-type: text/plain");
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=".$filename);
header("Cache-Control: must-revalidate, post-check=0, pre-check=0" );
header("Pragma: no-cache" );
header("Expires: 0" ); 
所以我猜代碼中的這句header()代碼也是類型下載頭的代碼,將PHP打印的數據轉化爲可下載的文件形式,然後通過“refund_list.csv”這裏的後綴轉化爲excel。

爲了證明我的猜測,我先百度了“Content-Disposition”,得到的結果:Content-Disposition爲屬性名,disposition-type是以什麼方式下載,如attachment爲以附件方式下載 。

然後我再將上面header()函數的文件名改爲“.txt”,“.doc”分別測試,分別能導出txt文本文件和word文件,perfect

<?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=Export_test.xls");
$tab="\t"; $br="\n";
$head="編號".$tab."備註".$br;
//輸出內容如下: 
echo $head.$br;
echo  "test321318312".$tab; 
echo  "string1";
echo  $br;
 
echo  "330181199006061234".$tab;  //直接輸出會被Excel識別爲數字類型
echo  "number";
echo  $br;
 
echo  "=\"330181199006061234\"".$tab;  //原樣輸出需要處理
echo  "string2";
echo  $br;
?>
這是一段網上搜的測試代碼。測試過程中會發現一些問題,導出的時候只是簡單的將無格式數據粘貼進excel文件,怎麼破!分享一下

在導出後會發現一個問題,如果數據是數字會出現一些意想不到的情況。比如,"012345",在excel中會變成"12345";如果輸入身份證號碼這樣的長數字,在excel中會用科學計數法表示出來,並且最後的四位數字會出現偏差,變位0000等情況。這就需要把單元格設置爲文本格式,方法是

echo  "=\"330181199006061234\""
如果程序是utf-8編碼的,還需要用iconv函數去轉碼,不然是會亂碼的,亂碼的。

iconv("UTF-8", "GB2312", $yourstr);
如果導出中文時出現亂碼,可以嘗試將字符串轉換成gb2312,例如下面就把$yourStr從utf-8轉換成了gb2312:
$yourStr = mb_convert_encoding(”gb2312″, “UTF-8″, $yourStr);

另word格式導入類似,,指定header就可以了:
header("Content-Type:   application/msword");       
header("Content-Disposition:   attachment;   filename=doc.doc"); 
+++++++++++++++++++++++++++華麗的分割線+++++++++++++++++++++++++++++++++++++++++++
PHP代碼:

<?php
 
     
    /**
     * exportExcel($data,$title,$filename);
    * 導出數據爲excel表格
    *@param $data    一個二維數組,結構如同從數據庫查出來的數組
    *@param $title   excel的第一行標題,一個數組,如果爲空則沒有標題
    *@param $filename 下載的文件名
    *@examlpe
    exportExcel($arr,array('id','賬戶','密碼','暱稱'),'文件名!');
*/
    function exportExcel($data=array(),$title=array(),$filename='report')
    {
        header("Content-type:application/octet-stream");
        header("Accept-Ranges:bytes");
        header("Content-type:application/vnd.ms-excel"); 
        header("Content-Disposition:attachment;filename=".$filename.".xls");
        header("Pragma: no-cache");
        header("Expires: 0");
        //導出xls開始
        if (!empty($title))
        {
            foreach ($title as $k => $v)
            {
                $title[$k]=iconv("UTF-8", "GB2312",$v);
            }
            $title= implode("\t", $title);
            echo "$title\n";
        }
        if (!empty($data))
        {
            foreach($data as $key=>$val)
            {
                foreach ($val as $ck => $cv)
                {
                    $data[$key][$ck]=iconv("UTF-8", "GB2312", $cv);
                }
             $data[$key]=implode("\t", $data[$key]);     
            }
             
            echo implode("\n",$data);
        }
    }
     
$total = array();
$fp = fopen('card.txt', 'r');
$i = 0;
while ($v = fgets($fp, 100))
{
    $arr = explode(",", trim($v));
    $total[$i]["cid"]           = "=\"".$arr[0]."\"";
    $total[$i]["code"]          = "=\"".$arr[1]."\"";
    $total[$i]["ctime"]         = '2014-09-10 14:06:29';
    $total[$i]["expireday"]     = '2015-12-31 23:59:59';
    $i++;
}
exportExcel($total, array('卡','生成碼','開始時間','有效時間'), 'card');
exit;

card.txt文件

900010061112,22279892213248,2013-06-30
900010061113,52139844827982,2013-06-30
900010061114,67313895480603,2013-06-30
900010061115,66178571957378,2013-06-30
900010061116,78951625651967,2013-06-30
900010061117,73835952566949,2013-06-30
900010061118,74436659365440,2013-06-30
(上面的方法可以解決簡易導出excel又不想因爲功能調用類庫讓程序臃腫的問題,不過具體開發過程中還需要多加測試,才能找到最優的解決辦法....我先試試能不能滿足我們項目開發需求,不行的話還是需要用到PHPexcel)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章