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 с помощью тегов. Надеюсь, это кому-нибудь поможет