当前位置:Gxlcms > PHP教程 > php生成导出word(可包含图片)的代码

php生成导出word(可包含图片)的代码

时间:2021-07-01 10:21:17 帮助过:31人阅读

  1. /***********************************************************************

  2. Class: Mht File Maker
  3. Version: 1.2 beta
  4. Link:bbs.it-home.org
  5. Author: Wudi
  6. Description: The class can make .mht file.
  7. ***********************************************************************/

  8. class MhtFileMaker{

  9. var $config = array();
  10. var $headers = array();
  11. var $headers_exists = array();
  12. var $files = array();
  13. var $boundary;
  14. var $dir_base;
  15. var $page_first;

  16. function MhtFile($config = array()){

  17. }

  18. function SetHeader($header){

  19. $this->headers[] = $header;
  20. $key = strtolower(substr($header, 0, strpos($header, ':')));
  21. $this->headers_exists[$key] = TRUE;
  22. }

  23. function SetFrom($from){

  24. $this->SetHeader("From: $from");
  25. }

  26. function SetSubject($subject){

  27. $this->SetHeader("Subject: $subject");
  28. }

  29. function SetDate($date = NULL, $istimestamp = FALSE){

  30. if ($date == NULL) {
  31. $date = time();
  32. }
  33. if ($istimestamp == TRUE) {
  34. $date = date('D, d M Y H:i:s O', $date);
  35. }
  36. $this->SetHeader("Date: $date");
  37. }

  38. function SetBoundary($boundary = NULL){

  39. if ($boundary == NULL) {
  40. $this->boundary = '--' . strtoupper(md5(mt_rand())) . '_MULTIPART_MIXED';
  41. } else {
  42. $this->boundary = $boundary;
  43. }
  44. }

  45. function SetBaseDir($dir){

  46. $this->dir_base = str_replace("\", "/", realpath($dir));
  47. }

  48. function SetFirstPage($filename){

  49. $this->page_first = str_replace("\", "/", realpath("{$this->dir_base}/$filename"));
  50. }

  51. function AutoAddFiles(){

  52. if (!isset($this->page_first)) {
  53. exit ('Not set the first page.');
  54. }
  55. $filepath = str_replace($this->dir_base, '', $this->page_first);
  56. $filepath = 'http://mhtfile' . $filepath;
  57. $this->AddFile($this->page_first, $filepath, NULL);
  58. $this->AddDir($this->dir_base);
  59. }

  60. function AddDir($dir){

  61. $handle_dir = opendir($dir);
  62. while ($filename = readdir($handle_dir)) {
  63. if (($filename!='.') && ($filename!='..') && ("$dir/$filename"!=$this->page_first)) {
  64. if (is_dir("$dir/$filename")) {
  65. $this->AddDir("$dir/$filename");
  66. } elseif (is_file("$dir/$filename")) {
  67. $filepath = str_replace($this->dir_base, '', "$dir/$filename");
  68. $filepath = 'http://mhtfile' . $filepath;
  69. $this->AddFile("$dir/$filename", $filepath, NULL);
  70. }
  71. }
  72. }
  73. closedir($handle_dir);
  74. }

  75. function AddFile($filename, $filepath = NULL, $encoding = NULL){

  76. if ($filepath == NULL) {
  77. $filepath = $filename;
  78. }
  79. $mimetype = $this->GetMimeType($filename);
  80. $filecont = file_get_contents($filename);
  81. $this->AddContents($filepath, $mimetype, $filecont, $encoding);
  82. }

  83. function AddContents($filepath, $mimetype, $filecont, $encoding = NULL){

  84. if ($encoding == NULL) {
  85. $filecont = chunk_split(base64_encode($filecont), 76);
  86. $encoding = 'base64';
  87. }
  88. $this->files[] = array('filepath' => $filepath,
  89. 'mimetype' => $mimetype,
  90. 'filecont' => $filecont,
  91. 'encoding' => $encoding);
  92. }

  93. function CheckHeaders(){

  94. if (!array_key_exists('date', $this->headers_exists)) {
  95. $this->SetDate(NULL, TRUE);
  96. }
  97. if ($this->boundary == NULL) {
  98. $this->SetBoundary();
  99. }
  100. }

  101. function CheckFiles(){

  102. if (count($this->files) == 0) {
  103. return FALSE;
  104. } else {
  105. return TRUE;
  106. }
  107. }

  108. function GetFile(){

  109. $this->CheckHeaders();
  110. if (!$this->CheckFiles()) {
  111. exit ('No file was added.');
  112. }
  113. $contents = implode("rn", $this->headers);
  114. $contents .= "rn";
  115. $contents .= "MIME-Version: 1.0rn";
  116. $contents .= "Content-Type: multipart/related;rn";
  117. $contents .= "tboundary="{$this->boundary}";rn";
  118. $contents .= "ttype="" . $this->files[0]['mimetype'] . ""rn";
  119. $contents .= "X-MimeOLE: Produced By Mht File Maker v1.0 betarn";
  120. $contents .= "rn";
  121. $contents .= "This is a multi-part message in MIME format.rn";
  122. $contents .= "rn";
  123. foreach ($this->files as $file) {
  124. $contents .= "--{$this->boundary}rn";
  125. $contents .= "Content-Type: $file[mimetype]rn";
  126. $contents .= "Content-Transfer-Encoding: $file[encoding]rn";
  127. $contents .= "Content-Location: $file[filepath]rn";
  128. $contents .= "rn";
  129. $contents .= $file['filecont'];
  130. $contents .= "rn";
  131. }
  132. $contents .= "--{$this->boundary}--rn";
  133. return $contents;
  134. }

  135. function MakeFile($filename){

  136. $contents = $this->GetFile();
  137. $fp = fopen($filename, 'w');
  138. fwrite($fp, $contents);
  139. fclose($fp);
  140. }

  141. function GetMimeType($filename){

  142. $pathinfo = pathinfo($filename);
  143. switch ($pathinfo['extension']) {
  144. case 'htm': $mimetype = 'text/html'; break;
  145. case 'html': $mimetype = 'text/html'; break;
  146. case 'txt': $mimetype = 'text/plain'; break;
  147. case 'cgi': $mimetype = 'text/plain'; break;
  148. case 'php': $mimetype = 'text/plain'; break;
  149. case 'css': $mimetype = 'text/css'; break;
  150. case 'jpg': $mimetype = 'image/jpeg'; break;
  151. case 'jpeg': $mimetype = 'image/jpeg'; break;
  152. case 'jpe': $mimetype = 'image/jpeg'; break;
  153. case 'gif': $mimetype = 'image/gif'; break;
  154. case 'png': $mimetype = 'image/png'; break;
  155. default: $mimetype = 'application/octet-stream'; break;
  156. }
  157. return $mimetype;
  158. }
  159. }
  160. ?>

2、导出word文件 exportdoc.php

  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. include_once("docclass.php");
  12. function getWordDocument( $content , $absolutePath = "" , $isEraseLink = true )
  13. {
  14. $mht = new MhtFileMaker();
  15. if ($isEraseLink)
  16. $content = preg_replace('/(s*.*?s*)/i' , '$1' , $content); //去掉链接

  17. $images = array();

  18. $files = array();
  19. $matches = array();
  20. //这个算法要求src后的属性值必须使用引号括起来
  21. if ( preg_match_all('//i',$content ,$matches ) )
  22. {
  23. $arrPath = $matches[1];
  24. for ( $i=0;$i{
  25. $path = $arrPath[$i];
  26. $imgPath = trim( $path );
  27. if ( $imgPath != "" )
  28. {
  29. $files[] = $imgPath;
  30. if( substr($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. for ( $i=0;$i{

  44. $image = $images[$i];
  45. if ( @fopen($image , 'r') )
  46. {
  47. $imgcontent = @file_get_contents( $image );
  48. if ( $content )
  49. $mht->AddContents($files[$i],$mht->GetMimeType($image),$imgcontent);
  50. }
  51. else
  52. {
  53. echo "file:".$image." not exist!
    ";
  54. }
  55. }

  56. return $mht->GetFile();

  57. }
  58. $content=implode("",file("http://bbs.it-home.org/print.php?id=3548"));
  59. $fileContent = getWordDocument($content,".");
  60. $fp = fopen("hugesky_word.doc", 'w');
  61. fwrite($fp, $fileContent);
  62. fclose($fp);
  63. ?>

人气教程排行