php解决word合并问题
目前碰见一个问题 需要把多个word进行合并,但是呢在合并过程中发现换行的问题出现,因为合并是基于word的xml来的
所以分析xml的问题
思路如下:
将多个xml读取到一个数组里面截取body部分,然后替换中间多余的段落行为空,组合成一个大的body,然后追加到第一个word里面
组件用的是tbszip 网上自己下载
合并10个word代码如下:
public function gettests()
{
include_once(APPPATH.'/libraries/tips/tbszip.php');
$zip = new clsTbsZip();
$path=APPPATH.'data/words/';
$filelist=scandir($path);
foreach($filelist as $ks=>$vs) {
if ($vs=='.' || $vs=='..' || $vs=='.DS_Store' || $vs=='0.docx') {
continue;
}
$zip->Open($path.$vs);
$content1 = $zip->FileRead('word/document.xml');
$zip->Close();
$p = strpos($content1, '<w:body');
if ($p===false) exit("失败");
$p = strpos($content1, '>', $p);
$content1 = substr($content1, $p+1);
$p = strpos($content1, '</w:body>');
if ($p===false) exit("失败");
$content1 = substr($content1, 0, $p);
$strs='<w:p><w:pPr><w:rPr><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr></w:pPr></w:p><w:p/><w:p/><w:p/><w:p/><w:p/><w:p/><w:p/><w:p/><w:p><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/></w:rPr></w:pPr></w:p><w:p/><w:p/><w:p/><w:p/><w:p/><w:p><w:r><mc:AlternateContent>';
$oldstrs='<w:p><w:pPr><w:rPr><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr></w:pPr></w:p><w:p/><w:p/><w:p/><w:p/><w:p/><w:p/><w:p/><w:p/><w:p><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/></w:rPr></w:pPr></w:p><w:p/><w:p/><w:p/><w:p><w:r><mc:AlternateContent>';
$content1=str_replace($strs,$oldstrs,$content1);
$contents[]=$content1;
}
$zip->Open($path."/0.docx");
$content2 = $zip->FileRead('word/document.xml');
$p = strpos($content2, '</w:body>');
if ($p===false) exit("失败");
$content2 = substr_replace($content2, implode('',$contents), $p, 0);
$zip->FileReplace('word/document.xml', $content2, TBSZIP_STRING);
$zip->Flush(TBSZIP_FILE, APPPATH.'data/merges/merges.docx');
}