做這個行業,
一定會遇到沒有程式底的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,
這部分我還在測試。