生成mht格式导出word文档

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wd2011063437/article/details/80702529

我是在thinkphp框架中实现的功能,流程如下:
  1、在页面上添加下载按钮:

<a href="{:U('Tour/down_word',array('id'=>$v['sce_id']))}">导出</a>

  2、在TourController中的方法:
这里写图片描述

    //下载word文档
    public function down_word(){
        //获取导出信息
        $sce_id = I('id');
        $where['s.sce_id'] = $sce_id;
        $Scenic = M('travel_scenic_info');
        $sce_detail = $Scenic->table('ocenter_travel_scenic_info s')
            ->join('ocenter_travel_class_info c on s.basic_id = c.id')
            ->join('ocenter_city_info i on s.county_id = i.id')
            ->where($where)
            ->find();
        $City = M('city_info');
        $city_id = $sce_detail['city_id'];
        $county_id = $sce_detail['county_id'];
        $town_id = $sce_detail['town_id'];
        $where1['id'] = $city_id;
        $where2['id'] = $county_id;
        $where3['id'] = $town_id;
        $city_list = $City->where($where1)->find();
        $county_list = $City->where($where2)->find();
        $town_list = $City->where($where3)->find();
        if($sce_detail['sce_status'] == 1){
            $sce_detail['sce_status'] = '已开发';
        }else if($sce_detail['sce_status'] == 2){
            $sce_detail['sce_status'] = '开发中';
        }else{
            $sce_detail['sce_status'] = '未开发';
        }
        $basic_code = $sce_detail['basic_code'];
        $sce_name = $sce_detail['sce_name'];
        $sce_status = $sce_detail['sce_status'];
        $area_name = $city_list['area_name'].'-'.$county_list['area_name'].'-'.$town_list['area_name'];
        $sce_addr = $sce_detail['sce_addr'];
        $sce_coord = $sce_detail['sce_coord'];
        $now_status = $sce_detail['now_status'];
        $sce_form = $sce_detail['sce_form'];
        $img_src = json_decode($sce_detail['sce_img']);
        // var_dump($img_src);die;
        // foreach($img_src as $v){
            // str_replace("\".","\"http://lyj.siwoinfo.com/",$v);
        // }

        //文档内容如下
        $content =  '<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">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <xml><w:WordDocument><w:View>Print</w:View></xml>
        </head>';
        $content .= '<body>
        <h1 style="text-align:center">济南市旅游资源普查表</h1>
        <div>
        <span>代码:'.$basic_code.'</span>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <span>序号:</span>
        </div>
        <table border="1" cellpadding="3" cellspacing="0">
        <tr>
            <td width="100">名&nbsp;&nbsp;称:</td>
            <td width="700" colspan="12">'.$sce_name.'</td>
        </tr>
        <tr>
            <td width="100">开发状况:</td>
            <td width="700" colspan="12">'.$sce_status.'</td>
        </tr>
        <tr>
            <td width="100">所属管辖:</td>
            <td width="700" colspan="12">'.$area_name.'</td>
        </tr>
        <tr>
            <td width="100">位&nbsp;&nbsp;置:</td>
            <td width="700" colspan="12">'.$sce_addr.'</td>
        </tr>
        <tr>
            <td width="100">地理坐标:</td>
            <td width="700" colspan="12">'.$sce_coord.'</td>
        </tr>
        <tr>
            <td width="100">基本特征:</td>
            <td width="700" colspan="12">&nbsp;&nbsp;'.$sce_form.'</td>
        </tr>
        <tr>
            <td width="100">保护与开发现状:</td>
            <td width="700" colspan="12">'.$now_status.'</td>
        </tr>';
        foreach($img_src as $v){
        $content .= '<tr>
            <td width="100" valign="center" >图片显示</td>
            <td width="700" valign="center" colspan="12" ><img src="'.$v.'" width="400" /></td>
        </tr>';
        }
        $content .= '</table>
        </body>';

        //getWordDocument()方法见公共函数,注意网址参数
        $fileContent = getWordDocument($content,"http://lyj.XXXXXX.com/");
        $sce_name = iconv('utf-8','gb2312',$sce_name); //利用Iconv函数对文件名进行重新编码
        $fileName = "./Upload/".date('YmdHis',time()).$sce_name.".doc";
        $fp = fopen($fileName, 'w');
        fwrite($fp, $fileContent);
        fclose($fp);

        //下面是输出下载;
        ob_end_clean();//清除缓存以免乱码出现
        header ( "Cache-Control: max-age=0" );
        header ( "Content-Description: File Transfer" );
        header ( 'Content-disposition: attachment; filename='.basename($fileName)); //文件名
        header ( "Content-Type: application/doc" ); //文件格式:doc
        header ( "Content-Transfer-Encoding: binary" ); // 告诉浏览器,这是二进制文件
        header ( 'Content-Length: ' . filesize ( $fileName ) ); //告诉浏览器,文件大小
        @readfile ( $fileName );//输出文件;

        // ob_start(); //打开缓冲区
        // header("Cache-Control: public");
        // Header("Content-type: application/octet-stream");
        // Header("Accept-Ranges: bytes");
        // if (strpos($_SERVER["HTTP_USER_AGENT"],'MSIE')) {
            // header('Content-Disposition: attachment; filename=test.doc');
        // }else if (strpos($_SERVER["HTTP_USER_AGENT"],'Firefox')) {
            // Header('Content-Disposition: attachment; filename=test.doc');
        // } else {
            // header('Content-Disposition: attachment; filename=test.doc');
        // }
        // header("Pragma:no-cache");
        // header("Expires:0");
        // ob_end_flush();//输出全部内容到浏览器
    }

  3、公共函数代码
