Reputation: 213
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.
Upvotes: 12
Views: 53072
Reputation: 450
The question was asked 3 years ago but I have the same problem and I found a solution. Maybe this can help new users of PHPWord
.
To add a crlf in Word document the tag <w:br/>
can help :
$section->addText('Some text <w:br/> another text in the line ');
I found the solution here : http://jeroen.is/phpword-line-breaks/
Upvotes: 22
Reputation: 306
I have tried ALL the posted decisions on github, stackoverflow, different sites, I was googling for 3 days and nothing worked. So I went to the docx document, renamed its extension to the zip, and checked the document xml schema.
So there is a bit of code, that can be used for inserting a new line without text break bug:
<?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);
In my case I'm using Times New Roman, and justify text alignment. You can set your own options for the paragraph, but you should specify them in ooxml format using tags. Hope this helps somebody
Upvotes: 0
Reputation: 119
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 );
Upvotes: 8
Reputation: 71
use PHP_EOL for line break it is the only solution for line break in PHPWord
Upvotes: 0
Reputation: 943
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);
}
Upvotes: 7
Reputation: 1067
I don't know if a PR from the accepted answer was incorporated or it was in fact already possible in 2013, but regardless, since 2015 if not earlier, the correct way to insert line breaks within a paragraph is indicated in the initial response to #553 on GitHub:
TextRun
for the paragraph;TextRun
by calling the addTextBreak()
method of the TextRun
itself.Here's a function that will take care of this for a complete paragraph of text in a string containing literal line-breaks (CR-LF ["\r\n"
], LF ["\n"
] or 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) currently discards line breaks when reading Word2007 documents – hopefully that will be fixed before 1.0 – but the output from the above is correct when opened in Word.
Upvotes: 1
Reputation: 11
For correct work, you need to add a text block:
$string = strtr($string, [
"\n" => "</w:t>\n<w:br />\n<w:t xml:space=\"preserve\">"
]);
Upvotes: 1
Reputation: 69
It's easy: just start a new textrun, and before it add textbreak to the section, like this (tested with docx format):
$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');
Upvotes: 2
Reputation: 481
I'm afraid that this will not be possible with current version. I don't have deep understanding of this library, but from looking at the code, I found out that the textRun
class consist only of addText
and addLink
methods.
But I also need this feature along with several others, so I'm going to write it myself and create a pull request to get it included in the next release (if there will be any).
Basically it can be done by modifying the textRun
class, adding an addLineBreak
method (similar way as it is in the section class) and then modify class Base.php
to create proper elements in final document.
In Docx xml, those line brakes are similar to the html br
tag, but previous text must be closed and reopened after using break like this:
<w:r>
<w:t>This is</w:t>
<w:br/>
<w:t xml:space="preserve"> a simple sentence.</w:t>
</w:r>
instead of simply doing
<w:r>
<w:t>This is<w:br /> a simple sentence</w:t>
</w:r>
So in base.php
, you'll need to edit behavior to create this block of code.
Hope this was useful!
EDIT
I have figured out that implementing this is very simple. In textRun.php
just add this method:
/**
* Add a TextBreak Element
*
* @param int $count
*/
public function addTextBreak($count = 1) {
for($i=1; $i<=$count; $i++) {
$this->_elementCollection[] = new PHPWord_Section_TextBreak();
}
}
and in Base.php
in the _writeTextRun
method at the end of this method add this condition:
elseif($element instanceof PHPWord_Section_TextBreak) {
$objWriter->writeElement('w:br');
}
Upvotes: 9
Reputation: 163
Adding a newline in phpword has bothered me, and I finnaly found solution, by accident, so here it is: And this justifies the text.
$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');
This will output:
something
behind
Upvotes: 3