我有一个docx文件,我需要替换一些文本。这是在codeigniter框架中完成的;以下是代码:
$this->load->library('word');
$template = $this->word->loadTemplate($_SERVER['DOCUMENT_ROOT'].'/doc/assets/doc3.docx');
$template->setValue('replacename', 'new');
$template->save($_SERVER['DOCUMENT_ROOT'].'/doc/assets/helloWorld.docx');
当我打开新文件时,我仍然得到"replacename“instad的" new”。"replacename“的格式为Verdana字体,9pt字号(无下划线或粗体)。为什么它不起作用?从setValue函数(和文档文件)中删除${ }可以正常工作
发布于 2015-02-22 22:09:12
事实证明,当您向word文件添加文本时,有时会在基础xml文件中创建额外的标签。因此(伪代码) ${NAME}
可以变成<tag1>${</tag1><tag2>NAME</tag2><tag3>}</tag3>
正因为如此,phpword找不到你的针。
我正在使用mac和microsoft word,我可以剪切word文件中的所有内容,然后再次粘贴它们。
然后,Word将重新创建基础xml文件,其中${NAME}是1个标记,而不是3个。
发布于 2014-01-31 00:29:07
我在http://phpword.codeplex.com/workitem/57中找到了解决方案...问题似乎出在word生成自己的代码的时候。
对于解决方案,只需将扩展模板重命名为zip,将名为'document.xml‘的文件签入到'word’文件夹中,然后搜索您的代码值...应该是这样的:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14">
<w:body>
<w:p w:rsidR="00AC49DC" w:rsidRDefault="00243DD6">
<w:r>
<w:t>${test1}</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00243DD6" w:rsidRDefault="00243DD6">
<w:r>
<w:t>${test2}</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00243DD6" w:rsidRDefault="00243DD6">
<w:r>
<w:t>${test3}</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00243DD6" w:rsidRDefault="00243DD6">
<w:r>
<w:t>${test4}</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00243DD6" w:rsidRDefault="00243DD6">
<w:r>
<w:t>${</w:t>
</w:r>
<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/>
<w:r>
<w:t>test5}</w:t>
</w:r>
</w:p>
<w:sectPr w:rsidR="00243DD6" w:rsidSect="00C107D0">
<w:pgSz w:w="12240" w:h="15840" w:code="1"/>
<w:pgMar w:top="907" w:right="907" w:bottom="907" w:left="907" w:header="720" w:footer="720" w:gutter="0"/>
<w:cols w:space="720"/>
<w:docGrid w:linePitch="272"/>
</w:sectPr>
</w:body>
</w:document>
发布于 2016-04-19 01:53:44
只需在文件"TemplateProcessor.php“中添加2个函数即可
public function setValueAdvanced($search_replace)
{
foreach ($this->tempDocumentHeaders as $index => $headerXML) {
$this->tempDocumentHeaders[$index] = $this->setValueForPartAdvanced($this->tempDocumentHeaders[$index], $search_replace);
}
$this->tempDocumentMainPart = $this->setValueForPartAdvanced($this->tempDocumentMainPart, $search_replace);
foreach ($this->tempDocumentFooters as $index => $headerXML) {
$this->tempDocumentFooters[$index] = $this->setValueForPartAdvanced($this->tempDocumentFooters[$index], $search_replace);
}
}
protected function setValueForPartAdvanced($documentPartXML, $search_replace)
{
$pattern = '/<w:t>(.*?)<\/w:t>/';
$rplStringBeginOffcetsStack = array();
$rplStringEndOffcetsStack = array();
$rplCleanedStrings = array();
$stringsToClean = array();
preg_match_all($pattern, $documentPartXML, $words, PREG_OFFSET_CAPTURE);
$bux_founded = false;
$searching_started = false;
foreach($words[1] as $key_of_words => $word)
{
$exploded_chars = str_split($word[0]);
foreach($exploded_chars as $key_of_chars => $char)
{
if ($bux_founded)
{
if ($searching_started)
{
if ($char == "}")
{
$bux_founded = false;
$searching_started = false;
array_push($rplStringEndOffcetsStack, ($word[1]+mb_strlen($word[0])+6));
}
}
else
{
if ($char == "{")
{
$searching_started = true;
}
else
{
$bux_founded = false;
array_pop($rplStringBeginOffcetsStack);
}
}
}
else
{
if ($char == "$")
{
$bux_founded = true;
array_push($rplStringBeginOffcetsStack, $word[1]-5);
}
}
}
}
for($index=0; $index<count($rplStringEndOffcetsStack); $index++)
{
$string_to_clean = substr($documentPartXML, $rplStringBeginOffcetsStack[$index], ($rplStringEndOffcetsStack[$index]-$rplStringBeginOffcetsStack[$index]));
array_push($stringsToClean, $string_to_clean);
preg_match_all($pattern, $string_to_clean, $words_to_concat);
$cleaned_string = implode("", $words_to_concat[1]);
$cleaned_string = preg_replace('/[${}]+/', '', $cleaned_string);
array_push($rplCleanedStrings, $cleaned_string);
}
for ($index=0; $index<count($rplCleanedStrings); $index++)
{
foreach($search_replace as $key_search => $replace)
{
if ($rplCleanedStrings[$index] == $key_search)
{
$documentPartXML = str_replace($stringsToClean[$index], "<w:t>".$replace."</w:t>", $documentPartXML);
break;
}
}
}
return $documentPartXML;
}
使用方法:使用一个数组作为函数"setValueAdvanced“的唯一参数,其中"key”-我们想要替换的单词,"value“-我们想粘贴的短语。重要提示:在MS Word文件中,使用"${word_to_replace}“来”标记“我们要替换的单词,但数组的关键字应该是"word_to_replace",而不是"${}”
示例代码:
require_once 'PhpWord/Autoloader.php';
use PhpOffice\PhpWord\Autoloader;
use PhpOffice\PhpWord\Settings;
define('CLI', (PHP_SAPI == 'cli') ? true : false);
define('EOL', CLI ? PHP_EOL : '<br />');
define('SCRIPT_FILENAME', basename($_SERVER['SCRIPT_FILENAME'], '.php'));
define('IS_INDEX', SCRIPT_FILENAME == 'index');
Autoloader::register();
Settings::loadConfig();
$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('your_file_name.docx');
$search_replace_array = array(
'msword_hello'=>'Hello', #inside a MS Word file ${msword_hello} will change to Hello
'msword_world'=>'World' #${msword_world} will change to World
);
$templateProcessor->setValueAdvanced($search_replace_array);
$templateProcessor->saveAs('your_file_name_changed.docx');
https://stackoverflow.com/questions/16794294
复制相似问题