PhpWord не замяняе тэкст

У мяне ёсць файл 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» замест ўнясення «новага». «Replacename» адфарматаваны з Verdana шрыфта, памер шрыфта 9PT (без падкрэслівання або тлустым шрыфтам). Чаму гэта не працуе? Выдаленне $ {} з SetValue функцыі (і з док-файла) ён працуе

8
Я атрымліваю NULL.Thanks
дададзена аўтар pindol, крыніца
грамадская функцыя SetValue ($ пошук, $ замяніць) {калі (падрадок ($ пошук, 0, 2)! == '$ {' && зиЬзЬг ($ пошук, -1)! == '}') {$ пошук = ' $ { ». $ пошук. '}'; (! Is_array ($ замяніць))}, калі {$ замяніць = utf8_encode ($ замяніць); } $ Гэта -> _ documentXML = str_replace ($ пошук, $ замяніць, $ гэта -> _ documentXML); }
дададзена аўтар pindol, крыніца
Добра зроблена, прабачце :) у любым выпадку гэта функцыя па змаўчанні, я не рэдагаваць яго
дададзена аўтар pindol, крыніца
якая функцыя SetValue павінна вяртаць?
дададзена аўтар pindol, крыніца
Я атрымліваю ўвесь тэкст ўнутры файла док і ёсць таксама replacename (з $ {})
дададзена аўтар pindol, крыніца
падзяліцца тым, што вы атрымліваеце, калі вы робіце var_dump (SetValue ( 'replacename', 'новы'));
дададзена аўтар Ahmed, крыніца
Гэта азначае, што SetValue() не працуе. Вы можаце падзяліцца гэтай функцыяй таксама
дададзена аўтар Ahmed, крыніца
Лепш змяніць гэта ў вас пытанне
дададзена аўтар Ahmed, крыніца
яна выглядае добра. Вы павінны адладзіць гэтую функцыю, паставіўшы var_dumps пасля кожнага радка ў гэтай функцыі і паглядзець, што яна вяртае.
дададзена аўтар Ahmed, крыніца
бачыць, што вы атрымліваеце ў _documentXML па паўтараючы яго
дададзена аўтар Ahmed, крыніца
дададзена аўтар Ahmed, крыніца
Ахан, пакласці рэха $ пошук; выхад (); пасля 1 , калі блок і паглядзець, калі вы атрымліваеце праўдзівыя каштоўнасці для яго. Тое ж самае з $ замяніць
дададзена аўтар Ahmed, крыніца

7 адказы

Я знайшоў рашэнне ў http://phpword.codeplex.com/workitem/57 ... праблема, як уяўляецца, калі слова генеруе свой уласны код.

для вырашэння, проста перайменаваць пашырэнне шаблон для маланкі, праверце ў файле з імем «document.xml» ў тэчку «слова», і пошук значэння кода ... гэта павінна быць так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

    
        
            
                ${test1}
            
        
        
            
                ${test2}
            
        
        
            
                ${test3}
            
        
        
            
                ${test4}
            
        
        
            
                ${
            
            
            
            
                test5}
            
        
        
            
            
            
            
        
    

4
дададзена

It turns out that when you add text to a word file, it sometimes creates extra tags in the underlying xml file. So (pseudo code) ${NAME} can become ${NAME}

З-за гэтага, phpword не можа знайсці іголку.

Я выкарыстоўваю Макінтош з Microsoft Word, і я магу проста выразаць усё змесціва файла словы і ўставіць іх зноў.

Слова будзе чым ўзнавіць базавы файл XML, у якім $ {NAME} з'яўляецца 1 тэг замест 3.

4
дададзена

Проста дадайце 2 функцыю ў файл «TemplateProcessor.php»

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>/';
        $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 $replace)
            {
                if ($rplCleanedStrings[$index] == $key_search)
                {
                    $documentPartXML = str_replace($stringsToClean[$index], "".$replace."", $documentPartXML);
                    break;
                }
            }
        }
        return $documentPartXML;
    }

Як выкарыстоўваць: Выкарыстанне масіва ў якасці адзінага параметру функцыі «setValueAdvanced», дзе «ключ» - гэта слова, што мы хочам замяніць, і «значэнне» - фраза, мы хочам, каб ўставіць замест. важна: Ўнутры выкарыстанне файла 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 : '
'); 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');
3
дададзена

Вы можаце выкарыстоўваць новы клас шаблону з новым метадам SetValue ()


        
            {
        
        
        
        
            test5}
        
    

Новы метад можа замяніць яго SetValue ( 'test5', 'MyValue');

Download new class: https://github.com/Arisse/PHPWord_CloneRow

2
дададзена

тут я стараюся і працую добра,

SetValue функцыя не працуе, таму што яна ўключае фармат слова пасля таго, як генераваць у Інтэрнэце. так што тэкст, які вы маглі б замяніць не знойдзеныя.

раствор проста ўвядзіце $ {replaceKey} для нататніка і скапіяваць яго ў your_template.docx гэта працуе для мяне.

нататніка зрабіць усё фармат словы не ўключаны ў шаблон, так што функцыя SetValue можа яго знайшоў, як і чакалася.

Спадзяюся, што гэта Дапамагаючы вам, хлопцы.

1
дададзена
Гэта працуе для мяне, дзякуй!
дададзена аўтар user1105056, крыніца

Я стварыў кругавой шаблон з шаблону, дзе я запоўніў поле з патрабаванымі $ {Value} значэннямі. Я зліўся і захаваў вынік як новы шаблон. Так прыняў каштоўнасці

0
дададзена
Як гэта палепшыць папярэднія адказы? Вы можаце ўдакладніць трохі на yoyr рашэнне?
дададзена аўтар Gilles Gouaillardet, крыніца

маё рашэнне

function replaceText($element, $variable, $value) {
$text_class = 'PhpOffice\PhpWord\Element\Text';
$table_class = 'PhpOffice\PhpWord\Element\Table';
foreach ($element as $e) {
    if (get_class($e) !== $text_class && method_exists($e, 'getElements')) {
        replaceText($e->getElements(), $variable, $value);
    } elseif (get_class($e) === $text_class && ($match_count = substr_count($e->getText(), $variable))) {
        for ($i = 1; $i <= $match_count; $i++) {
            $e->setText(str_replace($variable, $value, $e->getText()));
        }
    } elseif (get_class($e) === $table_class && ($row_count = count($e->getRows()))) {
        foreach ($e->getRows() as $row) {
            foreach ($row->getCells() as $cell) {
                replaceText($cell->getElements(), $variable, $value);
            }
        }
    }
}

}

$path = public_path('test.docx');//Path to template document. public_path() Laravel function
$objReader = \PhpOffice\PhpWord\IOFactory::createReader('Word2007');//Here can be 'ODText' = .odt, 'Word2007' = .docx etc.
$docx = $objReader->load($path);
replaceText($docx->getSections(), '${text}', 'This will be in your document');//'${text}' can be any text like 'Simple text'
$docx->save('test2.docx');
0
дададзена