user198003
user198003

Reputation: 11161

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

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!

Upvotes: 2

Views: 10870

Answers (1)

AngryBird
AngryBird

Reputation: 66

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'));

Upvotes: 5

Related Questions