PHP生成word文档的三种实现方式

2019-05-02 15:13:40于丽

最近工作遇到关于生成word的问题

现在总结一下生成word的三种方法。

btw:好像只要是标题带PHP的貌似点击量都不是很高(哥哥我标题还是带上PHP了),不知道为什么,估计博客园上net技术大牛比较多吧,如果把java,.net,php比作程序员的女友,那么java是Oracle门下的大家闺秀,.net微软旗下的名门望族,PHP则是草根门下的山村野姑,这让我等PHP草民闷骚男情何以堪情何以堪。。牢骚发完了,正式写吧

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代码获取word文档内容
 * 创建一个本质为mht的文档,该函数会分析文件内容并从远程下载页面中的图片资源
 * 该函数依赖于类MhtFileMaker
 * 该函数会分析img标签,提取src的属性值。但是,src的属性值必须被引号包围,否则不能提取
 * 
 * @param string $content HTML内容
 * @param string $absolutePath 网页的绝对路径。如果HTML内容里的图片路径为相对路径,那么就需要填写这个参数,来让该函数自动填补成绝对路径。这个参数最后需要以/结束
 * @param bool $isEraseLink 是否去掉HTML内容中的链接
 */
function getWordDocument( $content , $absolutePath = "" , $isEraseLink = true )
{
 $mht = new MhtFileMaker();
 if ($isEraseLink)
  $content = preg_replace('/<as*.*?s*>(s*.*?s*)</a>/i' , '$1' , $content); //去掉链接
 
 $images = array();
 $files = array();
 $matches = array();
 //这个算法要求src后的属性值必须使用引号括起来
 if ( preg_match_all('/<img[.n]*?srcs*?=s*?["'](.*?)["'](.*?)/>/i',$content ,$matches ) )
 {
  $arrPath = $matches[1];
  for ( $i=0;$i<count($arrPath);$i++)
  {
   $path = $arrPath[$i];
   $imgPath = trim( $path );
   if ( $imgPath != "" )
   {
    $files[] = $imgPath;
    if( substr($imgPath,0,7) == 'http://')
    {
     //绝对链接,不加前缀
    }
    else
    {
     $imgPath = $absolutePath.$imgPath;
    }
    $images[] = $imgPath;
   }
  }
 }
 $mht->AddContents("tmp.html",$mht->GetMimeType("tmp.html"),$content);
  
 for ( $i=0;$i<count($images);$i++)
 {
  $image = $images[$i];
  if ( @fopen($image , 'r') )
  {
   $imgcontent = @file_get_contents( $image );
   if ( $content )
    $mht->AddContents($files[$i],$mht->GetMimeType($image),$imgcontent);
  }
  else
  {
   echo "file:".$image." not exist!<br />";
  }
 }
  
 return $mht->GetFile();
}
								 
			 
相关文章 大家在看