From b5f71317b7ece6bfef348573d8bfdae13bc45594 Mon Sep 17 00:00:00 2001 From: Jeroen Moors Date: Mon, 16 Dec 2013 17:24:46 +0100 Subject: [PATCH 1/5] Create table rows on the fly with cloneRow() when using templates. --- Classes/PHPWord/Template.php | 29 ++++++++++++++++++++ samples/Sample_03_TemplateCloneRow.docx | Bin 0 -> 17543 bytes samples/Sample_03_TemplateCloneRow.php | 35 ++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 samples/Sample_03_TemplateCloneRow.docx create mode 100755 samples/Sample_03_TemplateCloneRow.php diff --git a/Classes/PHPWord/Template.php b/Classes/PHPWord/Template.php index eb6e42d2..3adb44a4 100755 --- a/Classes/PHPWord/Template.php +++ b/Classes/PHPWord/Template.php @@ -121,6 +121,35 @@ class PHPWord_Template preg_match_all('/\$\{(.*?)}/i', $this->_documentXML, $matches); return $matches[1]; } + + /** + * Clone a table row in a template document + * + * @param mixed $search + * @param mixed $numberOfClones + */ + public function cloneRow($search, $numberOfClones) { + if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') { + $search = '${'.$search.'}'; + } + + $tagPos = strpos($this->_documentXML, $search); + if (!$tagPos) { + trigger_error("Can not clone row, template variable not found or variable contains markup."); + return false; + } + $rowStartPos = strrpos($this->_documentXML, "_documentXML) - $tagPos) * -1)); + $rowEndPos = strpos($this->_documentXML, "", $tagPos) + 7; + + $result = substr($this->_documentXML, 0, $rowStartPos); + $xmlRow = substr($this->_documentXML, $rowStartPos, ($rowEndPos - $rowStartPos)); + for ($i = 1; $i <= $numberOfClones; $i++) { + $result .= preg_replace('/\$\{(.*?)\}/','\${\\1#'.$i.'}', $xmlRow); + } + $result .= substr($this->_documentXML, $rowEndPos); + + $this->_documentXML = $result; + } /** * Save Template diff --git a/samples/Sample_03_TemplateCloneRow.docx b/samples/Sample_03_TemplateCloneRow.docx new file mode 100644 index 0000000000000000000000000000000000000000..909f27abfef13543ebc734fed015c7ca2978456e GIT binary patch literal 17543 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 zllPAcumFArloadTemplate('Sample_03_TemplateCloneRow.docx'); + +$document->cloneRow('rowValue', 10); + +$document->setValue('rowValue#1', 'Sun'); +$document->setValue('rowValue#2', 'Mercury'); +$document->setValue('rowValue#3', 'Venus'); +$document->setValue('rowValue#4', 'Earth'); +$document->setValue('rowValue#5', 'Mars'); +$document->setValue('rowValue#6', 'Jupiter'); +$document->setValue('rowValue#7', 'Saturn'); +$document->setValue('rowValue#8', 'Uranus'); +$document->setValue('rowValue#9', 'Neptun'); +$document->setValue('rowValue#10', 'Pluto'); + +$document->setValue('rowNumber#1', '1'); +$document->setValue('rowNumber#2', '2'); +$document->setValue('rowNumber#3', '3'); +$document->setValue('rowNumber#4', '4'); +$document->setValue('rowNumber#5', '5'); +$document->setValue('rowNumber#6', '6'); +$document->setValue('rowNumber#7', '7'); +$document->setValue('rowNumber#8', '8'); +$document->setValue('rowNumber#9', '9'); +$document->setValue('rowNumber#10', '10'); + +$document->setValue('weekday', date('l')); +$document->setValue('time', date('H:i')); + +$document->save('SolarsystemRepeatingRows.docx'); From 21589ffa61920c7800d3de35e4801923a4fe9d44 Mon Sep 17 00:00:00 2001 From: Jeroen Moors Date: Mon, 16 Dec 2013 17:43:43 +0100 Subject: [PATCH 2/5] Renamed the output file to 'Sample_03_TemplateCloneRow_result.docx'. --- samples/Sample_03_TemplateCloneRow.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/Sample_03_TemplateCloneRow.php b/samples/Sample_03_TemplateCloneRow.php index eac91b86..4806d6b7 100755 --- a/samples/Sample_03_TemplateCloneRow.php +++ b/samples/Sample_03_TemplateCloneRow.php @@ -32,4 +32,4 @@ $document->setValue('rowNumber#10', '10'); $document->setValue('weekday', date('l')); $document->setValue('time', date('H:i')); -$document->save('SolarsystemRepeatingRows.docx'); +$document->save('Sample_03_TemplateCloneRow_result.docx'); From 590f08c42bd6e61bc83f0dfef77e950e16a8d9b3 Mon Sep 17 00:00:00 2001 From: Jeroen Moors Date: Fri, 10 Jan 2014 14:26:02 +0100 Subject: [PATCH 3/5] Update cloneRow function to support vertical spanned cells. --- Classes/PHPWord/Template.php | 79 ++++++++++++++++++++---- samples/Sample_03_TemplateCloneRow.docx | Bin 17543 -> 17939 bytes samples/Sample_03_TemplateCloneRow.php | 19 ++++++ 3 files changed, 86 insertions(+), 12 deletions(-) mode change 100644 => 100755 samples/Sample_03_TemplateCloneRow.docx diff --git a/Classes/PHPWord/Template.php b/Classes/PHPWord/Template.php index 3adb44a4..28608348 100755 --- a/Classes/PHPWord/Template.php +++ b/Classes/PHPWord/Template.php @@ -121,35 +121,90 @@ class PHPWord_Template preg_match_all('/\$\{(.*?)}/i', $this->_documentXML, $matches); return $matches[1]; } - + + /** + * Find the start position of the nearest table row before $offset + * + * @param mixed $offset + */ + private function _findRowStart($offset) { + return strrpos($this->_documentXML, "_documentXML) - $offset) * -1)); + } + + /** + * Find the end position of the nearest table row after $offset + * + * @param mixed $offset + */ + private function _findRowEnd($offset) { + return strpos($this->_documentXML, "", $offset) + 7; + } + + /** + * Get a slice of a string + * + * @param mixed $offset + */ + private function _getSlice($startPosition, $endPosition = 0) { + if (!$endPosition) { + $endPosition = strlen($this->_documentXML); + } + return substr($this->_documentXML, $startPosition, ($endPosition - $startPosition)); + } + /** * Clone a table row in a template document * * @param mixed $search * @param mixed $numberOfClones */ - public function cloneRow($search, $numberOfClones) { + public function cloneRow($search, $numberOfClones) { if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') { $search = '${'.$search.'}'; } - $tagPos = strpos($this->_documentXML, $search); + $tagPos = strpos($this->_documentXML, $search); if (!$tagPos) { trigger_error("Can not clone row, template variable not found or variable contains markup."); return false; } - $rowStartPos = strrpos($this->_documentXML, "_documentXML) - $tagPos) * -1)); - $rowEndPos = strpos($this->_documentXML, "", $tagPos) + 7; - - $result = substr($this->_documentXML, 0, $rowStartPos); - $xmlRow = substr($this->_documentXML, $rowStartPos, ($rowEndPos - $rowStartPos)); + + $rowStart = $this->_findRowStart($tagPos); + $rowEnd = $this->_findRowEnd($tagPos); + $xmlRow = $this->_getSlice($rowStart, $rowEnd); + + // Check if there's a cell spanning multiple rows. + if (preg_match('##', $xmlRow)) { + $extraRowStart = $rowEnd; + $extraRowEnd = $rowEnd; + while(true) { + $extraRowStart = $this->_findRowStart($extraRowEnd + 1); + $extraRowEnd = $this->_findRowEnd($extraRowEnd + 1); + + // If extraRowEnd is lower then 7, there was no next row found. + if ($extraRowEnd < 7) { + break; + } + + // If tmpXmlRow doesn't contain continue, this row is no longer part of the spanned row. + $tmpXmlRow = $this->_getSlice($extraRowStart, $extraRowEnd); + if (!preg_match('##', $tmpXmlRow) && !preg_match('##', $tmpXmlRow)) { + break; + } + // This row was a spanned row, update $rowEnd and search for the next row. + $rowEnd = $extraRowEnd; + } + $xmlRow = $this->_getSlice($rowStart, $rowEnd); + } + + $result = $this->_getSlice(0, $rowStart); for ($i = 1; $i <= $numberOfClones; $i++) { - $result .= preg_replace('/\$\{(.*?)\}/','\${\\1#'.$i.'}', $xmlRow); + $result .= preg_replace('/\$\{(.*?)\}/','\${\\1#'.$i.'}', $xmlRow); } - $result .= substr($this->_documentXML, $rowEndPos); - + $result .= $this->_getSlice($rowEnd); + $this->_documentXML = $result; - } + } /** * Save Template diff --git a/samples/Sample_03_TemplateCloneRow.docx b/samples/Sample_03_TemplateCloneRow.docx old mode 100644 new mode 100755 index 909f27abfef13543ebc734fed015c7ca2978456e..25a8c418b6795873777334de254fae7081e1fa14 GIT binary patch delta 5084 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 diff --git a/samples/Sample_03_TemplateCloneRow.php b/samples/Sample_03_TemplateCloneRow.php index 4806d6b7..2bbe2d5c 100755 --- a/samples/Sample_03_TemplateCloneRow.php +++ b/samples/Sample_03_TemplateCloneRow.php @@ -5,6 +5,7 @@ $PHPWord = new PHPWord(); $document = $PHPWord->loadTemplate('Sample_03_TemplateCloneRow.docx'); +// Simple table $document->cloneRow('rowValue', 10); $document->setValue('rowValue#1', 'Sun'); @@ -32,4 +33,22 @@ $document->setValue('rowNumber#10', '10'); $document->setValue('weekday', date('l')); $document->setValue('time', date('H:i')); +// Table with a spanned cell +$document->cloneRow('userId', 3); + +$document->setValue('userId#1', '1'); +$document->setValue('userFirstName#1', 'James'); +$document->setValue('userName#1', 'Taylor'); +$document->setValue('userPhone#1', '+1 428 889 773'); + +$document->setValue('userId#2', '2'); +$document->setValue('userFirstName#2', 'Robert'); +$document->setValue('userName#2', 'Bell'); +$document->setValue('userPhone#2', '+1 428 889 774'); + +$document->setValue('userId#3', '3'); +$document->setValue('userFirstName#3', 'Michael'); +$document->setValue('userName#3', 'Ray'); +$document->setValue('userPhone#3', '+1 428 889 775'); + $document->save('Sample_03_TemplateCloneRow_result.docx'); From 57f330c099b509da88a0785ca503bb9853e16b51 Mon Sep 17 00:00:00 2001 From: Jeroen Moors Date: Mon, 27 Jan 2014 10:21:43 +0100 Subject: [PATCH 4/5] Handle the cases were there's no whitespace after _documentXML, "_documentXML) - $offset) * -1)); + $rowStart = strrpos($this->_documentXML, "_documentXML) - $offset) * -1)); + if (!$rowStart) { + $rowStart = strrpos($this->_documentXML, "", ((strlen($this->_documentXML) - $offset) * -1)); + } + if (!$rowStart) { + trigger_error("Can not find the start position of the row to clone."); + return false; + } + return $rowStart; } /** @@ -137,7 +145,8 @@ class PHPWord_Template * @param mixed $offset */ private function _findRowEnd($offset) { - return strpos($this->_documentXML, "", $offset) + 7; + $rowEnd = strpos($this->_documentXML, "", $offset) + 7; + return $rowEnd; } /** From 43a00b16ffe34a2d1a27ae60a8d398cb1fc2806a Mon Sep 17 00:00:00 2001 From: Jeroen Moors Date: Fri, 7 Mar 2014 17:22:30 +0100 Subject: [PATCH 5/5] Renamed sample files. --- ...loneRow.docx => Sample_07_TemplateCloneRow.docx} | Bin ...eCloneRow.php => Sample_07_TemplateCloneRow.php} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename samples/{Sample_03_TemplateCloneRow.docx => Sample_07_TemplateCloneRow.docx} (100%) rename samples/{Sample_03_TemplateCloneRow.php => Sample_07_TemplateCloneRow.php} (93%) diff --git a/samples/Sample_03_TemplateCloneRow.docx b/samples/Sample_07_TemplateCloneRow.docx similarity index 100% rename from samples/Sample_03_TemplateCloneRow.docx rename to samples/Sample_07_TemplateCloneRow.docx diff --git a/samples/Sample_03_TemplateCloneRow.php b/samples/Sample_07_TemplateCloneRow.php similarity index 93% rename from samples/Sample_03_TemplateCloneRow.php rename to samples/Sample_07_TemplateCloneRow.php index 2bbe2d5c..1fa5bd56 100755 --- a/samples/Sample_03_TemplateCloneRow.php +++ b/samples/Sample_07_TemplateCloneRow.php @@ -3,7 +3,7 @@ require_once '../Classes/PHPWord.php'; $PHPWord = new PHPWord(); -$document = $PHPWord->loadTemplate('Sample_03_TemplateCloneRow.docx'); +$document = $PHPWord->loadTemplate('Sample_07_TemplateCloneRow.docx'); // Simple table $document->cloneRow('rowValue', 10);