2010-07-19 15 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