write column width in ODT writer

This commit is contained in:
troosan 2018-04-18 22:34:53 +02:00
parent 844a7c95ba
commit d9ddc162a3
7 changed files with 114 additions and 31 deletions

View File

@ -36,6 +36,7 @@ v0.15.0 (?? ??? 2018)
- Fix colspan and rowspan for tables in HTML Writer @mattbolt #1292 - Fix colspan and rowspan for tables in HTML Writer @mattbolt #1292
- Fix parsing of Heading and Title formating @troosan @gthomas2 #465 - Fix parsing of Heading and Title formating @troosan @gthomas2 #465
- Fix Dateformat typo, fix hours casing, add Month-Day-Year formats @ComputerTinker #591 - Fix Dateformat typo, fix hours casing, add Month-Day-Year formats @ComputerTinker #591
- Fix missing column with in ODText writer @potofcoffee #413
### Changed ### Changed
- Remove zend-stdlib dependency @Trainmaster #1284 - Remove zend-stdlib dependency @Trainmaster #1284

View File

@ -149,4 +149,28 @@ class Table extends AbstractElement
return $columnCount; return $columnCount;
} }
/**
* The first declared cell width for each column
*
* @return int[]
*/
public function findFirstDefinedCellWidths()
{
$cellWidths = array();
if (is_array($this->rows)) {
foreach ($this->rows as $row) {
$cells = $row->getCells();
if (count($cells) <= count($cellWidths)) {
continue;
}
$cellWidths = array();
foreach ($cells as $cell) {
$cellWidths[] = $cell->getWidth();
}
}
}
return $cellWidths;
}
} }

View File

@ -163,6 +163,13 @@ class Table extends Border
/** @var TblWidthComplexType|null */ /** @var TblWidthComplexType|null */
private $indent; private $indent;
/**
* The width of each column, computed based on the max cell width of each column
*
* @var int[]
*/
private $columnWidths;
/** /**
* Create new table style * Create new table style
* *
@ -748,4 +755,24 @@ class Table extends Border
return $this; return $this;
} }
/**
* Get the columnWidths
*
* @return number[]
*/
public function getColumnWidths()
{
return $this->columnWidths;
}
/**
* The column widths
*
* @param int[] $value
*/
public function setColumnWidths(array $value = null)
{
$this->columnWidths = $value;
}
} }

View File

@ -17,6 +17,10 @@
namespace PhpOffice\PhpWord\Writer\ODText\Element; namespace PhpOffice\PhpWord\Writer\ODText\Element;
use PhpOffice\Common\XMLWriter;
use PhpOffice\PhpWord\Element\Row as RowElement;
use PhpOffice\PhpWord\Element\Table as TableElement;
/** /**
* Table element writer * Table element writer
* *
@ -36,18 +40,48 @@ class Table extends AbstractElement
} }
$rows = $element->getRows(); $rows = $element->getRows();
$rowCount = count($rows); $rowCount = count($rows);
$colCount = $element->countColumns();
if ($rowCount > 0) { if ($rowCount > 0) {
$xmlWriter->startElement('table:table'); $xmlWriter->startElement('table:table');
$xmlWriter->writeAttribute('table:name', $element->getElementId()); $xmlWriter->writeAttribute('table:name', $element->getElementId());
$xmlWriter->writeAttribute('table:style', $element->getElementId()); $xmlWriter->writeAttribute('table:style', $element->getElementId());
$xmlWriter->startElement('table:table-column'); // Write columns
$xmlWriter->writeAttribute('table:number-columns-repeated', $colCount); $this->writeColumns($xmlWriter, $element);
$xmlWriter->endElement(); // table:table-column
// Write rows
foreach ($rows as $row) { foreach ($rows as $row) {
$this->writeRow($xmlWriter, $row);
}
$xmlWriter->endElement(); // table:table
}
}
/**
* Write column.
*
* @param \PhpOffice\Common\XMLWriter $xmlWriter
* @param \PhpOffice\PhpWord\Element\Table $element
*/
private function writeColumns(XMLWriter $xmlWriter, TableElement $element)
{
$colCount = $element->countColumns();
for ($i = 0; $i < $colCount; $i++) {
$xmlWriter->startElement('table:table-column');
$xmlWriter->writeAttribute('table:style-name', $element->getElementId() . '.' . $i);
$xmlWriter->endElement();
}
}
/**
* Write row.
*
* @param \PhpOffice\Common\XMLWriter $xmlWriter
* @param \PhpOffice\PhpWord\Element\Row $row
*/
private function writeRow(XMLWriter $xmlWriter, RowElement $row)
{
$xmlWriter->startElement('table:table-row'); $xmlWriter->startElement('table:table-row');
/** @var $row \PhpOffice\PhpWord\Element\Row Type hint */ /** @var $row \PhpOffice\PhpWord\Element\Row Type hint */
foreach ($row->getCells() as $cell) { foreach ($row->getCells() as $cell) {
@ -61,7 +95,4 @@ class Table extends AbstractElement
} }
$xmlWriter->endElement(); // table:table-row $xmlWriter->endElement(); // table:table-row
} }
$xmlWriter->endElement(); // table:table
}
}
} }

View File

@ -246,6 +246,7 @@ class Content extends AbstractPart
$style = Style::getStyle($style); $style = Style::getStyle($style);
} }
$style->setStyleName($element->getElementId()); $style->setStyleName($element->getElementId());
$style->setColumnWidths($element->findFirstDefinedCellWidths());
$this->autoStyles['Table'][] = $style; $this->autoStyles['Table'][] = $style;
} }
} }

View File

@ -45,5 +45,18 @@ class Table extends AbstractStyle
$xmlWriter->writeAttribute('table:align', 'center'); $xmlWriter->writeAttribute('table:align', 'center');
$xmlWriter->endElement(); // style:table-properties $xmlWriter->endElement(); // style:table-properties
$xmlWriter->endElement(); // style:style $xmlWriter->endElement(); // style:style
$cellWidths = $style->getColumnWidths();
for ($i = 0; $i < count($cellWidths); $i++) {
$width = $cellWidths[$i];
$xmlWriter->startElement('style:style');
$xmlWriter->writeAttribute('style:name', $style->getStyleName() . '.' . $i);
$xmlWriter->writeAttribute('style:family', 'table-column');
$xmlWriter->startElement('style:table-column-properties');
$xmlWriter->writeAttribute('style:column-width', number_format($width * 0.0017638889, 2, '.', '') . 'cm');
$xmlWriter->endElement(); // style:table-column-properties
$xmlWriter->endElement(); // style:style
}
} }
} }

View File

@ -76,21 +76,7 @@ class Table extends AbstractElement
*/ */
private function writeColumns(XMLWriter $xmlWriter, TableElement $element) private function writeColumns(XMLWriter $xmlWriter, TableElement $element)
{ {
$rows = $element->getRows(); $cellWidths = $element->findFirstDefinedCellWidths();
$rowCount = count($rows);
$cellWidths = array();
for ($i = 0; $i < $rowCount; $i++) {
$row = $rows[$i];
$cells = $row->getCells();
if (count($cells) <= count($cellWidths)) {
continue;
}
$cellWidths = array();
foreach ($cells as $cell) {
$cellWidths[] = $cell->getWidth();
}
}
$xmlWriter->startElement('w:tblGrid'); $xmlWriter->startElement('w:tblGrid');
foreach ($cellWidths as $width) { foreach ($cellWidths as $width) {