• php word2007 docx模版替换生成


    最近要用php制作word纠结的很

    <?php
    define("SCHEMA_IMAGEDOCUMENT",'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image');
    class doc
    {
    public $filename;
    public $zip;
    public $content;
    public $tempfile;
    public $_data=array();
    public function __construct($filename){
    $this->tempfile=dirname($filename)."/".time().basename($filename);
    copy($filename,$this->tempfile);
    $this->filename=$filename;
    $this->zip=new ZipArchive();
    $this->zip->open($this->tempfile);
    $this->content=$this->zip->getFromName("word/document.xml");;
    }

    public function assign($k,$v,$fox=""){
    switch($fox){
    case "table":
    $this->parse_table($k,$v);
    break;
    case "html":
    $this->parse_html($k,$v);
    break;
    case "tr":
    $this->parse_tr($k,$v);
    break;
    default:
    $this->_data[$k]=$v;
    break;
    }

    }

    public function save($file){
    foreach($this->_data as $k=>$v){
    $this->content=str_replace("\${{$k}}",$v,$this->content);
    }
    $this->zip->addFromString("word/document.xml",$this->content);
    $this->zip->close();
    copy($this->tempfile,$file);
    @unlink($this->tempfile);
    }
    //解析表格
    function parse_table($key,$v){
    //解析tr
    $v=preg_replace("/<td[^>]*>(.*)<\/td>/iUse","'<td>'.strip_tags('\\1').'</td>'",$v);
    //提取表格
    preg_match_all("/(<table[^>]*>.*<\/table>)/iUs",$v,$cc);
    $dd="";
    if($cc[1]){
    foreach($cc[1] as $vv){
    $dd.=$vv;
    }
    }
    $v=$dd;
    $arr=explode("\${{$key}}",$this->content);
    if(!isset($arr[1])) return false;
    $start=explode("<w:p ",$arr[0]."\${{$key}}");
    $end=explode("</w:p>",$arr[1]);
    $str="<w:p ".$start[count($start)-1].$end[0]."</w:p>";
    $this->content=str_replace($str,"\${{$key}}",$this->content);
    //在table出插入样式
    $v=str_replace("<table>",'<table><w:tblPr>
    <w:tblW w:w="0" w:type="auto"/>
    <w:tblBorders>
    <w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/>
    <w:left w:val="single" w:sz="4" w:space="0" w:color="auto"/>
    <w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/>
    <w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/>
    <w:insideH w:val="single" w:sz="4" w:space="0" w:color="auto"/>
    <w:insideV w:val="single" w:sz="4" w:space="0" w:color="auto"/>
    </w:tblBorders>
    <w:tblLook w:val="04A0"/>
    </w:tblPr>',$v);
    //合并单元格处理
    $v=preg_replace("/<td[^>]* rowspan=\"(\d+)\">(.*)<\/td>/iUs",'
    <w:tc><w:tcPr><w:tcW w:w="4644" w:type="dxa"/><w:gridSpan w:val="'."\\1".'"/><w:vMerge w:val="restart"/></w:tcPr><w:p w:rsidR="00DF534D" w:rsidRDefault="0017426F"><w:pPr><w:rPr><w:rFonts w:hint="eastAsia"/><w:lang w:eastAsia="zh-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia"/><w:lang w:eastAsia="zh-CN"/></w:rPr><w:t>'."\\2".'</w:t></w:r></w:p></w:tc>',$v);
    $v=trim($v);
    $v=str_replace("<br>","",$v);
    $v=str_replace("&nbsp;","",$v);
    //单元格处理
    $v=preg_replace("/<td(.*)>(.*)<\/td>/iUs","<td\\1><w:p><w:r><w:t>\\2</w:t></w:r></w:p></td>",$v);
    //替换tbody thead
    $v=preg_replace("/<table[^>]*/","<table>",$v);
    $v=preg_replace("/<td[^>]>/","<td>",$v);
    $v=preg_replace("/<[\/]?tbody[^>]*>/","",$v);
    $v=preg_replace("/<[\/]?thead[^>]*>/","",$v);

    $this->_data[$key]=str_replace(array("<table","</table","<tr","</tr","<td","</td"),array("<w:tbl","</w:tbl","<w:tr","</w:tr","<w:tc","</w:tc"),$v);
    }
    //解析表格自增
    public function parse_tr($key,$v){
    $v=preg_replace("/<td[^>]*>(.*)<\/td>/iUse","'<td>'.strip_tags('\\1').'</td>'",$v);
    $arr=explode("\${{$key}}",$this->content);
    $v=preg_replace("/<td[^>]*>(.*)<\/td>/iUs","<td>".strip_tags("\\1")."</td>",$v);
    if(!isset($arr[1])) return false;
    $start=explode("<w:tr ",$arr[0]."\${{$key}}");
    $end=explode("</w:tr>",$arr[1]);


    $str="<w:tr ".$start[count($start)-1].$end[0]."</w:tr>";
    //寻找上一行
    $last_str="<w:tr ".$start[count($start)-2];

    //文字<w:t>xx</w:t>
    $this->content=str_replace($str,"\${{$key}}",$this->content);
    preg_match_all("/(<tr[^>]*>.*<\/tr>)/iUs",$v,$g);
    $nv="";
    if(isset($g[1])){
    foreach($g[1] as $xx){
    $temp_tr=$last_str;
    preg_match_all("/<td[^>]>(.*)<\/td>/iUs",$xx,$tds);
    if($tds[1]){
    foreach($tds[1] as $vvvv){
    $temp_tr=preg_replace("/<w:t>(.*)<\/w:t>/iUs","<w:ttt>{$vvvv}</w:ttt>",$temp_tr,1);
    }
    $temp_tr=str_replace("w:ttt","w:t",$temp_tr);
    }
    $nv.=$temp_tr;
    }
    }
    $v=$this->replace($nv);
    //根据上级模版替换

    $this->_data[$key]=str_replace(array("<table","</table","<tr","</tr","<td","</td"),array("<w:tbl","</w:tbl","<w:tr","</w:tr","<w:tc","</w:tc"),$v);
    }
    //过滤html
    public function replace($v){
    $v=trim($v);
    $v=str_replace("<br>","",$v);
    $v=str_replace("&nbsp;","",$v);
    //单元格处理

    $v=preg_replace("/<td([^>]*)>(.*)<\/td>/iUs","<td\\1><w:p><w:r><w:t>\\2</w:t></w:r></w:p></td>",$v);
    $v=preg_replace("/<td[^>]>/","<td>",$v);
    return $v;
    }


    //解析html
    public function parse_html($key,$v){
    /*
    $arr=explode("\${{$key}}",$this->content);
    if(!isset($arr[1])) return false;
    $start=explode("<w:p ",$arr[0]."\${{$key}}");
    $end=explode("</w:p>",$arr[1]);
    $str="<w:p ".$start[count($start)-1].$end[0]."</w:p>";
    $this->content=str_replace($str,"\${{$key}}",$this->content);
    */
    $this->_data[$key]=$v;
    }

    public function saveImg(){
    //分析图片资源
    $relationsImgs=simplexml_load_string($this->zip->getFromName("word/_rels/document.xml.rels"));
    $pathImgs = array();

    foreach ($relationsImgs->Relationship as $relImg) {
    if ($relImg["Type"] == SCHEMA_IMAGEDOCUMENT) {
    $imgT=(string) $relImg["Target"];
    $ext=strstr($imgT,".");
    if(!file_exists("media")){
    mkdir("media",0777);
    }
    file_put_contents("media/".$relImg["Id"].".jpg",$this->zip->getFromName("word/$imgT"));
    $this->content=preg_replace("/<v:imagedata r:id=\"(rId\d+)\"/iUs","<img src='media/\\1.jpg'",$this->content);
    }
    }

    }
    public function xslt(){
    $doc = new DOMDocument();
    $xsl= new XSLTProcessor();
    $doc->load("docx2html.xsl");
    $xsl->importStyleSheet($doc);
    $doc->loadXML($this->content);
    echo $this->content=$xsl->transformToXML($doc);exit;
    }

    public function saveHtml(){

    $this->xslt();
    echo $this->content;
    }

    }

    ?>

  • 相关阅读:
    在Linux CentOS上编译并安装Clang 3.5.0
    在Linux CentOS 6.6上安装Python 2.7.9
    Mac OS X上用CoreCLR运行一个真正的.NET控制台程序
    在Mac OS X上用自己编译出的CoreCLR运行.NET程序
    Mac OS X上尝试编译CoreCLR源代码
    Linux上成功编译CoreCLR源代码
    CoreCLR中超过3万行代码的gc.cpp文件的来源
    Windows上成功编译CoreCLR源代码
    “CoreCLR is now Open Source”阅读笔记
    AutoMapper指定列名进行映射
  • 原文地址:https://www.cnblogs.com/lrjxgl/p/3078273.html
Copyright © 2020-2023  润新知