PHP生成word原理
- 利用windows下面的 com組件
- 利用PHP將內容寫入doc文件之中
具體實現:
利用windows下面的 com組件
原理:com作為PHP的一個擴展類,安裝過office的服務器會自動調用word.application的com,可以自動生成文檔,PHP官方文檔手冊:http://www.php.net/manual/en/class.com.php
使用官方實例:
<?php // starting word $word = new COM("word.application") or die("Unable to instantiate Word"); echo "Loaded Word, version {$word->Version}\n"; //bring it to front $word->Visible = 1; //open an empty document $word->Documents->Add(); //do some weird stuff $word->Selection->TypeText("This is a test..."); $word->Documents[1]->SaveAs("Useless test.doc"); //closing word $word->Quit(); //free the object $word = null;
個人建議:com實例后的方法都需要查找官方文檔才知道什么意思,編輯器沒有代碼提示,非常不方便,另外這個效率也不是很高,不推薦使用
利用PHP將內容寫入doc文件之中
這個方法又可以分為兩種方法
- 生成mht格式(和HTML很相似)寫入word
- 純HTML格式寫入word
生成mht格式(和HTML很相似)寫入word
這個函數的主要功能其實就是分析HTML代碼中的所有圖片地址,並且依次下載下來。獲取到了圖片的內容以后,調用MhtFileMaker類,將圖片添加到mht文件中。具體的添加細節,封裝在MhtFileMaker類中了。
使用方法:遠程調用
其中,$content變量應該是HTML源代碼,后面的鏈接應該是能填補HTML代碼中圖片相對路徑的URL地址
本地生成調用:
header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); $wordStr = 'http://www.jb51.net/'; $fileContent = getWordDocument($wordStr); $fileName = iconv("utf-8", "GBK", ‘jb51' . '_'. $intro . '_' . rand(100, 999)); header("Content-Type: application/doc"); header("Content-Disposition: attachment; filename=" . $fileName . ".doc"); echo $fileContent;
注意,在使用這個函數之前,您需要先包含類MhtFileMaker,這個類可以幫助我們生成Mht文檔。
點評:這種方法的缺點是不支持批量生成下載,因為一個頁面只能有一個header,(無論遠程使用還是本地生成聲明header頁面只能輸出一個header),即使你循環生成,結果還是只有一個word生成(當然你可以修改上面的方式來實現)
2.純HTML格式寫入word
原理:
利用ob_start把html頁面先存儲起來(解決一下頁面多個header問題,可以批量生成),然后在寫入doc文檔內容利用
代碼:
<?php class word { function start() { ob_start(); echo '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">'; } function save($path) { echo "</html>"; $data = ob_get_contents(); ob_end_clean(); $this->wirtefile ($path,$data); } function wirtefile ($fn,$data) { $fp=fopen($fn,"wb"); fwrite($fp,$data); fclose($fp); } } ? $html = ' <table width=600 cellpadding="6" cellspacing="1" bgcolor="#336699"> <tr bgcolor="White"> <td>PHP10086</td> <td><a href="http://www.php10086.com" target="_blank" >http://www.php10086.com</a></td> </tr> <tr bgcolor="red"> <td>PHP10086</td> <td><a href="http://www.php10086.com" target="_blank" >http://www.php10086.com</a></td> </tr> <tr bgcolor="White"> <td colspan=2 > PHP10086<br> 最靠譜的PHP技術博客分享網站 <img src="http://www.php10086.com/wp-content/themes/WPortal-Blue/images/logo.gif"> </td> </tr> </table> '; //批量生成 for($i=1;$i<=3;$i++){ $word = new word(); $word->start(); //$html = "aaa".$i; $wordname = 'PHP淮北的個人網站--PHP10086.com'.$i.".doc"; echo $html; $word->save($wordname); ob_flush();//每次執行前刷新緩存 flush(); }
個人點評:這種方法效果最好,原因有兩個:
第一代碼比較簡潔,很容易理解,第二種支持批量生成word(這個很重要)
第三支持完整的html代碼
生成了三個word文檔:並且內容支持完整的html代碼顯示,第三種方法強烈推薦
以上就是本文的全部內容,希望對大家的學習有所幫助。