这里写图片描述

<?php
    function getWordDocument($content,$absolutePath = "",$isEraseLink=true ){
        $mht = new \Org\Util\MhtFileMaker();  
        if ($isEraseLink){
            $content = preg_replace('/<a\s*.*?\s*>(\s*.*?\s*)<\/a>/i' , '$1' , $content);   //去掉链接  
        }
        $images = array();  
        $files = array();  
        $matches = array();  
        //这个算法要求src后的属性值必须使用引号括起来  
        if ( preg_match_all('/<img[.\s]*?src\s*?=\s*?[\"\'](.*?)[\"\'](.*?)>/i',$content ,$matches )){   //print_r($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;  
                }  
            }  
        }  
        //print_r($images);die();  
        $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();  
    }
?>

  4、插件中的第三方类
这里写图片描述

<?php
namespace Org\Util;
class MhtFileMaker{
    var $config = array();
    var $headers = array();
    var $headers_exists = array();
    var $files = array();
    var $boundary;
    var $dir_base;
    var $page_first;

    function MhtFile($config = array()){  

    }  

    function SetHeader($header){  
        $this->headers[] = $header;  
        $key = strtolower(substr($header, 0, strpos($header, ':')));  
        $this->headers_exists[$key] = TRUE;  
    }  

    function SetFrom($from){  
        $this->SetHeader("From: $from");  
    }  

    function SetSubject($subject){  
        $this->SetHeader("Subject: $subject");  
    }  

    function SetDate($date = NULL, $istimestamp = FALSE){  
        if ($date == NULL) {  
            $date = time();  
        }  
        if ($istimestamp == TRUE) {  
            $date = date('D, d M Y H:i:s O', $date);  
        }  
        $this->SetHeader("Date: $date");  
    }  

    function SetBoundary($boundary = NULL){  
        if ($boundary == NULL) {  
            $this->boundary = '--' . strtoupper(md5(mt_rand())) . '_MULTIPART_MIXED';  
        } else {  
            $this->boundary = $boundary;  
        }  
    }  

    function SetBaseDir($dir){  
        $this->dir_base = str_replace("\\", "/", realpath($dir));  
    }  

    function SetFirstPage($filename){  
        $this->page_first = str_replace("\\", "/", realpath("{$this->dir_base}/$filename"));  
    }  

    function AutoAddFiles(){  
        if (!isset($this->page_first)) {  
            exit ('Not set the first page.');  
        }  
        $filepath = str_replace($this->dir_base, '', $this->page_first);  
        $filepath = 'http://mhtfile' . $filepath;  
        $this->AddFile($this->page_first, $filepath, NULL);  
        $this->AddDir($this->dir_base);  
    }  

