PEAR is archived and read-only

This mirror preserves historical PEAR package releases and metadata so existing references remain available.

Home » File Formats » Spreadsheet_Excel_Writer » Bug #9564

Worksheet::setColumn() can only be called once per range

Details

Submitted2006-12-06 20:02 UTC
Fromdan at spiderweblabs dot com
Assignedcschmitz
StatusClosed
PackageSpreadsheet_Excel_Writer
PHP Version5.1.6
OSWindows Server 2003
Roadmaps(Not assigned)

Comments

[2006-12-06 20:02 UTC] dan at spiderweblabs dot com

Description:
------------
I plan on fixing this and submitting back to CVS, but I thought I'd let everyone know ahead of time.

Worksheet::setColumn() adds a new array onto the Worksheet::_colinfo array.

I think the desired behavior would be to override previous overlapping entries, splitting ranges where necessary.

Test script:
---------------
$workbook = new Spreadsheet_Excel_Writer();
$worksheet =& $workbook->addWorksheet();

$worksheet->setColumn(0,0,10);
$worksheet->setColumn(0,0,100);

$workbook->send("text.xls");
$workbook->close();

Expected result:
----------------
I expect column A to be 100 units wide;

Actual result:
--------------
Column A is 10 units wide;

[2006-12-06 21:56 UTC] dan at spiderweblabs dot com

Here is my modified Worksheet::setColumn() method:

/**
* Set the width of a single column or a range of columns.
*
* @access public
* @param integer $firstcol first column on the range
* @param integer $lastcol last column on the range
* @param integer $width width to set
* @param mixed $format The optional XF format to apply to the columns
* @param integer $hidden The optional hidden atribute
* @param integer $level The optional outline level
*/
function setColumn($firstcol, $lastcol, $width, $format = null, $hidden = 0, $level = 0)
{
// added by Dan Lynn <dan@spiderweblabs.com) on 2006-12-06
// look for any ranges this might overlap and remove, size or split where necessary
foreach ($this->_colinfo as $key => $colinfo) {
$existing_start = $colinfo[0];
$existing_end = $colinfo[1];

// if the new range starts within another range
if ($firstcol > $existing_start && $firstcol < $existing_end) {
// trim the existing range to the beginning of the new range
$this->_colinfo[$key][1] = $firstcol - 1;


// if the new range lies WITHIN the existing range
if ($lastcol < $existing_end) {
// split the existing range by adding a range after our new range
$this->_colinfo[] = array($lastcol+1, $existing_end, $colinfo[2], &$colinfo[3], $colinfo[4], $colinfo[5]);
}
}

// if the new range ends inside an existing range
elseif ($lastcol > $existing_start && $lastcol < $existing_end) {
// trim the existing range to the end of the new range
$this->_colinfo[$key][0] = $lastcol + 1;

}

// if the new range completely overlaps the existing range
elseif ($firstcol <= $existing_start && $lastcol >= $existing_end) {
unset($this->_colinfo[$key]);
}
}

// added by Dan Lynn <dan@spiderweblabs.com) on 2006-12-06
// regenerate keys
$this->_colinfo = array_values($this->_colinfo);

$this->_colinfo[] = array($firstcol, $lastcol, $width, &$format, $hidden, $level);

// Set width to zero if column is hidden
$width = ($hidden) ? 0 : $width;

for ($col = $firstcol; $col <= $lastcol; $col++) {
$this->col_sizes[$col] = $width;
}
}