Ric*_*nop 5 php ms-word ms-office
所以我需要编辑Word文档中的一些文本.我创建了一个Word文档并将其保存为XML.它保存正确(我可以在MS Word中打开XML文件,它看起来与docx原始文件完全一样).
那么我使用PHP DOM编辑文件中的一些文本(只有两行)(EDIT - bellow已经修复了工作版本):
<?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);
Run Code Online (Sandbox Code Playgroud)
这可以正确执行(没有错误).这两行:
<w:t>First Name:</w:t>
<w:t>Last Name:</w:t>
Run Code Online (Sandbox Code Playgroud)
取而代之的是:
<w:t>First Name: Richard</w:t>
<w:t>Last Name: Knop</w:t>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在MS Word中打开final-xml.xml文件时,它不会打开(Word冻结).有什么建议.
编辑:
我尝试使用levenstein():
$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++;
}
Run Code Online (Sandbox Code Playgroud)
什么都没输出.
这很奇怪.当我在记事本中打开final-xml.xml文件时,我可以清楚地看到这两行已经改变.
EDIT2:
这是template.xml文件:http://uploading.com/files/61b2922b/template.xml/
这是与DOS与UNIX行结尾相关的问题.Word 2007不允许\n行结束,它需要\r\nWord 2010更宽容并接受两个版本.
要解决此问题,请确保在保存输出文件之前将所有UNIX换行符替换为DOS换行符:
$xml = str_replace("\n", "\r\n", $xml);
Run Code Online (Sandbox Code Playgroud)
完整样本:
<?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);
?>
Run Code Online (Sandbox Code Playgroud)