supporting relative references (Anders Betnér)

git-svn-id: https://svn.php.net/repository/pear/packages/Spreadsheet_Excel_Writer/trunk@123081 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
Xavier Noguer Gallego 2003-04-10 20:40:03 +00:00
parent f1346b61ad
commit b259c6ec87
1 changed files with 24 additions and 23 deletions

View File

@ -532,8 +532,8 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
{ {
return($this->_convertString($token)); return($this->_convertString($token));
} }
// match references like A1 // match references like A1 or $A$1
elseif(preg_match("/^([A-I]?[A-Z])(\d+)$/",$token)) elseif(preg_match('/^\$?([A-I]?[A-Z])\$?(\d+)$/',$token))
{ {
return($this->_convertRef2d($token)); return($this->_convertRef2d($token));
} }
@ -543,12 +543,12 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
return($this->_convertRef3d($token)); return($this->_convertRef3d($token));
} }
// match ranges like A1:B2 // match ranges like A1:B2
elseif(preg_match("/^([A-I]?[A-Z])(\d+)\:([A-I]?[A-Z])(\d+)$/",$token)) elseif(preg_match("/^(\$)?[A-I]?[A-Z](\$)?(\d+)\:(\$)?[A-I]?[A-Z](\$)?(\d+)$/",$token))
{ {
return($this->_convertRange2d($token)); return($this->_convertRange2d($token));
} }
// match ranges like A1..B2 // match ranges like A1..B2
elseif(preg_match("/^([A-I]?[A-Z])(\d+)\.\.([A-I]?[A-Z])(\d+)$/",$token)) elseif(preg_match("/^(\$)?[A-I]?[A-Z](\$)?(\d+)\.\.(\$)?[A-I]?[A-Z](\$)?(\d+)$/",$token))
{ {
return($this->_convertRange2d($token)); return($this->_convertRange2d($token));
} }
@ -930,11 +930,12 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
*/ */
function _cellToRowcol($cell) function _cellToRowcol($cell)
{ {
preg_match("/([A-I]?[A-Z])(\d+)/",$cell,$match); preg_match('/(\$)?([A-I]?[A-Z])(\$)?(\d+)/',$cell,$match);
$col_rel = 0; // return absolute column if there is a $ in the ref
$col_ref = $match[1]; $col_rel = empty($match[1]) ? 1 : 0;
$row_rel = 0; $col_ref = $match[2];
$row = $match[2]; $row_rel = empty($match[3]) ? 1 : 0;
$row = $match[4];
// Convert base26 column string to a number. // Convert base26 column string to a number.
$expn = 0; $expn = 0;
@ -1054,30 +1055,30 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
break; break;
default: default:
// if it's a reference // if it's a reference
if(eregi("^[A-I]?[A-Z][0-9]+$",$token) and if (preg_match('/^\$?[A-I]?[A-Z]\$?[0-9]+$/',$token) and
!ereg("[0-9]",$this->_lookahead) and !ereg("[0-9]",$this->_lookahead) and
($this->_lookahead != ':') and ($this->_lookahead != '.')) ($this->_lookahead != ':') and ($this->_lookahead != '.'))
{ {
return($token); return $token;
} }
// If it's an external reference (Sheet1!A1) // If it's an external reference (Sheet1!A1)
elseif(eregi("^[A-Za-z0-9]+\![A-I]?[A-Z][0-9]+$",$token) and elseif(eregi("^[A-Za-z0-9]+\![A-I]?[A-Z][0-9]+$",$token) and
!ereg("[0-9]",$this->_lookahead) and !ereg("[0-9]",$this->_lookahead) and
($this->_lookahead != ':') and ($this->_lookahead != '.')) ($this->_lookahead != ':') and ($this->_lookahead != '.'))
{ {
return($token); return $token;
} }
// if it's a range (A1:A2) // if it's a range (A1:A2)
elseif(eregi("^[A-I]?[A-Z][0-9]+:[A-I]?[A-Z][0-9]+$",$token) and elseif (preg_match("/^(\$)?[A-I]?[A-Z](\$)?[0-9]+:(\$)?[A-I]?[A-Z](\$)?[0-9]+$/",$token) and
!ereg("[0-9]",$this->_lookahead)) !ereg("[0-9]",$this->_lookahead))
{ {
return($token); return $token;
} }
// if it's a range (A1..A2) // if it's a range (A1..A2)
elseif(eregi("^[A-I]?[A-Z][0-9]+\.\.[A-I]?[A-Z][0-9]+$",$token) and elseif (preg_match("/^(\$)?[A-I]?[A-Z](\$)?[0-9]+\.\.(\$)?[A-I]?[A-Z](\$)?[0-9]+$/",$token) and
!ereg("[0-9]",$this->_lookahead)) !ereg("[0-9]",$this->_lookahead))
{ {
return($token); return $token;
} }
// If it's a external range // If it's a external range
elseif(eregi("^[A-Za-z0-9]+\![A-I]?[A-Z][0-9]+:[A-I]?[A-Z][0-9]+$",$token) and elseif(eregi("^[A-Za-z0-9]+\![A-I]?[A-Z][0-9]+:[A-I]?[A-Z][0-9]+$",$token) and
@ -1309,29 +1310,29 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
return($this->raiseError("')' token expected.")); return($this->raiseError("')' token expected."));
} }
$this->_advance(); // eat the ")" $this->_advance(); // eat the ")"
return($result); return $result;
} }
// if it's a reference // if it's a reference
if (eregi("^[A-I]?[A-Z][0-9]+$",$this->_current_token)) if (preg_match('/^\$?[A-I]?[A-Z]\$?[0-9]+$/',$this->_current_token))
{ {
$result = $this->_createTree($this->_current_token, '', ''); $result = $this->_createTree($this->_current_token, '', '');
$this->_advance(); $this->_advance();
return($result); return $result;
} }
// If it's an external reference (Sheet1!A1) // If it's an external reference (Sheet1!A1)
elseif(eregi("^[A-Za-z0-9]+\![A-I]?[A-Z][0-9]+$",$this->_current_token)) elseif(eregi("^[A-Za-z0-9]+\![A-I]?[A-Z][0-9]+$",$this->_current_token))
{ {
$result = $this->_createTree($this->_current_token, '', ''); $result = $this->_createTree($this->_current_token, '', '');
$this->_advance(); $this->_advance();
return($result); return $result;
} }
// if it's a range // if it's a range
elseif (eregi("^[A-I]?[A-Z][0-9]+:[A-I]?[A-Z][0-9]+$",$this->_current_token) or elseif (preg_match("/^(\$)?[A-I]?[A-Z](\$)?[0-9]+:(\$)?[A-I]?[A-Z](\$)?[0-9]+$/",$this->_current_token) or
eregi("^[A-I]?[A-Z][0-9]+\.\.[A-I]?[A-Z][0-9]+$",$this->_current_token)) preg_match("/^(\$)?[A-I]?[A-Z](\$)?[0-9]+\.\.(\$)?[A-I]?[A-Z](\$)?[0-9]+$/",$this->_current_token))
{ {
$result = $this->_current_token; $result = $this->_current_token;
$this->_advance(); $this->_advance();
return($result); return $result;
} }
// If it's an external range (Sheet1!A1:B2) // If it's an external range (Sheet1!A1:B2)
elseif(eregi("^[A-Za-z0-9]+\![A-I]?[A-Z][0-9]+:[A-I]?[A-Z][0-9]+$",$this->_current_token)) elseif(eregi("^[A-Za-z0-9]+\![A-I]?[A-Z][0-9]+:[A-I]?[A-Z][0-9]+$",$this->_current_token))