    function AddDir($dir){  
        $handle_dir = opendir($dir);  
        while ($filename = readdir($handle_dir)) {  
            if (($filename!='.') && ($filename!='..') && ("$dir/$filename"!=$this->page_first)) {  
                if (is_dir("$dir/$filename")) {  
                    $this->AddDir("$dir/$filename");  
                } elseif (is_file("$dir/$filename")) {  
                    $filepath = str_replace($this->dir_base, '', "$dir/$filename");  
                    $filepath = 'http://mhtfile' . $filepath;  
                    $this->AddFile("$dir/$filename", $filepath, NULL);  
                }  
            }  
        }  
        closedir($handle_dir);  
    }  

    function AddFile($filename, $filepath = NULL, $encoding = NULL){  
        if ($filepath == NULL) {  
            $filepath = $filename;  
        }  
        $mimetype = $this->GetMimeType($filename);  
        $filecont = file_get_contents($filename);  
        $this->AddContents($filepath, $mimetype, $filecont, $encoding);  
    }  

    function AddContents($filepath, $mimetype, $filecont, $encoding = NULL){  
        if ($encoding == NULL) {  
            $filecont = chunk_split(base64_encode($filecont), 76);  
            $encoding = 'base64';  
        }  
        $this->files[] = array('filepath' => $filepath,  
                               'mimetype' => $mimetype,  
                               'filecont' => $filecont,  
                               'encoding' => $encoding);  
    }  

    function CheckHeaders(){  
        if (!array_key_exists('date', $this->headers_exists)) {  
            $this->SetDate(NULL, TRUE);  
        }  
        if ($this->boundary == NULL) {  
            $this->SetBoundary();  
        }  
    }  

    function CheckFiles(){  
        if (count($this->files) == 0) {  
            return FALSE;  
        } else {  
            return TRUE;  
        }  
    }  

    function GetFile(){  
        $this->CheckHeaders();  
        if (!$this->CheckFiles()) {  
            exit ('No file was added.');  
        } //www.jb51.net  
        $contents = implode("\r\n", $this->headers);  
        $contents .= "\r\n";  
        $contents .= "MIME-Version: 1.0\r\n";  
        $contents .= "Content-Type: multipart/related;\r\n";  
        $contents .= "\tboundary=\"{$this->boundary}\";\r\n";  
        $contents .= "\ttype=\"" . $this->files[0]['mimetype'] . "\"\r\n";  
        $contents .= "X-MimeOLE: Produced By Mht File Maker v1.0 beta\r\n";  
        $contents .= "\r\n";  
        $contents .= "This is a multi-part message in MIME format.\r\n";  
        $contents .= "\r\n";  
        foreach ($this->files as $file) {  
            $contents .= "--{$this->boundary}\r\n";  
            $contents .= "Content-Type: $file[mimetype]\r\n";  
            $contents .= "Content-Transfer-Encoding: $file[encoding]\r\n";  
            $contents .= "Content-Location: $file[filepath]\r\n";  
            $contents .= "\r\n";  
            $contents .= $file['filecont'];  
            $contents .= "\r\n";  
        }  
        $contents .= "--{$this->boundary}--\r\n";  
        return $contents;  
    }  

    function MakeFile($filename){  
        $contents = $this->GetFile();  
        $fp = fopen($filename, 'w');  
        fwrite($fp, $contents);  
        fclose($fp);  
    }  

    function GetMimeType($filename){  
        $pathinfo = pathinfo($filename);  
        switch ($pathinfo['extension']) {  
            case 'htm': $mimetype = 'text/html'; break;  
            case 'html': $mimetype = 'text/html'; break;  
            case 'txt': $mimetype = 'text/plain'; break;  
            case 'cgi': $mimetype = 'text/plain'; break;  
            case 'php': $mimetype = 'text/plain'; break;  
            case 'css': $mimetype = 'text/css'; break;  
            case 'jpg': $mimetype = 'image/jpeg'; break;  
            case 'jpeg': $mimetype = 'image/jpeg'; break;  
            case 'jpe': $mimetype = 'image/jpeg'; break;  
            case 'gif': $mimetype = 'image/gif'; break;  
            case 'png': $mimetype = 'image/png'; break;  
            default: $mimetype = 'application/octet-stream'; break;  
        }  
        return $mimetype;  
    }  
}  
?>  

猜你喜欢

转载自blog.csdn.net/wd2011063437/article/details/80702529
今日推荐