php - 在 PHP 中编辑 word 文件时出现问题

标签 php ms-word ms-office

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

然后我使用 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 中打开 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++;
}

什么都不输出。

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

编辑2:

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

最佳答案

这是一个与 DOS 和 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);
?>

关于php - 在 PHP 中编辑 word 文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3279031/

相关文章:

php - 过滤一些词

php - cakephp - 触发 - 执行查询后

excel - 如何在excel中合并两个具有相同字段名称的单元格

mysql - Access 不导入 MySQL 链接表的关系

Excel - 根据另一个字段计算范围内的唯一性

php - Linux:为 Monkey 服务器设置 PHP FastCGI

javascript - 从没有谷歌地理定位的地址获取纬度/经度

javascript - 将 HTML 表格复制到 Word 文件 - 覆盖错误

ms-word - 如何比较两个word文档?

vba - word中上一个标题的文本