PHPWord LineBreak в TextRun не работает

Я нашел совет из старого вопроса Stack Over Flow, и у меня возникли проблемы с его работой. Я добавил методы, в которых они описаны, но в сгенерированном файле слов нет разрывов строк (визуально и путем проверки файла docx после его распаковки). Там нет ошибок, поэтому метод, кажется, делает что-то просто не то, что я хочу. Я делаю это, так как мне нужно \n символы, и я сделал это, чтобы работать нормально, используя PHPRtfText, но были проблемы с совместимостью, и, кажется, он работает лучше, чем файлы Word2007, поэтому я соответственно преобразовал код. Хотя, возможно, я поместил его не в ту точку, но вот измененная функция:

/lib/PHPWord/Writer/Word2007/Base.php:

protected function _writeTextRun(PHPWord_Shared_XMLWriter $objWriter = null,    PHPWord_Section_TextRun $textrun)
{
  $elements = $textrun->getElements();
  $styleParagraph = $textrun->getParagraphStyle();

  $SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;

  $objWriter->startElement('w:p');

  if($SpIsObject)
  {
     $this->_writeParagraphStyle($objWriter, $styleParagraph);
  }
  elseif(!$SpIsObject && !is_null($styleParagraph))
  {
     $objWriter->startElement('w:pPr');
        $objWriter->startElement('w:pStyle');
           $objWriter->writeAttribute('w:val', $styleParagraph);
        $objWriter->endElement();
     $objWriter->endElement();
  }

  if(count($elements) > 0)
  {
     foreach($elements as $element)
     {
        if($element instanceof PHPWord_Section_Text)
        {
           $this->_writeText($objWriter, $element, true);
        }
        elseif($element instanceof PHPWord_Section_Link)
        {
           $this->_writeLink($objWriter, $element, true);
        }
     }
  }
  elseif($element instanceof PHPWord_Section_TextBreak)
  {
     $objWriter->writeElement('w:br');
  }

  $objWriter->endElement();
}

Я призываю это:

test1.php:

$PHPWord = new PHPWord();;
$PHPWord->setDefaultFontName('Calibri');
$PHPWord->setDefaultFontSize(11);

$section = $PHPWord->createSection();
$textrun = $section->createTextRun();
$textrun->addText( "---------------");
$textrun->addTextBreak();
$textrun->addText( "$name", array('bold'=>true ) );

И, наконец, в /lib/PHPWord/Section/TextRun.php:

public function addTextBreak($count = 1)
{
    for($i=1; $i<=$count; $i++)
    {
        $this->_elementCollection[] = new PHPWord_Section_TextBreak();
    }
}

Могу ли я добавить что-нибудь еще, чтобы помочь? Мне действительно нужно, чтобы это работало, и я не могу снова изменить класс на что-то другое.

Я сильно форматирую текст, таким образом textrun, но мне нужно \n после каждой строки не раздел, так как он должен быть одним и тем же абзацем, поэтому \n\n не будет приемлемым для этого усилия.

1 ответ

Решение

Я определенно подумал, что попробовал это, но, возможно, я не сохранил его на веб-сервере, но переместил elseif в более высокий блок elseif, и все получилось.

if(count($elements) > 0) 
  {
     foreach($elements as $element) 
     {
        if($element instanceof PHPWord_Section_Text) 
        {
           $this->_writeText($objWriter, $element, true);
            } 
        elseif($element instanceof PHPWord_Section_Link) 
        {
           $this->_writeLink($objWriter, $element, true);
            }
        elseif($element instanceof PHPWord_Section_TextBreak)
        {        
           $objWriter->writeElement('w:br');
        }              
     }
  } 
  $objWriter->endElement();
}
Другие вопросы по тегам