Skip to content

Commit b147919

Browse files
committed
write column width in ODT writer
1 parent c52c96d commit b147919

File tree

7 files changed

+114
-31
lines changed

7 files changed

+114
-31
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ v0.15.0 (?? ??? 2018)
3333
- Fix colspan and rowspan for tables in HTML Writer @mattbolt #1292
3434
- Fix parsing of Heading and Title formating @troosan @gthomas2 #465
3535
- Fix Dateformat typo, fix hours casing, add Month-Day-Year formats @ComputerTinker #591
36+
- Fix missing column with in ODText writer @potofcoffee #413
3637

3738
### Changed
3839
- Remove zend-stdlib dependency @Trainmaster #1284

src/PhpWord/Element/Table.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,28 @@ public function countColumns()
149149

150150
return $columnCount;
151151
}
152+
153+
/**
154+
* The first declared cell width for each column
155+
*
156+
* @return int[]
157+
*/
158+
public function findFirstDefinedCellWidths()
159+
{
160+
$cellWidths = array();
161+
if (is_array($this->rows)) {
162+
foreach ($this->rows as $row) {
163+
$cells = $row->getCells();
164+
if (count($cells) <= count($cellWidths)) {
165+
continue;
166+
}
167+
$cellWidths = array();
168+
foreach ($cells as $cell) {
169+
$cellWidths[] = $cell->getWidth();
170+
}
171+
}
172+
}
173+
174+
return $cellWidths;
175+
}
152176
}

src/PhpWord/Style/Table.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,13 @@ class Table extends Border
159159
*/
160160
private $position;
161161

162+
/**
163+
* The width of each column, computed based on the max cell width of each column
164+
*
165+
* @var int[]
166+
*/
167+
private $columnWidths;
168+
162169
/**
163170
* Create new table style
164171
*
@@ -724,4 +731,24 @@ public function setPosition($value = null)
724731

725732
return $this;
726733
}
734+
735+
/**
736+
* Get the columnWidths
737+
*
738+
* @return number[]
739+
*/
740+
public function getColumnWidths()
741+
{
742+
return $this->columnWidths;
743+
}
744+
745+
/**
746+
* The column widths
747+
*
748+
* @param int[] $value
749+
*/
750+
public function setColumnWidths(array $value = null)
751+
{
752+
$this->columnWidths = $value;
753+
}
727754
}

src/PhpWord/Writer/ODText/Element/Table.php

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
namespace PhpOffice\PhpWord\Writer\ODText\Element;
1919

