2010-07-19 17 views
5

所以我需要在Word文档中编辑一些文本。我创建了一个Word文档并将其保存为XML。它被正确保存(我可以在MS Word中打开XML文件,它看起来完全像docx原始文件)。在PHP中编辑word文件的问题

于是我使用PHP DOM文件中编辑一些文本(只是两行)(编辑 - 波纹管已经是固定的工作版本):

<?php 

$firstName = 'Richard'; 
$lastName = 'Knop'; 

$xml = file_get_contents('template.xml'); 

$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$doc->preserveWhiteSpace = false; 

$wts = $doc->getElementsByTagNameNS('http://schemas.openxmlformats.org/wordprocessingml/2006/main', 't'); 

$c1 = 0; $c2 = 0; 
foreach ($wts as $wt) { 

    if (1 === $c1) { 
     $wt->nodeValue .= ' ' . $firstName; 
     $c1++; 
    } 

    if (1 === $c2) { 
     $wt->nodeValue .= ' ' . $lastName; 
     $c2++; 
    } 

    if ('First Name' === substr($wt->nodeValue, 0, 10)) { 
     $c1++; 
    } 

    if ('Last Name' === substr($wt->nodeValue, 0, 9)) { 
     $c2++; 
    } 

} 

$xml = str_replace("\n", "\r\n", $xml); 

$fp = fopen('final-xml.xml', 'w'); 
fwrite($fp, $xml); 
fclose($fp); 

这被正确执行(没有错误)。这两条线路:

<w:t>First Name:</w:t> 
<w:t>Last Name:</w:t> 

被替换这些:

<w:t>First Name: Richard</w:t> 
<w:t>Last Name: Knop</w:t> 

然而,当我尝试打开MS Word中的最终xml.xml文件,它不会打开(字冻结) 。有什么建议么。

编辑:

我尝试使用莱文施泰因():

$xml = file_get_contents('template.xml'); 
$xml2 = file_get_contents('final-xml.xml'); 

$str = str_split($xml, 255); 
$str2 = str_split($xml2, 255); 

$i = 0; 
foreach ($str as $s) { 
    $dist = levenshtein($s, $str2[$i]); 
    if (0 <> $dist) { 
     echo $dist, '<br />'; 
    } 
    $i++; 
} 

哪个输出什么。

这很奇怪。当我在记事本中打开final-xml.xml文件时,我可以清楚地看到这两行改变了。

EDIT2:

这里是TEMPLATE.XML文件:http://uploading.com/files/61b2922b/template.xml/

+0

这可能是一个字符编码问题? – 2010-07-19 07:08:59

+1

你能否比较原始和结果,以验证这实际上是你做出的唯一改变? – mvds 2010-07-19 07:23:16

+0

我打算使用array_diff来尝试区分这两个XML文件。 – 2010-07-19 07:50:39

回答

7

这是关系到DOS VS Unix行结尾的一个问题。 Word 2007不允许\n行结束,它需要\r\n而Word 2010更宽容,并且接受这两个版本。

要解决此问题,确保您更换所有的UNIX符合DOS的人打破保存输出文件之前:

$xml = str_replace("\n", "\r\n", $xml); 

全样本:

<?php 

$firstName = 'Richard'; 
$lastName = 'Knop'; 

$xml = file_get_contents('template.xml'); 

$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$doc->preserveWhiteSpace = false; 

$wts = $doc->getElementsByTagNameNS('http://schemas.openxmlformats.org/wordprocessingml/2006/main', 't'); 

foreach ($wts as $wt) { 
    echo $wt->nodeValue; 

    if ('First Name:' === $wt->nodeValue) { 
     $wt->nodeValue = 'First Name: ' . $firstName; 
    } 

    if ('Last Name:' === substr($wt->nodeValue, 0, 10)) { 
     $wt->nodeValue = 'Last Name: ' . $lastName; 
    } 
} 

$xml = $doc->saveXML(); 

// Replace UNIX with DOS line endings 
$xml = str_replace("\n", "\r\n", $xml); 

$fp = fopen('final-xml.xml', 'w'); 
fwrite($fp, $xml); 
fclose($fp); 
?> 
+0

太棒了!你是一个很好的人。谢谢! – 2010-07-19 12:28:17

0

XML Word文件都存储一定的校验在dom顶部附近(到我的回忆)。您可能必须更改这些值,例如大小或一般校验和本身。

我知道这是我的问题,当我(哑)足以让字一个HTML文件并保存它,它有成千上万的无用的东西,只会使编辑变得更糟。

+1

这些都不是校验和,它们只是元数据,一旦文档再次保存,它将被Word更新。 – 2010-07-19 09:33:15