標籤

2014-09-20

{PHP} 不使用套件匯出格式固定Excel


做這個行業,
一定會遇到沒有程式底的USER說:

「這個東西應該還好吧?」、「小改一下就好了吧?」、「我覺得沒有很難啊?」

聽到常常讓人哭笑不得。


我這次遇到的問題是,

USER希望能直接從web上下載檔案,並且不需要再去調整任何東西,

按個列印,就能漂漂亮亮把他們需要的報表列印出來。

這個部分,一些知名的套件如:PHPExcel 都可以做到,

但若不希望使用套件,實際上也可以直接匯出固定格式的Excel檔案,

雖然步驟較複雜,但其實不難理解。

Step1:
首先,需要使用office 2003 以下的版本,來製作你要的Excel格式


可以看到我設定了欄寬、列高、欄位填滿顏色,甚至還設定了列印的版面橫向與紙張大小。

Step2:
設定好格式之後,我們把要交由PHP去填的欄位資料改為字串

註:以範例來看,{name}這個字串,是後面要用php去取代成要填入的資料,用大括號是為了確保該字串是唯一,不會取代到別的東西。

Step3:
將Excel另存為網頁


Step4:
用文字編輯器,將你另存的htm/html打開

看過檔案你會發現,
這時你在Excel上做的所有動作,其實都已變成用css與Table的Html格式。
因Excel預設開啟格式為BIG5,所以請將html裡的
<*meta http-equiv=Content-Type content="text/html; charset=big5">
改為:
<*meta http-equiv=Content-Type content="text/html; charset=utf-8">
並存檔。

Step5:
這步驟極為重要,
以我的習慣,會將該HTML至少切割成三個部分,Head/Body/Foot,分別把剛剛打開的HTML以TXT格式的方式存檔

如圖示,我會將A線以上的所有資料,存成Head
A線與B線之間的資料,存成Body
B線以下的資料,存成Foot
若還是不清楚,可下載我範例檔案研究 Link

Step6:
以上,所有前置作業已完成,
將Step5所分割好的TXT檔存到同一路徑下,
以我的習慣會將他們再獨立一個資料夾做存放


Step7:
最後匯出的方法為:
//讀入HEAD
$fd = fopen("Excel/forT_head.txt", "r");
while (!feof($fd)) {
    $buffer = fgets($fd, 4096);
    $m_strHead.=$buffer;
}

//讀入BODY
$fd = fopen("Excel/forT_body.txt", "r");
while (!feof($fd)) {
    $buffer = fgets($fd, 4096);
    $m_strBody.=$buffer;
}

//讀入FOOT
$fd = fopen("Excel/forT_foot.txt", "r");
while (!feof($fd)) {
    $buffer = fgets($fd, 4096);
    $m_strFoot.=$buffer;
}
//示範使用迴圈
for ($i = 1; $i < 3; $i++) {
    //將body資料存入temp資料
    $m_strBodytemp = $m_strBody; 
    //取代temp資料的{name}字串
    $m_strBodytemp = str_replace("{name}", "哎唷威".$i, $m_strBodytemp); 
    //取代temp資料的{sex}字串
    $m_strBodytemp = str_replace("{sex}", "男".$i, $m_strBodytemp);
    //取代temp資料的{address}字串
    $m_strBodytemp = str_replace("{address}", "wei6028.blogspot.com".$i, $m_strBodytemp);
    //取代temp資料的{tel}字串
    $m_strBodytemp = str_replace("{tel}", "091234567".$i, $m_strBodytemp);
    
    //再存入$m_strBodyMix
    $m_strBodyMix .= $m_strBodytemp; 
}


//最後利用header方式匯出Excel
$m_strFilename = sprintf("excel_teach_%s.xls", date("YmdHis"));
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=" . $m_strFilename);

//印出Head BodyMix Foot 
echo $m_strHead . $m_strBodyMix . $m_strFoot; 
最後,匯出來的資料,

除了格式完全正確之外,
甚至連列印的預設也是按照原本的設定。

這樣,不論user想要什麼格式,
只要Excel做的出來,你就能給的出來!(得意)

其中還有很多細節用法,若有問題也歡迎提出討論或來信。



註1:在Step4的時候,你可以發現Excel轉成Html時有很多css(例:xl83...)
這些css編號在每次製作excel時都會不同。
所以,若你已經做好,但User又希望再做修改時,
請一定要將Excel重新轉一次HTML並重新切割Head Body Foot

註2:請一定使用office2003以下版本,
在Office2007轉存成HTML時,
無法將其轉存成正常可用之HTML,
這部分我還在測試。

沒有留言:

張貼留言