20+
use PhpOffice\Common\XMLWriter;
21+
use PhpOffice\PhpWord\Element\Row as RowElement;
22+
use PhpOffice\PhpWord\Element\Table as TableElement;
23+
2024
/**
2125
* Table element writer
2226
*
@@ -36,32 +40,59 @@ public function write()
3640
}
3741
$rows = $element->getRows();
3842
$rowCount = count($rows);
39-
$colCount = $element->countColumns();
4043

4144
if ($rowCount > 0) {
4245
$xmlWriter->startElement('table:table');
4346
$xmlWriter->writeAttribute('table:name', $element->getElementId());
4447
$xmlWriter->writeAttribute('table:style', $element->getElementId());
4548

46-
$xmlWriter->startElement('table:table-column');
47-
$xmlWriter->writeAttribute('table:number-columns-repeated', $colCount);
48-
$xmlWriter->endElement(); // table:table-column
49+
// Write columns
50+
$this->writeColumns($xmlWriter, $element);
4951

52+
// Write rows
5053
foreach ($rows as $row) {
51-
$xmlWriter->startElement('table:table-row');
52-
/** @var $row \PhpOffice\PhpWord\Element\Row Type hint */
53-
foreach ($row->getCells() as $cell) {
54-
$xmlWriter->startElement('table:table-cell');
55-
$xmlWriter->writeAttribute('office:value-type', 'string');
56-
57-
$containerWriter = new Container($xmlWriter, $cell);
58-
$containerWriter->write();
59-
60-
$xmlWriter->endElement(); // table:table-cell
61-
}
62-
$xmlWriter->endElement(); // table:table-row
54+
$this->writeRow($xmlWriter, $row);
6355
}
6456
$xmlWriter->endElement(); // table:table
6557
}
6658
}
59+
60+
/**
61+
* Write column.
62+
*
63+
* @param \PhpOffice\Common\XMLWriter $xmlWriter
64+
* @param \PhpOffice\PhpWord\Element\Table $element
65+
*/
66+
private function writeColumns(XMLWriter $xmlWriter, TableElement $element)
67+
{
68+
$colCount = $element->countColumns();
69+
70+
for ($i = 0; $i < $colCount; $i++) {
71+
$xmlWriter->startElement('table:table-column');
72+
$xmlWriter->writeAttribute('table:style-name', $element->getElementId() . '.' . $i);
73+
$xmlWriter->endElement();
74+
}
75+
}
76+
77+
/**
78+
* Write row.
79+
*
80+
* @param \PhpOffice\Common\XMLWriter $xmlWriter
81+
* @param \PhpOffice\PhpWord\Element\Row $row
82+
*/
83+
private function writeRow(XMLWriter $xmlWriter, RowElement $row)
84+
{
85+
$xmlWriter->startElement('table:table-row');
86+
/** @var $row \PhpOffice\PhpWord\Element\Row Type hint */
87+
foreach ($row->getCells() as $cell) {
88+
$xmlWriter->startElement('table:table-cell');
89+
$xmlWriter->writeAttribute('office:value-type', 'string');
90+
91+
$containerWriter = new Container($xmlWriter, $cell);
92+
$containerWriter->write();
93+
94+
$xmlWriter->endElement(); // table:table-cell
95+
}
96+
$xmlWriter->endElement(); // table:table-row
97+
}
6798
}

src/PhpWord/Writer/ODText/Part/Content.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ private function getContainerStyle($container, &$paragraphStyleCount, &$fontStyl
246246
$style = Style::getStyle($style);
247247
}
248248
$style->setStyleName($element->getElementId());
249+
$style->setColumnWidths($element->findFirstDefinedCellWidths());
249250
$this->autoStyles['Table'][] = $style;
250251
}
251252
}

src/PhpWord/Writer/ODText/Style/Table.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,18 @@ public function write()
4545
$xmlWriter->writeAttribute('table:align', 'center');
4646
$xmlWriter->endElement(); // style:table-properties
4747
$xmlWriter->endElement(); // style:style
48+
49+
$cellWidths = $style->getColumnWidths();
50+
51+
for ($i = 0; $i < count($cellWidths); $i++) {
52+
$width = $cellWidths[$i];
53+
$xmlWriter->startElement('style:style');
54+
$xmlWriter->writeAttribute('style:name', $style->getStyleName() . '.' . $i);
55+
$xmlWriter->writeAttribute('style:family', 'table-column');
56+
$xmlWriter->startElement('style:table-column-properties');
57+
$xmlWriter->writeAttribute('style:column-width', number_format($width * 0.0017638889, 2, '.', '') . 'cm');
58+
$xmlWriter->endElement(); // style:table-column-properties
59+
$xmlWriter->endElement(); // style:style
60+
}
4861
}
4962
}

src/PhpWord/Writer/Word2007/Element/Table.php

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -76,21 +76,7 @@ public function write()
7676
*/
7777
private function writeColumns(XMLWriter $xmlWriter, TableElement $element)
7878
{
79-
$rows = $element->getRows();
80-
$rowCount = count($rows);
81-
82-
$cellWidths = array();
83-
for ($i = 0; $i < $rowCount; $i++) {
84-
$row = $rows[$i];
85-
$cells = $row->getCells();
86-
if (count($cells) <= count($cellWidths)) {
87-
continue;
88-
}
89-
$cellWidths = array();
90-
foreach ($cells as $cell) {
91-
$cellWidths[] = $cell->getWidth();
92-
}
93-
}
79+
$cellWidths = $element->findFirstDefinedCellWidths();
9480

9581
$xmlWriter->startElement('w:tblGrid');
9682
foreach ($cellWidths as $width) {

0 commit comments

Comments
 (0)