当前位置:首页 > PHP教程 > php应用 > 列表

PHP把网页保存为word文件的三种方法

发布:smiling 来源: PHP粉丝网  添加日期:2020-11-05 11:13:13 浏览: 评论:0 

最近工作遇到关于生成word的问题,现在总结一下生成word的三种方法的相关资料,需要的朋友可以参考下。

一、PHP生成word的两种思路或原理

1.利用windows下面的 com组件

2.利用PHP将内容写入doc文件之中

具体实现方法如下。

二、利用windows下面的com组件

原理:com作为PHP的一个扩展类,安装过office的服务器会自动调用word.application的com,可以自动生成文档,PHP官方文档手册:http://www.php.net/manual/en/class.com.php

使用官方实例:

  1. <?php 
  2. // starting word 
  3. $word = new COM("word.application"or die("Unable to instantiate Word"); 
  4. echo "Loaded Word, version {$word->Version}\n"
  5.  
  6. //bring it to front 
  7. $word->Visible = 1; 
  8.  
  9. //open an empty document 
  10. $word->Documents->Add(); 
  11.  
  12. //do some weird stuff 
  13. $word->Selection->TypeText("This is a test..."); 
  14. $word->Documents[1]->SaveAs("Useless test.doc"); 
  15.  
  16. //closing word 
  17. $word->Quit(); 
  18.  
  19. //free the object 
  20. $word = null; 
  21. ?> 

个人建议:com实例后的方法都需要查找官方文档才知道什么意思,编辑器没有代码提示,非常不方便,另外这个效率也不是很高,不推荐使用

三、利用PHP将内容写入doc文件之中

这个方法又可以分为两种方法

1.生成mht格式(和HTML很相似)写入word

2.纯HTML格式写入word

1)、生成mht格式(和HTML很相似)写入word

代码如下:

  1. /** 
  2.  * 根据HTML代码获取word文档内容 
  3.  * 创建一个本质为mht的文档,该函数会分析文件内容并从远程下载页面中的图片资源 
  4.  * 该函数依赖于类MhtFileMaker 
  5.  * 该函数会分析img标签,提取src的属性值。但是,src的属性值必须被引号包围,否则不能提取 
  6.  *  
  7.  * @param string $content HTML内容 
  8.  * @param string $absolutePath 网页的绝对路径。如果HTML内容里的图片路径为相对路径,那么就需要填写这个参数,来让该函数自动填补成绝对路径。这个参数最后需要以/结束 
  9.  * @param bool $isEraseLink 是否去掉HTML内容中的链接 
  10.  */ 
  11. function getWordDocument( $content , $absolutePath = "" , $isEraseLink = true ) 
  12.     $mht = new MhtFileMaker(); 
  13.     if ($isEraseLink
  14.         $content = preg_replace('/<a\s*.*?\s*>(\s*.*?\s*)<\/a>/i' , '$1' , $content);   //去掉链接 
  15.  
  16.     $images = array(); 
  17.     $files = array(); 
  18.     $matches = array(); 
  19.     //这个算法要求src后的属性值必须使用引号括起来 
  20.     if ( preg_match_all('/<img[.\n]*?src\s*?=\s*?[\"\'](.*?)[\"\'](.*?)\/>/i',$content ,$matches ) ) 
  21.     { 
  22.         $arrPath = $matches[1]; 
  23.         for ( $i=0;$i<count($arrPath);$i++) 
  24.         { 
  25.             $path = $arrPath[$i]; 
  26.             $imgPath = trim( $path ); 
  27.             if ( $imgPath != "" ) 
  28.             { 
  29.                 $files[] = $imgPath
  30.                 ifsubstr($imgPath,0,7) == 'http://'
  31.                 { 
  32.                     //绝对链接,不加前缀 
  33.                 } 
  34.                 else 
  35.                 { 
  36.                     $imgPath = $absolutePath.$imgPath
  37.                 } 
  38.                 $images[] = $imgPath
  39.             } 
  40.         } 
  41.     } 
  42.     $mht->AddContents("tmp.html",$mht->GetMimeType("tmp.html"),$content); 
  43.  
  44.     for ( $i=0;$i<count($images);$i++) 
  45.     { 
  46.         $image = $images[$i]; 
  47.         if ( @fopen($image , 'r') ) 
  48.         { 
  49.             $imgcontent = @file_get_contents$image ); 
  50.             if ( $content ) 
  51.                 $mht->AddContents($files[$i],$mht->GetMimeType($image),$imgcontent); 
  52.         } 
  53.         else 
  54.         { 
  55.             echo "file:".$image." not exist!<br />"
  56.         } 
  57.     } 
  58.  
  59.     return $mht->GetFile(); 

