PEAR is discontinued

This is a static archive preserving historical releases and metadata. No new packages or updates will be published. For updates to existing packages, or to publish new packages, please use Composer and Packagist.

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;
}
}