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;
}

}

?>

原文地址:https://www.cnblogs.com/lrjxgl/p/3078273.html