How to merge cells in PHPWord? Or to have different number of cells in each table row?

user198003 picture user198003 · Aug 12, 2012 · Viewed 7.7k times · Source

Trying to create MS Word document using PHP library PHPWord.

Can you help me how to merge two or more cells in document? Or how to have different number of cells in each table row?

I tried with cell definition as:

$cell11 = array('gridSpan'=>2);

But it did not worked....

Thank you in advance!

Answer

AngryBird picture AngryBird · Aug 13, 2012

Add code like this

1. PHPWord/Section/Table/Cell.php

/**
 * How many columns this cell spans
 * @var int
 */
private $_gridSpan;

public function__construct($insideOf,$pCount,$width=null,$style=null,$gridSpan=1){
    $this->_insideOf = $insideOf;
    ...
    $this->_gridSpan = $gridSpan;
}

/**
 * Get the number of columns this cell spans
 *
 * @return int
 */
public function getGridSpan(){
    return $this->_gridSpan;
}

2. PHPWord/Section/Table.php

     public function addCell($width,$style=null,$gridSpan=1){
            $cell = new PHPWord_Section_Table_Cell($this->_insideOf,
                    $this->_pCount,$width,$style,$gridSpan);
      }

3. PHPWord/Writer/Word2007/Base.php

protected function _writeTable(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Table $table) {
    $_rows = $table->getRows();
    $_cRows = count($_rows);
    ...
    $_heights = $table->getRowHeights();
    for ($i = 0; $i < $_cRows; $i++) {
        $row = $_rows[$i];
        $height = $_heights[$i];
        //add
        $objWriter->startElement('w:trPr');
        //FIXME: Make this an option on a row or table
        $objWriter->startElement('w:cantSplit');
        $objWriter->endElement();
        $objWriter->endElement();
        //end add
        foreach ($rows as $cell) {
            ...
            $width = $cell->getWidth();
            //add 
            $gridSpan = $cell->getGridSpan();
            //end add
            ...
            //add
            if ($gridSpan > 1) {
                $objWriter->startElement('w:gridSpan');
                $objWriter->writeAttribute('w:val',$gridSpan);
                $objWriter->endElement();
                //end add
                ...
            }
        }
    }
}

You can use it like this:

$PHPWord  = new PHPWord();
$section  = $PHPWord->createSection();
$table    = $section->addTable();
$table->addRow();
$table->addCell(1000,null,2)->addText('info');

$table->addRow();
$table->addCell(500)->addText('Name');
$table->addCell(500)->addText('Sex');

Sorry about the style,you can use it like this:

$tableStyle = array('borderSize'=>6, 'borderColor'=>'006699', 'cellMargin'=>80);
$PHPWord->addTableStyle('tableStyle',$tableStyle,null);
$table    = $section->addTable('tableStyle');
$table->addRow();
$table->addCell(1000,null,2)->addText('info',null,array('align'=>'center'));

$table->addRow();
$table->addCell(500)->addText('Name',null,array('align'=>'center'));
$table->addCell(500)->addText('Sex',null,array('align'=>'center'));