这个函数的主要功能其实就是分析HTML代码中的所有图片地址,并且依次下载下来。获取到了图片的内容以后,调用MhtFileMaker类,将图片添加到mht文件中。具体的添加细节,封装在MhtFileMaker类中了。

使用方法1:远程调用

代码如下:

  1. $url= http://www.***.com; 
  2.  
  3. $content = file_get_contents($url); 
  4.  
  5. $fileContent = getWordDocument($content,"http://www.yoursite.com/Music/etc/"); 
  6. $fp = fopen("test.doc"'w'); 
  7. fwrite($fp$fileContent); 
  8. fclose($fp); 

其中,$content变量应该是HTML源代码,后面的链接应该是能填补HTML代码中图片相对路径的URL地址。

其中,$content变量应该是HTML源代码,后面的链接应该是能填补HTML代码中图片相对路径的URL地址

使用方法2:本地生成调用,代码如下:

  1. header("Cache-Control: no-cache, must-revalidate");  
  2. header("Pragma: no-cache");  
  3. $wordStr = 'PHP粉丝网--phpfensi.com';  
  4. $fileContent = getWordDocument($wordStr);  
  5. $fileName = iconv("utf-8""GBK", ‘PHP教程' . '_'. $intro . '_' . rand(100, 999));    
  6. header("Content-Type: application/doc");  
  7. header("Content-Disposition: attachment; filename=" . $fileName . ".doc");  
  8. echo $fileContent

注意,在使用这个函数之前,您需要先包含类MhtFileMaker,这个类可以帮助我们生成Mht文档。

代码如下:

  1. <?php 
  2. /*********************************************************************** 
  3. Class:        Mht File Maker 
  4. Version:      1.2 beta 
  5. Date:         02/11/2007 
  6. Author:       Wudi <wudicgi@yahoo.de> 
  7. Description:  The class can make .mht file. 
  8. ***********************************************************************/ 
  9.  
  10. class MhtFileMaker{ 
  11.     var $config = array(); 
  12.     var $headers = array(); 
  13.     var $headers_exists = array(); 
  14.     var $files = array(); 
  15.     var $boundary
  16.     var $dir_base
  17.     var $page_first
  18.  
  19.     function MhtFile($config = array()){ 
  20.  
  21.     } 
  22.  
  23.     function SetHeader($header){ 
  24.         $this->headers[] = $header
  25.         $key = strtolower(substr($header, 0, strpos($header':'))); 
  26.         $this->headers_exists[$key] = TRUE; 
  27.     } 
  28.  
  29.     function SetFrom($from){ 
  30.         $this->SetHeader("From: $from"); 
  31.     } 
  32.  
  33.     function SetSubject($subject){ 
  34.         $this->SetHeader("Subject: $subject"); 
  35.     } 
  36.  
  37.     function SetDate($date = NULL, $istimestamp = FALSE){ 
  38.         if ($date == NULL) { 
  39.             $date = time(); 
  40.         } 
  41.         if ($istimestamp == TRUE) { 
  42.             $date = date('D, d M Y H:i:s O'$date); 
  43.         } 
  44.         $this->SetHeader("Date: $date"); 
  45.     } 
  46.  
  47.     function SetBoundary($boundary = NULL){ 
  48.         if ($boundary == NULL) { 
  49.             $this->boundary = '--' . strtoupper(md5(mt_rand())) . '_MULTIPART_MIXED'
  50.         } else { 
  51.             $this->boundary = $boundary
  52.         } 
  53.     } 
  54.  
  55.     function SetBaseDir($dir){ 
  56.         $this->dir_base = str_replace("\\", "/", realpath($dir)); 
  57.     } 
  58.  
  59.     function SetFirstPage($filename){ 
  60.         $this->page_first = str_replace("\\", "/", realpath("{$this->dir_base}/$filename")); 
  61.     } 
  62.  
  63.     function AutoAddFiles(){ 
  64.         if (!isset($this->page_first)) { 
  65.             exit ('Not set the first page.'); 
  66.         } 
  67.         $filepath = str_replace($this->dir_base, ''$this->page_first); 
  68.         $filepath = 'http://mhtfile' . $filepath
  69.         $this->AddFile($this->page_first, $filepath, NULL); 
  70.         $this->AddDir($this->dir_base); 
  71.     } 
  72.  
  73.     function AddDir($dir){ 
  74.         $handle_dir = opendir($dir); 
  75.         while ($filename = readdir($handle_dir)) { 
  76.             if (($filename!='.') && ($filename!='..') && ("$dir/$filename"!=$this->page_first)) { 
  77.                 if (is_dir("$dir/$filename")) { 
  78.                     $this->AddDir("$dir/$filename"); 
  79.                 } elseif (is_file("$dir/$filename")) { 
  80.                     $filepath = str_replace($this->dir_base, ''"$dir/$filename"); 
  81.                     $filepath = 'http://mhtfile' . $filepath
  82.                     $this->AddFile("$dir/$filename"$filepath, NULL); 
  83.                 } 
  84.             } 
  85.         } 
  86.         closedir($handle_dir); 
  87.     } 
  88.  
  89.     function AddFile($filename$filepath = NULL, $encoding = NULL){ 
  90.         if ($filepath == NULL) { 
  91.             $filepath = $filename
  92.         } 
  93.         $mimetype = $this->GetMimeType($filename); 
  94.         $filecont = file_get_contents($filename); 
  95.         $this->AddContents($filepath$mimetype$filecont$encoding); 
  96.     } 
  97.  
  98.     function AddContents($filepath$mimetype$filecont$encoding = NULL){ 
  99.         if ($encoding == NULL) { 
  100.             $filecont = chunk_split(base64_encode($filecont), 76); 
  101.             $encoding = 'base64'
  102.         } 
  103.         $this->files[] = array('filepath' => $filepath
  104.                                'mimetype' => $mimetype
  105.                                'filecont' => $filecont
  106.                                'encoding' => $encoding); 
  107.     } 
  108.  
  109.     function CheckHeaders(){ 
  110.         if (!array_key_exists('date'$this->headers_exists)) { 
  111.             $this->SetDate(NULL, TRUE); 
  112.         } 
  113.         if ($this->boundary == NULL) { 
  114.             $this->SetBoundary(); 
  115.         } 
  116.     } 
  117.  
  118.     function CheckFiles(){ 
  119.         if (count($this->files) == 0) { 
  120.             return FALSE; 
  121.         } else { 
  122.             return TRUE; 
  123.         } 
  124.     } 
  125.  
  126.     function GetFile(){ 
  127.         $this->CheckHeaders(); 
  128.         if (!$this->CheckFiles()) { 
  129.             exit ('No file was added.'); 
  130.         } 
  131.         $contents = implode("\r\n"$this->headers); 
  132.         $contents .= "\r\n"
  133.         $contents .= "MIME-Version: 1.0\r\n"
  134.         $contents .= "Content-Type: multipart/related;\r\n"
  135.         $contents .= "\tboundary=\"{$this->boundary}\";\r\n"
  136.         $contents .= "\ttype=\"" . $this->files[0]['mimetype'] . "\"\r\n"
  137.         $contents .= "X-MimeOLE: Produced By Mht File Maker v1.0 beta\r\n"
  138.         $contents .= "\r\n"
  139.         $contents .= "This is a multi-part message in MIME format.\r\n"
  140.         $contents .= "\r\n"
  141.         foreach ($this->files as $file) { 
  142.             $contents .= "--{$this->boundary}\r\n"
  143.             $contents .= "Content-Type: $file[mimetype]\r\n"
  144.             $contents .= "Content-Transfer-Encoding: $file[encoding]\r\n"
  145.             $contents .= "Content-Location: $file[filepath]\r\n"
  146.             $contents .= "\r\n"
  147.             $contents .= $file['filecont']; 
  148.             $contents .= "\r\n"
  149.         } 
  150.         $contents .= "--{$this->boundary}--\r\n"
  151.         return $contents
  152.     } 
  153.  
  154.     function MakeFile($filename){ 
  155.         $contents = $this->GetFile(); 
  156.         $fp = fopen($filename'w'); 
  157.         fwrite($fp$contents); 
  158.         fclose($fp); 
  159.     } 
  160.  
  161.     function GetMimeType($filename){ 
  162.         $pathinfo = pathinfo($filename); 
  163.         switch ($pathinfo['extension']) { 
  164.             case 'htm'$mimetype = 'text/html'break
  165.             case 'html'$mimetype = 'text/html'break
  166.             case 'txt'$mimetype = 'text/plain'break
  167.             case 'cgi'$mimetype = 'text/plain'break
  168.             case 'php'$mimetype = 'text/plain'break
  169.             case 'css'$mimetype = 'text/css'break
  170.             case 'jpg'$mimetype = 'image/jpeg'break
  171.             case 'jpeg'$mimetype = 'image/jpeg'break
  172.             case 'jpe'$mimetype = 'image/jpeg'break
  173.             case 'gif'$mimetype = 'image/gif'break
  174.             case 'png'$mimetype = 'image/png'break
  175.             default$mimetype = 'application/octet-stream'break
  176.         } 
  177.         return $mimetype
  178.     } 
  179. ?> 

点评:这种方法的缺点是不支持批量生成下载,因为一个页面只能有一个header,(无论远程使用还是本地生成声明header页面只能输出一个header),即使你循环生成,结果还是只有一个word生成(当然你可以修改上面的方式来实现)

2.纯HTML格式写入word

原理:利用ob_start把html页面先存储起来(解决一下页面多个header问题,可以批量生成),然后在写入doc文档内容利用代码:

  1. <?php 
  2. class word 
  3. {  
  4.     function start() 
  5.     { 
  6.         ob_start(); 
  7.         echo '<html xmlns:o="urn:schemas-microsoft-com:office:office" 
  8.         xmlns:w="urn:schemas-microsoft-com:office:word" 
  9.         xmlns="http://www.w3.org/TR/REC-html40">'; 
  10.     } 
  11.     function save($path
  12.     { 
  13.  
  14.         echo "</html>"
  15.         $data = ob_get_contents(); 
  16.         ob_end_clean(); 
  17.  
  18.         $this->wirtefile ($path,$data); 
  19.     } 
  20.  
  21.     function wirtefile ($fn,$data
  22.     { 
  23.         $fp=fopen($fn,"wb"); 
  24.         fwrite($fp,$data); 
  25.         fclose($fp); 
  26.     } 

代码如下:

  1. $html = '  
  2. <table width=600 cellpadding="6" cellspacing="1" bgcolor="#336699">  
  3. <tr bgcolor="White">  
  4.   <td>PHP10086</td>  
  5.   <td><a href="https://www.phpfensi.com" target="_blank" >https://www.phpfensi.com</a></td>  
  6. </tr>  
  7. <tr bgcolor="red">  
  8.   <td>PHP10086</td>  
  9.   <td><a href="https://www.phpfensi.com" target="_blank" >https://www.phpfensi.com</a></td>  
  10. </tr>  
  11. <tr bgcolor="White">  
  12.   <td colspan=2 >  
  13.   PHP10086<br>  
  14.   最靠谱的PHP技术分享网站  
  15.   <img src="https://www.phpfensi.com/wp-content/themes/WPortal-Blue/images/logo.gif">  
  16.   </td>  
  17. </tr>  
  18. </table>  
  19. ';  
  20.  
  21. //批量生成  
  22. for($i=1;$i<=3;$i++){  
  23.     $word = new word();  
  24.     $word->start();  
  25.     //$html = "aaa".$i;  
  26.     $wordname = 'PHP粉丝网--phpfensi.com'.$i.".doc";  
  27.     echo $html;  
  28.     $word->save($wordname);  
  29.     ob_flush();//每次执行前刷新缓存  
  30.     flush();  

个人点评:这种方法效果最好,原因有三个:

第一代码比较简洁,很容易理解

第二是支持批量生成word(这个很重要)

第三是支持完整的html代码。

Tags: PHP网页保存为word文件

分享到: