PHPWord, как добавить текстовый разрыв / новую строку во время выполнения текста

Как добавить текстовый разрыв или перейти к следующей строке / строке во время выполнения текста? Я пытался просто сделать $section->addTextBreak(2); в то время как в текстовом прогоне, но он только добавил разрывы в раздел после текстового прогона. Я тоже пробовал $textrun->addTextBreak(2); но это дало мне роковую ошибку. Любые ответы будут с благодарностью.

10 ответов

Решение

Я боюсь, что это не будет возможно с текущей версией. У меня нет глубокого понимания этой библиотеки, но, посмотрев код, я обнаружил, что textRun класс состоит только из addText а также addLink методы.

Но мне также нужна эта функция вместе с несколькими другими, поэтому я собираюсь написать ее сам и создать запрос на включение, чтобы включить его в следующий выпуск (если он будет).

В основном это можно сделать, изменив textRun класс, добавив addLineBreak метод (так же, как в классе раздела), а затем изменить класс Base.php создать правильные элементы в итоговом документе.

В Docx xml эти линейные тормоза похожи на HTML br тег, но предыдущий текст должен быть закрыт и открыт после использования break следующим образом:

<w:r>
  <w:t>This is</w:t>
  <w:br/>
  <w:t xml:space="preserve"> a simple sentence.</w:t>
</w:r>

вместо того, чтобы просто делать

<w:r>
  <w:t>This is<w:br /> a simple sentence</w:t>
</w:r>

Так в base.phpвам нужно отредактировать поведение, чтобы создать этот блок кода.

Надеюсь, это было полезно!

РЕДАКТИРОВАТЬ

Я понял, что реализовать это очень просто. В textRun.php просто добавьте этот метод:

/**
* Add a TextBreak Element
*
* @param int $count
*/
public function addTextBreak($count = 1) {
    for($i=1; $i<=$count; $i++) {
        $this->_elementCollection[] = new PHPWord_Section_TextBreak();
    }
}

И в Base.php в _writeTextRun метод в конце этого метода добавить это условие:

elseif($element instanceof PHPWord_Section_TextBreak) {
    $objWriter->writeElement('w:br');
}

Вопрос был задан 3 года назад, но у меня та же проблема, и я нашел решение. Может быть, это может помочь новым пользователям PHPWord.

Чтобы добавить crlf в документ Word, тег может помочь:

$section->addText('Some text <w:br/> another text in the line ');

Я нашел решение здесь: http://jeroen.is/phpword-line-breaks/

Try this one:

          str_replace("\n", '</w:t><w:br/><w:t xml:space="preserve">', $yourData );

or this one

          str_replace("\r\n", '</w:t><w:br/><w:t xml:space="preserve">', $yourData );

Вы можете иметь текст и добавить \n где бы вы ни хотели иметь разрывы строк, а все остальное сделайте так:

$text = "foo\nbar\nfoobar";
$textlines = explode("\n", $text);

$textrun = $section->addTextRun();
$textrun->addText(array_shift($textlines));

foreach($textlines as $line) {
    $textrun->addTextBreak();
    // maybe twice if you want to seperate the text
    // $textrun->addTextBreak(2);
    $textrun->addText($line);
}

Добавление новой строки в phpword беспокоило меня, и я, наконец, нашел решение, случайно, так что вот оно: И это оправдывает текст.

$PHPWord->addParagraphStyle('pJustify', array('align' => 'both', 'spaceBefore' => 0, 'spaceAfter' => 0, 'spacing' => 0));
//add this style then append it to text below
$section->addText('something', 'textstyle', 'pJustify');
//the text behind this will be justified and will be in a new line, not in a new paragraph
$section->addText('behind', 'textstyle', 'pJustify');

Это выведет:

что-то

позади

Это просто: просто запустите новый textrun и, прежде чем добавить текстовый разрыв в раздел, как это (протестировано в формате docx):

$textrun = $section->addTextRun();

$textrun->addText('blah-blah', 'p_bold');

  $section->addTextBreak(2);

  $textrun = $section->addTextRun();

  $textrun->addText('blah-blah-blah in new line ', 'p');

  $textrun->addText('blah-blah', 'p_bold');

  $textrun->addText('blah-blah', 'p');

  $section->addTextBreak(2);

  $textrun = $section->addTextRun();

  $textrun->addText('blahblah', 'p');

Я не знаю, был ли включен PR из принятого ответа, или это было на самом деле уже возможно в 2013 году, но независимо от того, с 2015 года, если не раньше, правильный путь вставки разрывов строк в абзаце указан в первоначальном ответе на #553 на GitHub:

  • Создать TextRun для абзаца;
  • Добавить разрывы строк вTextRun позвонив addTextBreak() метод TextRunсам.

Вот функция, которая позаботится об этом для полного абзаца текста в строке, содержащей буквенные разрывы строк (CR-LF ["\r\n"], LF ["\n"] или CR ["\r"]):

/**
 * @param \PhpOffice\PhpWord\Element\AbstractContainer $container
 *        E.g. a section or table cell.
 * @param string $text String with literal line breaks as CR-LF, LF or CR.
 * @param string|array|\PhpOffice\PhpWord\Style\Paragraph $paragraphStyle
 * @param string|array|\PhpOffice\PhpWord\Style\Font $fontStyle
 *
 * @return \PhpOffice\PhpWord\Element\TextRun
 */
function addTextWithLineBreaks(
  \PhpOffice\PhpWord\Element\AbstractContainer $container,
  $text,
  $fontStyle,
  $paragraphStyle
) {
  $textRun = $container->addTextRun($paragraphStyle);
  foreach (preg_split('/(\\r\\n?+|\\n)/',
    $text,
    -1,
    PREG_SPLIT_DELIM_CAPTURE
  ) as $i => $part) {
    if ($i & 1) {
      $textRun->addTextBreak(1, $fontStyle, $paragraphStyle);
    } else {
      $textRun->addText($part, $fontStyle, $paragraphStyle);
    }
  }
  return $textRun;
}

PHPWord (0.14.0) в настоящее время игнорирует разрывы строк при чтении документов Word2007 - надеюсь, это будет исправлено до версии 1.0 - но вывод из вышеупомянутого корректен при открытии в Word.

Для корректной работы необходимо добавить текстовый блок:

$string = strtr($string, [
   "\n" => "</w:t>\n<w:br />\n<w:t xml:space=\"preserve\">"
]);

Использовать PHP_EOL для разрыва строки - это единственное решение для разрыва строки в PHPWord

Я перепробовал ВСЕ опубликованные решения на github, stackoverflow, разных сайтах, гуглил 3 дня, и ничего не помогло. Итак, я подошел к документу docx, переименовал его расширение в zip и проверил схему XML документа.

Итак, есть небольшой код, который можно использовать для вставки новой строки без ошибки разрыва текста:

      <?php
$textRun = new TextRun();
$textRun>addText('A long text here');

// new line
$textRun->addText('</w:t></w:r></w:p>
    <w:p>
      <w:pPr>
      <w:contextualSpacing/>
        <w:jc w:val="both"/>
        <w:rPr>
          <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
        </w:rPr>
      </w:pPr>
      <w:r>
      <w:t>');

// a second row
$textRun>addText('Another long text here');

// replace a variable
$doc->setComplexValue('Variable', $textRun);

В моем случае я использую Times New Roman и выравниваю текст по ширине. Вы можете задать свои параметры для абзаца, но указывать их следует в формате ooxml с помощью тегов. Надеюсь, это кому-нибудь поможет

Другие вопросы по тегам