How can I add a text break or go to the next line/row while in a text run? I tried to just do $section->addTextBreak(2);
while in the text run but it just added the breaks to the section after the text run. I also tried $textrun->addTextBreak(2);
but it gave me a fatal error. Any responses would be greatly appreciated.
9 回答
这个问题是 3 年前提出的,但我有同样的问题,我找到了解决方案。也许这可以帮助 PHPWord 的新用户。
要在 Word 文档中添加 crlf,该标签可以提供帮助:
$section->addText('Some text <w:br/> another text in the line ');
我在这里找到了解决方案:http: //jeroen.is/phpword-line-breaks/
恐怕当前版本无法做到这一点。我对这个库没有深入的了解,但是通过查看代码,我发现textRun
该类仅由addText
和addLink
方法组成。
但我也需要这个特性以及其他几个特性,所以我将自己编写它并创建一个拉取请求以将其包含在下一个版本中(如果有的话)。
基本上它可以通过修改textRun
类,添加一个addLineBreak
方法(类似于在部分类中的方式)然后修改类Base.php
以在最终文档中创建适当的元素来完成。
在 Docx xml 中,这些换行符类似于 htmlbr
标签,但之前的文本必须在使用 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');
}
You can have a text and add \n
where ever you want to have line breaks, and do the rest like this:
$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,然后在它添加 textbreak 到该部分之前,就像这样(使用 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');
试试这个:
str_replace("\n", '</w:t><w:br/><w:t xml:space="preserve">', $yourData );
或者这个
str_replace("\r\n", '</w:t><w:br/><w:t xml:space="preserve">', $yourData );
我不知道是否包含来自已接受答案的 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 中换行的唯一解决方案