From db2006803161d7c8a716b90b7e36adf427e6fa0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Helgi=20=C3=9Eormar=20=C3=9Eorbj=C3=B6rnsson?= Date: Tue, 27 Sep 2005 07:33:54 +0000 Subject: [PATCH] ws cosmetics. git-svn-id: https://svn.php.net/repository/pear/packages/Spreadsheet_Excel_Writer/trunk@197024 c90b9560-bf6c-de11-be94-00142212c4b1 --- Writer.php | 10 +- Writer/BIFFwriter.php | 34 +- Writer/Format.php | 120 +++---- Writer/OLEwriter.php | 38 +-- Writer/Parser.php | 128 ++++---- Writer/Validator.php | 6 +- Writer/Workbook.php | 246 +++++++-------- Writer/Worksheet.php | 710 +++++++++++++++++++++--------------------- 8 files changed, 646 insertions(+), 646 deletions(-) diff --git a/Writer.php b/Writer.php index aca86d0..e8176b7 100644 --- a/Writer.php +++ b/Writer.php @@ -4,7 +4,7 @@ * * PERL Spreadsheet::WriteExcel module. * -* The author of the Spreadsheet::WriteExcel module is John McNamara +* The author of the Spreadsheet::WriteExcel module is John McNamara * * * I _DO_ maintain this code, and John McNamara has nothing to do with the @@ -86,18 +86,18 @@ class Spreadsheet_Excel_Writer extends Spreadsheet_Excel_Writer_Workbook if ($col > 255) { //maximum column value exceeded return new PEAR_Error("Maximum column value exceeded: $col"); } - + $int = (int)($col / 26); $frac = $col % 26; $chr1 = ''; - + if ($int > 0) { $chr1 = chr(ord('A') + $int - 1); } - + $chr2 = chr(ord('A') + $frac); $row++; - + return $chr1.$chr2.$row; } } diff --git a/Writer/BIFFwriter.php b/Writer/BIFFwriter.php index cd9c94b..921a17e 100644 --- a/Writer/BIFFwriter.php +++ b/Writer/BIFFwriter.php @@ -5,7 +5,7 @@ * The majority of this is _NOT_ my code. I simply ported it from the * PERL Spreadsheet::WriteExcel module. * -* The author of the Spreadsheet::WriteExcel module is John McNamara +* The author of the Spreadsheet::WriteExcel module is John McNamara * * * I _DO_ maintain this code, and John McNamara has nothing to do with the @@ -36,14 +36,14 @@ require_once 'PEAR.php'; /** * Class for writing Excel BIFF records. -* +* * From "MICROSOFT EXCEL BINARY FILE FORMAT" by Mark O'Brien (Microsoft Corporation): * -* BIFF (BInary File Format) is the file format in which Excel documents are +* BIFF (BInary File Format) is the file format in which Excel documents are * saved on disk. A BIFF file is a complete description of an Excel document. -* BIFF files consist of sequences of variable-length records. There are many -* different types of BIFF records. For example, one record type describes a -* formula entered into a cell; one describes the size and location of a +* BIFF files consist of sequences of variable-length records. There are many +* different types of BIFF records. For example, one record type describes a +* formula entered into a cell; one describes the size and location of a * window into a document; another describes a picture format. * * @author Xavier Noguer @@ -54,13 +54,13 @@ require_once 'PEAR.php'; class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR { /** - * The BIFF/Excel version (5). + * The BIFF/Excel version (5). * @var integer */ var $_BIFF_version = 0x0500; /** - * The byte order of this architecture. 0 => little endian, 1 => big endian + * The byte order of this architecture. 0 => little endian, 1 => big endian * @var integer */ var $_byte_order; @@ -83,7 +83,7 @@ class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR * @see _addContinue() */ var $_limit; - + /** * Constructor * @@ -94,7 +94,7 @@ class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR $this->_byte_order = ''; $this->_data = ''; $this->_datasize = 0; - $this->_limit = 2080; + $this->_limit = 2080; // Set the byte order $this->_setByteOrder(); } @@ -178,7 +178,7 @@ class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR $year = 0x07CC; } $version = $this->_BIFF_version; - + $header = pack("vv", $record, $length); $data = pack("vvvv", $version, $type, $build, $year); $this->_prepend($header.$data.$unknown); @@ -189,7 +189,7 @@ class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR * * @access private */ - function _storeEof() + function _storeEof() { $record = 0x000A; // Record identifier $length = 0x0000; // Number of bytes to follow @@ -213,24 +213,24 @@ class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR { $limit = $this->_limit; $record = 0x003C; // Record identifier - + // The first 2080/8224 bytes remain intact. However, we have to change // the length field of the record. $tmp = substr($data, 0, 2).pack("v", $limit-4).substr($data, 4, $limit - 4); - + $header = pack("vv", $record, $limit); // Headers for continue records - + // Retrieve chunks of 2080/8224 bytes +4 for the header. for ($i = $limit; $i < strlen($data) - $limit; $i += $limit) { $tmp .= $header; $tmp .= substr($data, $i, $limit); } - + // Retrieve the last chunk of data $header = pack("vv", $record, strlen($data) - $i); $tmp .= $header; $tmp .= substr($data, $i, strlen($data) - $i); - + return $tmp; } } diff --git a/Writer/Format.php b/Writer/Format.php index 8f6abda..c30481b 100644 --- a/Writer/Format.php +++ b/Writer/Format.php @@ -5,7 +5,7 @@ * The majority of this is _NOT_ my code. I simply ported it from the * PERL Spreadsheet::WriteExcel module. * -* The author of the Spreadsheet::WriteExcel module is John McNamara +* The author of the Spreadsheet::WriteExcel module is John McNamara * * * I _DO_ maintain this code, and John McNamara has nothing to do with the @@ -266,9 +266,9 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $this->_font_script = 0; $this->_font_family = 0; $this->_font_charset = 0; - + $this->_num_format = 0; - + $this->_hidden = 0; $this->_locked = 0; @@ -282,19 +282,19 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $this->_bg_color = 0x41; $this->_pattern = 0; - + $this->_bottom = 0; $this->_top = 0; $this->_left = 0; $this->_right = 0; $this->_diag = 0; - + $this->_bottom_color = 0x40; $this->_top_color = 0x40; $this->_left_color = 0x40; $this->_right_color = 0x40; $this->_diag_color = 0x40; - + // Set properties passed to Spreadsheet_Excel_Writer_Workbook::addFormat() foreach ($properties as $property => $value) { @@ -321,7 +321,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $style = $this->_locked; $style |= $this->_hidden << 1; } - + // Flags to indicate if attributes have been set. $atr_num = ($this->_num_format != 0)?1:0; $atr_fnt = ($this->font_index != 0)?1:0; @@ -334,7 +334,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR ($this->_bg_color != 0x41) || $this->_pattern)?1:0; $atr_prot = $this->_locked | $this->_hidden; - + // Zero the default border colour if the border has not been set. if ($this->_bottom == 0) { $this->_bottom_color = 0; @@ -351,7 +351,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR if ($this->_diag == 0) { $this->_diag_color = 0; } - + $record = 0x00E0; // Record identifier if ($this->_BIFF_version == 0x0500) { $length = 0x0010; // Number of bytes to follow @@ -359,7 +359,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR if ($this->_BIFF_version == 0x0600) { $length = 0x0014; } - + $ifnt = $this->font_index; // Index to FONT record $ifmt = $this->_num_format; // Index to FORMAT record if ($this->_BIFF_version == 0x0500) { @@ -374,22 +374,22 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $align |= $atr_bdr << 13; $align |= $atr_pat << 14; $align |= $atr_prot << 15; - + $icv = $this->_fg_color; // fg and bg pattern colors $icv |= $this->_bg_color << 7; - + $fill = $this->_pattern; // Fill and border line style $fill |= $this->_bottom << 6; $fill |= $this->_bottom_color << 9; - + $border1 = $this->_top; // Border line style and color $border1 |= $this->_left << 3; $border1 |= $this->_right << 6; $border1 |= $this->_top_color << 9; - + $border2 = $this->_left_color; // Border color $border2 |= $this->_right_color << 7; - + $header = pack("vv", $record, $length); $data = pack("vvvvvvvv", $ifnt, $ifmt, $style, $align, $icv, $fill, @@ -409,7 +409,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $icv = $this->_fg_color; // fg and bg pattern colors $icv |= $this->_bg_color << 7; - + $border1 = $this->_left; // Border line style and color $border1 |= $this->_right << 4; $border1 |= $this->_top << 8; @@ -420,7 +420,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $diag_tr_to_lb = 0; // FIXME: add method $border1 |= $diag_tl_to_rb << 30; $border1 |= $diag_tr_to_lb << 31; - + $border2 = $this->_top_color; // Border color $border2 |= $this->_bottom_color << 7; $border2 |= $this->_diag_color << 14; @@ -438,7 +438,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR return($header.$data); } - + /** * Generate an Excel BIFF FONT record. * @@ -454,7 +454,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $bFamily = $this->_font_family; // Font family $bCharSet = $this->_font_charset; // Character set $encoding = 0; // TODO: Unicode support - + $cch = strlen($this->_font_name); // Length of font name $record = 0x31; // Record identifier if ($this->_BIFF_version == 0x0500) { @@ -476,7 +476,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR if ($this->_font_shadow) { $grbit |= 0x20; } - + $header = pack("vv", $record, $length); if ($this->_BIFF_version == 0x0500) { $data = pack("vvvvvCCCCC", $dyHeight, $grbit, $icv, $bls, @@ -489,9 +489,9 @@ class Spreadsheet_Excel_Writer_Format extends PEAR } return($header . $data. $this->_font_name); } - + /** - * Returns a unique hash key for a font. + * Returns a unique hash key for a font. * Used by Spreadsheet_Excel_Writer_Workbook::_storeAllFonts() * * The elements that form the key are arranged to increase the probability of @@ -510,7 +510,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $key = str_replace(" ","_",$key); return ($key); } - + /** * Returns the index used by Spreadsheet_Excel_Writer_Worksheet::_XF() * @@ -520,7 +520,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR { return($this->_xf_index); } - + /** * Used in conjunction with the set_xxx_color methods to convert a color * string into a number. Color range is 0..63 but we will restrict it @@ -552,36 +552,36 @@ class Spreadsheet_Excel_Writer_Format extends PEAR 'white' => 0x09, 'yellow' => 0x0D ); - + // Return the default color, 0x7FFF, if undef, if ($name_color == '') { return(0x7FFF); } - + // or the color string converted to an integer, if (isset($colors[$name_color])) { return($colors[$name_color]); } - + // or the default color if string is unrecognised, if (preg_match("/\D/",$name_color)) { return(0x7FFF); } - + // or an index < 8 mapped into the correct range, if ($name_color < 8) { return($name_color + 8); } - + // or the default color if arg is outside range, if ($name_color > 63) { return(0x7FFF); } - + // or an integer in the valid range return($name_color); } - + /** * Set cell alignment. * @@ -593,9 +593,9 @@ class Spreadsheet_Excel_Writer_Format extends PEAR if (preg_match("/\d/",$location)) { return; // Ignore numbers } - + $location = strtolower($location); - + if ($location == 'left') { $this->_text_h_align = 1; } @@ -639,7 +639,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $this->_text_v_align = 4; } } - + /** * This is an alias for the unintuitive setAlign('merge') * @@ -649,7 +649,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR { $this->setAlign('merge'); } - + /** * Sets the boldness of the text. * Bold has a range 100..1000. @@ -676,12 +676,12 @@ class Spreadsheet_Excel_Writer_Format extends PEAR } $this->_bold = $weight; } - - + + /************************************ * FUNCTIONS FOR SETTING CELLS BORDERS */ - + /** * Sets the width for the bottom border of the cell * @@ -692,7 +692,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR { $this->_bottom = $style; } - + /** * Sets the width for the top border of the cell * @@ -703,7 +703,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR { $this->_top = $style; } - + /** * Sets the width for the left border of the cell * @@ -714,7 +714,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR { $this->_left = $style; } - + /** * Sets the width for the right border of the cell * @@ -725,8 +725,8 @@ class Spreadsheet_Excel_Writer_Format extends PEAR { $this->_right = $style; } - - + + /** * Set cells borders to the same style * @@ -740,17 +740,17 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $this->setLeft($style); $this->setRight($style); } - - + + /******************************************* * FUNCTIONS FOR SETTING CELLS BORDERS COLORS */ - + /** * Sets all the cell's borders to the same color * * @access public - * @param mixed $color The color we are setting. Either a string (like 'blue'), + * @param mixed $color The color we are setting. Either a string (like 'blue'), * or an integer (range is [8...63]). */ function setBorderColor($color) @@ -760,7 +760,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $this->setLeftColor($color); $this->setRightColor($color); } - + /** * Sets the cell's bottom border color * @@ -772,7 +772,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $value = $this->_getColor($color); $this->_bottom_color = $value; } - + /** * Sets the cell's top border color * @@ -784,7 +784,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $value = $this->_getColor($color); $this->_top_color = $value; } - + /** * Sets the cell's left border color * @@ -796,7 +796,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $value = $this->_getColor($color); $this->_left_color = $value; } - + /** * Sets the cell's right border color * @@ -808,8 +808,8 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $value = $this->_getColor($color); $this->_right_color = $value; } - - + + /** * Sets the cell's foreground color * @@ -824,7 +824,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $this->_pattern = 1; } } - + /** * Sets the cell's background color * @@ -839,7 +839,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $this->_pattern = 1; } } - + /** * Sets the cell's color * @@ -851,7 +851,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR $value = $this->_getColor($color); $this->_color = $value; } - + /** * Sets the fill pattern attribute of a cell * @@ -863,7 +863,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR { $this->_pattern = $arg; } - + /** * Sets the underline of the text * @@ -875,7 +875,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR { $this->_underline = $underline; } - + /** * Sets the font style as italic * @@ -887,7 +887,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR } /** - * Sets the font size + * Sets the font size * * @access public * @param integer $size The font size (in pixels I think). @@ -896,7 +896,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR { $this->_size = $size; } - + /** * Sets text wrapping * diff --git a/Writer/OLEwriter.php b/Writer/OLEwriter.php index 2ca39e4..a078fa3 100644 --- a/Writer/OLEwriter.php +++ b/Writer/OLEwriter.php @@ -5,7 +5,7 @@ * The majority of this is _NOT_ my code. I simply ported it from the * PERL Spreadsheet::WriteExcel module. * -* The author of the Spreadsheet::WriteExcel module is John McNamara +* The author of the Spreadsheet::WriteExcel module is John McNamara * * * I _DO_ maintain this code, and John McNamara has nothing to do with the @@ -130,7 +130,7 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR function _initialize() { $OLEfile = $this->_OLEfilename; - + if (($OLEfile == '-') or ($OLEfile == '')) { $this->_tmp_filename = tempnam("/tmp", "OLEwriter"); $fh = fopen($this->_tmp_filename, "wb"); @@ -144,7 +144,7 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR $this->raiseError("Can't open $OLEfile. It may be in use or protected."); } } - + // Store filehandle $this->_filehandle = $fh; } @@ -165,11 +165,11 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR function setSize($biffsize) { $maxsize = 7087104; // TODO: extend max size - + if ($biffsize > $maxsize) { $this->raiseError("Maximum file size, $maxsize, exceeded."); } - + $this->_biffsize = $biffsize; // Set the min file size to 4k to avoid having to use small blocks if ($biffsize > 4096) { @@ -209,13 +209,13 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR * @access public * @see Spreadsheet_Excel_Writer_Workbook::store_OLE_file() */ - function close() + function close() { //return if not $this->{_size_allowed}; $this->_writePadding(); $this->_writePropertyStorage(); $this->_writeBigBlockDepot(); - // Close the filehandle + // Close the filehandle fclose($this->_filehandle); if (($this->_OLEfilename == '-') or ($this->_OLEfilename == '')) { $fh = fopen($this->_tmp_filename, "rb"); @@ -260,7 +260,7 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR $sbd_startblock = pack("V", -2); $unknown7 = pack("VVV", 0x00, -2 ,0x00); $unused = pack("V", -1); - + fwrite($this->_filehandle, $id); fwrite($this->_filehandle, $unknown1); fwrite($this->_filehandle, $unknown2); @@ -272,7 +272,7 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR fwrite($this->_filehandle, $unknown6); fwrite($this->_filehandle, $sbd_startblock); fwrite($this->_filehandle, $unknown7); - + for ($i=1; $i <= $num_lists; $i++) { $root_start++; fwrite($this->_filehandle, pack("V",$root_start)); @@ -294,11 +294,11 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR $num_lists = $this->_list_blocks; $total_blocks = $num_lists *128; $used_blocks = $num_blocks + $num_lists +2; - + $marker = pack("V", -3); $end_of_chain = pack("V", -2); $unused = pack("V", -1); - + for ($i=1; $i < $num_blocks; $i++) { fwrite($this->_filehandle, pack("V",$i)); } @@ -341,7 +341,7 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR { $length = 0; $rawname = ''; - + if ($name != '') { $name = $name . "\0"; for ($i = 0; $i < strlen($name); $i++) { @@ -350,24 +350,24 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR } $length = strlen($name) * 2; } - + $zero = pack("C", 0); $pps_sizeofname = pack("v", $length); // 0x40 $pps_type = pack("v", $type); // 0x42 $pps_prev = pack("V", -1); // 0x44 $pps_next = pack("V", -1); // 0x48 $pps_dir = pack("V", $dir); // 0x4c - + $unknown1 = pack("V", 0); - + $pps_ts1s = pack("V", 0); // 0x64 $pps_ts1d = pack("V", 0); // 0x68 $pps_ts2s = pack("V", 0); // 0x6c $pps_ts2d = pack("V", 0); // 0x70 $pps_sb = pack("V", $start); // 0x74 $pps_size = pack("V", $size); // 0x78 - - + + fwrite($this->_filehandle, $rawname); for ($i = 0; $i < (64 -$length); $i++) { fwrite($this->_filehandle, $zero); @@ -398,8 +398,8 @@ class Spreadsheet_Excel_Writer_OLEwriter extends PEAR { $biffsize = $this->_biffsize; if ($biffsize < 4096) { - $min_size = 4096; - } else { + $min_size = 4096; + } else { $min_size = 512; } if ($biffsize % $min_size != 0) { diff --git a/Writer/Parser.php b/Writer/Parser.php index 0d2f3ec..e20192b 100644 --- a/Writer/Parser.php +++ b/Writer/Parser.php @@ -178,9 +178,9 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR $this->_ext_sheets = array(); $this->_references = array(); } - + /** - * Initialize the ptg and function hashes. + * Initialize the ptg and function hashes. * * @access private */ @@ -284,7 +284,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR 'ptgRefErr3dA' => 0x7C, 'ptgAreaErr3d' => 0x7D ); - + // Thanks to Michael Meeks and Gnumeric for the initial arg values. // // The following hash was generated by "function_locale.pl" in the distro. @@ -527,7 +527,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR 'ROMAN' => array( 354, -1, 1, 0 ) ); } - + /** * Convert a token to the proper ptg value. * @@ -576,7 +576,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR // TODO: use real error codes return $this->raiseError("Unknown token $token"); } - + /** * Convert a number token to ptgInt or ptgNum * @@ -595,12 +595,12 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR return pack("Cd", $this->ptg['ptgNum'], $num); } } - + /** * Convert a string token to ptgStr * * @access private - * @param string $string A string for conversion to its ptg value. + * @param string $string A string for conversion to its ptg value. * @return mixed the converted token on success. PEAR_Error if the string * is longer than 255 characters. */ @@ -618,7 +618,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR return pack("CCC", $this->ptg['ptgStr'], strlen($string), $encoding).$string; } } - + /** * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of * args that it takes. @@ -632,7 +632,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR { $args = $this->_functions[$token][1]; $volatile = $this->_functions[$token][3]; - + // Fixed number of args eg. TIME($i,$j,$k). if ($args >= 0) { return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]); @@ -642,7 +642,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]); } } - + /** * Convert an Excel range such as A1:D4 to a ptgRefV. * @@ -652,18 +652,18 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR function _convertRange2d($range) { $class = 2; // as far as I know, this is magick. - + // Split the range into 2 cell refs if (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\:([A-Ia-i]?[A-Za-z])(\d+)$/",$range)) { list($cell1, $cell2) = split(':', $range); } elseif (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\.\.([A-Ia-i]?[A-Za-z])(\d+)$/",$range)) { list($cell1, $cell2) = split('\.\.', $range); - + } else { // TODO: use real error codes return $this->raiseError("Unknown range separator", 0, PEAR_ERROR_DIE); } - + // Convert the cell references $cell_array1 = $this->_cellToPackedRowcol($cell1); if (PEAR::isError($cell_array1)) { @@ -675,7 +675,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR return $cell_array2; } list($row2, $col2) = $cell_array2; - + // The ptg value depends on the class of the ptg. if ($class == 0) { $ptgArea = pack("C", $this->ptg['ptgArea']); @@ -689,7 +689,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } return $ptgArea . $row1 . $row2 . $col1. $col2; } - + /** * Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to * a ptgArea3d. @@ -701,10 +701,10 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR function _convertRange3d($token) { $class = 2; // as far as I know, this is magick. - + // Split the ref at the ! symbol list($ext_ref, $range) = split('!', $token); - + // Convert the external reference part (different for BIFF8) if ($this->_BIFF_version == 0x0500) { $ext_ref = $this->_packExtRef($ext_ref); @@ -720,7 +720,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR // Split the range into 2 cell refs list($cell1, $cell2) = split(':', $range); - + // Convert the cell references if (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/", $cell1)) { $cell_array1 = $this->_cellToPackedRowcol($cell1); @@ -740,7 +740,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } list($row1, $col1, $row2, $col2) = $cells_array; } - + // The ptg value depends on the class of the ptg. if ($class == 0) { $ptgArea = pack("C", $this->ptg['ptgArea3d']); @@ -751,7 +751,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } else { return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); } - + return $ptgArea . $ext_ref . $row1 . $row2 . $col1. $col2; } @@ -765,14 +765,14 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR function _convertRef2d($cell) { $class = 2; // as far as I know, this is magick. - + // Convert the cell reference $cell_array = $this->_cellToPackedRowcol($cell); if (PEAR::isError($cell_array)) { return $cell_array; } list($row, $col) = $cell_array; - + // The ptg value depends on the class of the ptg. if ($class == 0) { $ptgRef = pack("C", $this->ptg['ptgRef']); @@ -786,7 +786,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } return $ptgRef.$row.$col; } - + /** * Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a * ptgRef3d. @@ -798,10 +798,10 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR function _convertRef3d($cell) { $class = 2; // as far as I know, this is magick. - + // Split the ref at the ! symbol list($ext_ref, $cell) = split('!', $cell); - + // Convert the external reference part (different for BIFF8) if ($this->_BIFF_version == 0x0500) { $ext_ref = $this->_packExtRef($ext_ref); @@ -817,7 +817,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR // Convert the cell reference part list($row, $col) = $this->_cellToPackedRowcol($cell); - + // The ptg value depends on the class of the ptg. if ($class == 0) { $ptgRef = pack("C", $this->ptg['ptgRef3d']); @@ -844,11 +844,11 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR { $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. - + // Check if there is a sheet range eg., Sheet1:Sheet2. if (preg_match("/:/", $ext_ref)) { list($sheet_name1, $sheet_name2) = split(':', $ext_ref); - + $sheet1 = $this->_getSheetIndex($sheet_name1); if ($sheet1 == -1) { return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); @@ -857,7 +857,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR if ($sheet2 == -1) { return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); } - + // Reverse max and min sheet numbers if necessary if ($sheet1 > $sheet2) { list($sheet1, $sheet2) = array($sheet2, $sheet1); @@ -869,7 +869,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } $sheet2 = $sheet1; } - + // References are stored relative to 0xFFFF. $offset = -1 - $sheet1; @@ -877,7 +877,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } /** - * Look up the REF index that corresponds to an external sheet name + * Look up the REF index that corresponds to an external sheet name * (or range). If it doesn't exist yet add it to the workbook's references * array. It assumes all sheet names given must exist. * @@ -890,11 +890,11 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR { $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. - + // Check if there is a sheet range eg., Sheet1:Sheet2. if (preg_match("/:/", $ext_ref)) { list($sheet_name1, $sheet_name2) = split(':', $ext_ref); - + $sheet1 = $this->_getSheetIndex($sheet_name1); if ($sheet1 == -1) { return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); @@ -903,7 +903,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR if ($sheet2 == -1) { return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); } - + // Reverse max and min sheet numbers if necessary if ($sheet1 > $sheet2) { list($sheet1, $sheet2) = array($sheet2, $sheet1); @@ -915,7 +915,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } $sheet2 = $sheet1; } - + // assume all references belong to this document $supbook_index = 0x00; $ref = pack('vvv', $supbook_index, $sheet1, $sheet2); @@ -938,7 +938,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR /** * Look up the index that corresponds to an external sheet name. The hash of - * sheet names is updated by the addworksheet() method of the + * sheet names is updated by the addworksheet() method of the * Spreadsheet_Excel_Writer_Workbook class. * * @access private @@ -986,7 +986,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR if ($row >= 16384) { return $this->raiseError("Row in: $cell greater than 16384 "); } - + // Set the high bits to indicate if row or col are relative. if ($this->_BIFF_version == 0x0500) { $row |= $col_rel << 14; @@ -998,10 +998,10 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR $col = pack('v', $col); } $row = pack('v', $row); - + return array($row, $col); } - + /** * pack() row range into the required 3 or 4 byte format. * Just using maximum col/rows, which is probably not the correct solution @@ -1029,7 +1029,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR if (($row1 >= 16384) or ($row2 >= 16384)) { return $this->raiseError("Row in: $range greater than 16384 "); } - + // Set the high bits to indicate if rows are relative. if ($this->_BIFF_version == 0x0500) { $row1 |= $row1_rel << 14; // FIXME: probably a bug @@ -1044,7 +1044,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } $row1 = pack('v', $row1); $row2 = pack('v', $row2); - + return array($row1, $col1, $row2, $col2); } @@ -1065,7 +1065,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR $col_ref = $match[2]; $row_rel = empty($match[3]) ? 1 : 0; $row = $match[4]; - + // Convert base26 column string to a number. $expn = strlen($col_ref) - 1; $col = 0; @@ -1073,14 +1073,14 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR $col += (ord($col_ref{$i}) - ord('A') + 1) * pow(26, $expn); $expn--; } - + // Convert 1-index to zero-index $row--; $col--; - + return array($row, $col, $row_rel, $col_rel); } - + /** * Advance to the next valid token. * @@ -1123,7 +1123,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } //die("Lexical error ".$this->_current_char); } - + /** * Checks if it's a valid token. * @@ -1186,7 +1186,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR default: // if it's a reference if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/', $token) && - !ereg("[0-9]", $this->_lookahead) && + !ereg("[0-9]", $this->_lookahead) && ($this->_lookahead != ':') && ($this->_lookahead != '.') && ($this->_lookahead != '!')) { @@ -1203,12 +1203,12 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR { // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) return $token; - } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/", $token) && + } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/", $token) && !ereg("[0-9]", $this->_lookahead)) { // if it's a range (A1:A2) return $token; - } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/", $token) && + } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/", $token) && !ereg("[0-9]", $this->_lookahead)) { // if it's a range (A1..A2) @@ -1223,7 +1223,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR { // If it's an external range like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1:B2 return $token; - } elseif (is_numeric($token) && + } elseif (is_numeric($token) && (!is_numeric($token.$this->_lookahead) || ($this->_lookahead == '')) && ($this->_lookahead != '!') && ($this->_lookahead != ':')) { @@ -1240,7 +1240,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR return ''; } } - + /** * The parsing method. It parses a formula. * @@ -1261,7 +1261,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } return true; } - + /** * It parses a condition. It assumes the following rule: * Cond -> Expr [(">" | "<") Expr] @@ -1348,7 +1348,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR if (PEAR::isError($result)) { return $result; } - while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) || + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) || ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB)) { if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) { @@ -1369,7 +1369,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } return $result; } - + /** * This function just introduces a ptgParen element in the tree, so that Excel * doesn't get confused when working with a parenthesized formula afterwards. @@ -1383,7 +1383,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR $result = $this->_createTree('ptgParen', $this->_expression(), ''); return $result; } - + /** * It parses a term. It assumes the following rule: * Term -> Fact [("*" | "/") Fact] @@ -1397,7 +1397,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR if (PEAR::isError($result)) { return $result; } - while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) || + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) || ($this->_current_token == SPREADSHEET_EXCEL_WRITER_DIV)) { if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) @@ -1419,7 +1419,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR } return $result; } - + /** * It parses a factor. It assumes the following rule: * Fact -> ( Expr ) @@ -1457,7 +1457,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR $result = $this->_createTree($this->_current_token, '', ''); $this->_advance(); return $result; - } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/", $this->_current_token) || + } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/", $this->_current_token) || preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/", $this->_current_token)) { // if it's a range @@ -1487,7 +1487,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR ", lookahead: ".$this->_lookahead. ", current char: ".$this->_current_char); } - + /** * It parses a function call. It assumes the following rule: * Func -> ( Expr [,Expr]* ) @@ -1530,12 +1530,12 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR if (($args >= 0) and ($args != $num_args)) { return $this->raiseError("Incorrect number of arguments in function $function() "); } - + $result = $this->_createTree($function, $result, $num_args); $this->_advance(); // eat the ")" return $result; } - + /** * Creates a tree. In fact an array which may have one or two arrays (sub-trees) * as elements. @@ -1550,12 +1550,12 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR { return array('value' => $value, 'left' => $left, 'right' => $right); } - + /** - * Builds a string containing the tree in reverse polish notation (What you + * Builds a string containing the tree in reverse polish notation (What you * would use in a HP calculator stack). * The following tree: - * + * * + * / \ * 2 3 diff --git a/Writer/Validator.php b/Writer/Validator.php index 241951e..479dc44 100644 --- a/Writer/Validator.php +++ b/Writer/Validator.php @@ -170,7 +170,7 @@ class Spreadsheet_Excel_Writer_Validator $options |= 0x80000; } $options |= $this->_operator << 20; - + return $options; } @@ -180,7 +180,7 @@ class Spreadsheet_Excel_Writer_Validator $descr_prompt_len = strlen($this->_descr_prompt); $title_error_len = strlen($this->_title_error); $descr_error_len = strlen($this->_descr_error); - + $formula1_size = strlen($this->_formula1); $formula2_size = strlen($this->_formula2); @@ -209,7 +209,7 @@ class Spreadsheet_Excel_Writer_Validator { $this->_incell = $incell; $this->_fixedList = true; - + $source = implode("\x00", $source); $this->_formula1 = pack("CCC", 0x17, strlen($source), 0x0c) . $source; } diff --git a/Writer/Workbook.php b/Writer/Workbook.php index 8bd0095..cb68218 100644 --- a/Writer/Workbook.php +++ b/Writer/Workbook.php @@ -5,7 +5,7 @@ * The majority of this is _NOT_ my code. I simply ported it from the * PERL Spreadsheet::WriteExcel module. * -* The author of the Spreadsheet::WriteExcel module is John McNamara +* The author of the Spreadsheet::WriteExcel module is John McNamara * * * I _DO_ maintain this code, and John McNamara has nothing to do with the @@ -181,7 +181,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { // It needs to call its parent's constructor explicitly $this->Spreadsheet_Excel_Writer_BIFFwriter(); - + $this->_filename = $filename; $this->_parser =& new Spreadsheet_Excel_Writer_Parser($this->_byte_order, $this->_BIFF_version); $this->_1904 = 0; @@ -209,7 +209,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $this->_setPaletteXl97(); $this->_tmp_dir = ''; } - + /** * Calls finalization methods. * This method should always be the last one to be called on every workbook @@ -229,7 +229,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $this->_fileclosed = 1; return true; } - + /** * An accessor for the _worksheets[] array * Returns an array of the worksheet objects in a workbook @@ -243,7 +243,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { return $this->worksheets(); } - + /** * An accessor for the _worksheets[] array. * Returns an array of the worksheet objects in a workbook @@ -255,7 +255,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { return $this->_worksheets; } - + /** * Sets the BIFF version. * This method exists just to access experimental functionality @@ -315,16 +315,16 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { $index = count($this->_worksheets); $sheetname = $this->_sheetname; - + if ($name == '') { - $name = $sheetname.($index+1); + $name = $sheetname.($index+1); } - + // Check that sheetname is <= 31 chars (Excel limit). if (strlen($name) > 31) { return $this->raiseError("Sheetname $name must be <= 31 chars"); } - + // Check that the worksheet name doesn't already exist: a fatal Excel error. $total_worksheets = count($this->_worksheets); for ($i = 0; $i < $total_worksheets; $i++) { @@ -332,7 +332,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri return $this->raiseError("Worksheet '$name' already exists"); } } - + $worksheet = new Spreadsheet_Excel_Writer_Worksheet($this->_BIFF_version, $name, $index, $this->_activesheet, $this->_firstsheet, @@ -345,7 +345,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $this->_parser->setExtSheet($name, $index); // Register worksheet name with parser return $worksheet; } - + /** * Add a new format to the Excel workbook. * Also, pass any properties to the Format constructor. @@ -361,7 +361,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $this->_formats[] = &$format; return $format; } - + /** * Create new validator. * @@ -392,28 +392,28 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri /*if (defined $_[1] and $_[1] =~ /^#(\w\w)(\w\w)(\w\w)/ ) { @_ = ($_[0], hex $1, hex $2, hex $3); }*/ - + // Check that the colour index is the right range if ($index < 8 or $index > 64) { // TODO: assign real error codes return $this->raiseError("Color index $index outside range: 8 <= index <= 64"); } - + // Check that the colour components are in the right range if (($red < 0 or $red > 255) || ($green < 0 or $green > 255) || - ($blue < 0 or $blue > 255)) + ($blue < 0 or $blue > 255)) { return $this->raiseError("Color component outside range: 0 <= color <= 255"); } - + $index -= 8; // Adjust colour index (wingless dragonfly) - + // Set the RGB value $this->_palette[$index] = array($red, $green, $blue, 0); return($index + 8); } - + /** * Sets the colour palette to the Excel 97+ default. * @@ -480,7 +480,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri array(0x33, 0x33, 0x33, 0x00), // 63 ); } - + /** * Assemble worksheets into a workbook and send the BIFF data to an OLE * storage. @@ -494,7 +494,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri if ($this->_activesheet == 0) { $this->_worksheets[0]->selected = 1; } - + // Calculate the number of selected worksheet tabs and call the finalization // methods for each worksheet $total_worksheets = count($this->_worksheets); @@ -504,7 +504,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } $this->_worksheets[$i]->close($this->_sheetnames); } - + // Add Workbook globals $this->_storeBof(0x0005); $this->_storeCodepage(); @@ -525,19 +525,19 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $this->_storeAllStyles(); $this->_storePalette(); $this->_calcSheetOffsets(); - + // Add BOUNDSHEET records for ($i = 0; $i < $total_worksheets; $i++) { $this->_storeBoundsheet($this->_worksheets[$i]->name,$this->_worksheets[$i]->offset); } - + if ($this->_country_code != -1) { $this->_storeCountry(); } if ($this->_BIFF_version == 0x0600) { //$this->_storeSupbookInternal(); - /* TODO: store external SUPBOOK records and XCT and CRN records + /* TODO: store external SUPBOOK records and XCT and CRN records in case of external references for BIFF8 */ //$this->_storeExternsheetBiff8(); $this->_storeSharedStringsTable(); @@ -545,7 +545,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri // End Workbook globals $this->_storeEof(); - + // Store the workbook in an OLE container $res = $this->_storeOLEFile(); if ($this->isError($res)) { @@ -553,7 +553,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } return true; } - + /** * Sets the temp dir used for storing the OLE file * @@ -603,7 +603,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } return true; } - + /** * Calculate offsets for Worksheet BOF records. * @@ -630,7 +630,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri //$offset += 8; // FIXME: calculate real value when storing the records } $total_worksheets = count($this->_worksheets); - // add the length of the BOUNDSHEET records + // add the length of the BOUNDSHEET records for ($i = 0; $i < $total_worksheets; $i++) { $offset += $boundsheet_length + strlen($this->_worksheets[$i]->name); } @@ -642,7 +642,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } $this->_biffsize = $offset; } - + /** * Store the Excel FONT records. * @@ -653,20 +653,20 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri // tmp_format is added by the constructor. We use this to write the default XF's $format = $this->_tmp_format; $font = $format->getFont(); - + // Note: Fonts are 0-indexed. According to the SDK there is no index 4, // so the following fonts are 0, 1, 2, 3, 5 // for ($i = 1; $i <= 5; $i++){ $this->_append($font); } - + // Iterate through the XF objects and write a FONT record if it isn't the // same as the default FONT and if it hasn't already been used. // $fonts = array(); $index = 6; // The first user defined FONT - + $key = $format->getFontKey(); // The default font from _tmp_format $fonts[$key] = 0; // Index of the default font @@ -686,7 +686,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } } } - + /** * Store user defined numerical formats i.e. FORMAT records * @@ -698,13 +698,13 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $hash_num_formats = array(); $num_formats = array(); $index = 164; - + // Iterate through the XF objects and write a FORMAT record if it isn't a // built-in format type and if the FORMAT string hasn't already been used. $total_formats = count($this->_formats); for ($i = 0; $i < $total_formats; $i++) { $num_format = $this->_formats[$i]->_num_format; - + // Check if $num_format is an index to a built-in format. // Also check for a string of zeros, which is a valid format string // but would evaluate to zero. @@ -714,7 +714,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri continue; } } - + if (isset($hash_num_formats[$num_format])) { // FORMAT has already been used $this->_formats[$i]->_num_format = $hash_num_formats[$num_format]; @@ -726,7 +726,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $index++; } } - + // Write the new FORMAT records starting from 0xA4 $index = 164; foreach ($num_formats as $num_format) { @@ -734,7 +734,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $index++; } } - + /** * Write all XF records. * @@ -750,10 +750,10 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $xf = $format->getXf('style'); // Style XF $this->_append($xf); } - + $xf = $format->getXf('cell'); // Cell XF $this->_append($xf); - + // User defined XFs $total_formats = count($this->_formats); for ($i = 0; $i < $total_formats; $i++) { @@ -761,17 +761,17 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $this->_append($xf); } } - + /** * Write all STYLE records. * - * @access private + * @access private */ function _storeAllStyles() { $this->_storeStyle(); } - + /** * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for * the NAME records. @@ -782,13 +782,13 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { // Create EXTERNCOUNT with number of worksheets $this->_storeExterncount(count($this->_worksheets)); - + // Create EXTERNSHEET for each worksheet foreach ($this->_sheetnames as $sheetname) { $this->_storeExternsheet($sheetname); } } - + /** * Write the NAME record to define the print area and the repeat rows and cols. * @@ -811,7 +811,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri ); } } - + // Create the print title NAME records $total_worksheets = count($this->_worksheets); for ($i = 0; $i < $total_worksheets; $i++) { @@ -819,7 +819,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $rowmax = $this->_worksheets[$i]->title_rowmax; $colmin = $this->_worksheets[$i]->title_colmin; $colmax = $this->_worksheets[$i]->title_colmax; - + // Determine if row + col, row, col or nothing has been defined // and write the appropriate record // @@ -859,16 +859,16 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } } } - - - - + + + + /****************************************************************************** * * BIFF RECORDS * */ - + /** * Stores the CODEPAGE biff record. * @@ -879,10 +879,10 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $record = 0x0042; // Record identifier $length = 0x0002; // Number of bytes to follow $cv = $this->_codepage; // The code page - + $header = pack('vv', $record, $length); $data = pack('v', $cv); - + $this->_append($header.$data); } @@ -895,19 +895,19 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { $record = 0x003D; // Record identifier $length = 0x0012; // Number of bytes to follow - + $xWn = 0x0000; // Horizontal position of window $yWn = 0x0000; // Vertical position of window $dxWn = 0x25BC; // Width of window $dyWn = 0x1572; // Height of window - + $grbit = 0x0038; // Option flags $ctabsel = $this->_selected; // Number of workbook tabs selected $wTabRatio = 0x0258; // Tab to scrollbar ratio - + $itabFirst = $this->_firstsheet; // 1st displayed worksheet $itabCur = $this->_activesheet; // Active worksheet - + $header = pack("vv", $record, $length); $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, $grbit, @@ -915,7 +915,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $ctabsel, $wTabRatio); $this->_append($header.$data); } - + /** * Writes Excel BIFF BOUNDSHEET record. * FIXME: inconsistent with BIFF documentation @@ -932,10 +932,10 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } else { $length = 0x07 + strlen($sheetname); // Number of bytes to follow } - + $grbit = 0x0000; // Visibility and sheet type $cch = strlen($sheetname); // Length of sheet name - + $header = pack("vv", $record, $length); if ($this->_BIFF_version == 0x0600) { $data = pack("Vvv", $offset, $grbit, $cch); @@ -944,7 +944,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } $this->_append($header.$data.$sheetname); } - + /** * Write Internal SUPBOOK record * @@ -954,7 +954,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { $record = 0x01AE; // Record identifier $length = 0x0004; // Bytes to follow - + $header = pack("vv", $record, $length); $data = pack("vv", count($this->_worksheets), 0x0104); $this->_append($header.$data); @@ -962,7 +962,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri /** * Writes the Excel BIFF EXTERNSHEET record. These references are used by - * formulas. + * formulas. * * @param string $sheetname Worksheet name * @access private @@ -991,17 +991,17 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { $record = 0x0293; // Record identifier $length = 0x0004; // Bytes to follow - + $ixfe = 0x8000; // Index to style XF $BuiltIn = 0x00; // Built-in style $iLevel = 0xff; // Outline style level - + $header = pack("vv", $record, $length); $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); $this->_append($header.$data); } - - + + /** * Writes Excel FORMAT record for non "built-in" numerical formats. * @@ -1021,7 +1021,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } $cch = strlen($format); // Length of format string - + $header = pack("vv", $record, $length); if ($this->_BIFF_version == 0x0600) { $data = pack("vvC", $ifmt, $cch, $encoding); @@ -1030,7 +1030,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } $this->_append($header.$data.$format); } - + /** * Write DATEMODE record to indicate the date system in use (1904 or 1900). * @@ -1040,15 +1040,15 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { $record = 0x0022; // Record identifier $length = 0x0002; // Bytes to follow - + $f1904 = $this->_1904; // Flag for 1904 date system - + $header = pack("vv", $record, $length); $data = pack("v", $f1904); $this->_append($header.$data); } - - + + /** * Write BIFF record EXTERNCOUNT to indicate the number of external sheet * references in the workbook. @@ -1066,13 +1066,13 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { $record = 0x0016; // Record identifier $length = 0x0002; // Number of bytes to follow - + $header = pack("vv", $record, $length); $data = pack("v", $cxals); $this->_append($header.$data); } - - + + /** * Writes the Excel BIFF EXTERNSHEET record. These references are used by * formulas. NAME record is required to define the print area and the repeat @@ -1087,16 +1087,16 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { $record = 0x0017; // Record identifier $length = 0x02 + strlen($sheetname); // Number of bytes to follow - + $cch = strlen($sheetname); // Length of sheet name $rgch = 0x03; // Filename encoding - + $header = pack("vv", $record, $length); $data = pack("CC", $cch, $rgch); $this->_append($header.$data.$sheetname); } - - + + /** * Store the NAME record in the short format that is used for storing the print * area, repeat rows only and repeat columns only. @@ -1113,7 +1113,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri { $record = 0x0018; // Record identifier $length = 0x0024; // Number of bytes to follow - + $grbit = 0x0020; // Option flags $chKey = 0x00; // Keyboard shortcut $cch = 0x01; // Length of text name @@ -1125,14 +1125,14 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $cchHelptopic = 0x00; // Length of help topic text $cchStatustext = 0x00; // Length of status bar text $rgch = $type; // Built-in name type - + $unknown03 = 0x3b; $unknown04 = 0xffff-$index; $unknown05 = 0x0000; $unknown06 = 0x0000; $unknown07 = 0x1087; $unknown08 = 0x8005; - + $header = pack("vv", $record, $length); $data = pack("v", $grbit); $data .= pack("C", $chKey); @@ -1159,8 +1159,8 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $data .= pack("C", $colmax); $this->_append($header.$data); } - - + + /** * Store the NAME record in the long format that is used for storing the repeat * rows and columns when both are specified. This shares a lot of code with @@ -1190,7 +1190,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $cchHelptopic = 0x00; // Length of help topic text $cchStatustext = 0x00; // Length of status bar text $rgch = $type; // Built-in name type - + $unknown01 = 0x29; $unknown02 = 0x002b; $unknown03 = 0x3b; @@ -1199,7 +1199,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $unknown06 = 0x0000; $unknown07 = 0x1087; $unknown08 = 0x8008; - + $header = pack("vv", $record, $length); $data = pack("v", $grbit); $data .= pack("C", $chKey); @@ -1244,7 +1244,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $data .= pack("C", 0x10); $this->_append($header.$data); } - + /** * Stores the COUNTRY record for localization * @@ -1260,7 +1260,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $data = pack('vv', $this->_country_code, $this->_country_code); $this->_append($header.$data); } - + /** * Stores the PALETTE biff record. * @@ -1269,19 +1269,19 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri function _storePalette() { $aref = $this->_palette; - + $record = 0x0092; // Record identifier $length = 2 + 4 * count($aref); // Number of bytes to follow $ccv = count($aref); // Number of RGB values to follow $data = ''; // The RGB data - + // Pack the RGB data foreach($aref as $color) { foreach($color as $byte) { $data .= pack("C",$byte); } } - + $header = pack("vvv", $record, $length, $ccv); $this->_append($header.$data); } @@ -1313,43 +1313,43 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri foreach (array_keys($this->_str_table) as $string) { $string_length = strlen($string); - + // Block length is the total length of the strings that will be // written out in a single SST or CONTINUE block. $block_length += $string_length; - + // We can write the string if it doesn't cross a CONTINUE boundary if ($block_length < $continue_limit) { $written += $string_length; continue; } - + // Deal with the cases where the next string to be written will exceed // the CONTINUE boundary. If the string is very long it may need to be // written in more than one CONTINUE record. while ($block_length >= $continue_limit) { - + // We need to avoid the case where a string is continued in the first // n bytes that contain the string header information. $header_length = 3; // Min string + header size -1 $space_remaining = $continue_limit - $written - $continue; - - + + /* TODO: Unicode data should only be split on char (2 byte) boundaries. Therefore, in some cases we need to reduce the amount of available */ - + if ($space_remaining > $header_length) { // Write as much as possible of the string in the current block $written += $space_remaining; - + // Reduce the current block length by the amount written $block_length -= $continue_limit - $continue; - + // Store the max size for this block $this->_block_sizes[] = $continue_limit; - + // If the current string was split then the next CONTINUE block // should have the string continue flag (grbit) set unless the // split string fits exactly into the remaining space. @@ -1361,13 +1361,13 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } else { // Store the max size for this block $this->_block_sizes[] = $written + $continue; - + // Not enough space to start the string in the current block $block_length -= $continue_limit - $space_remaining - $continue; $continue = 0; - + } - + // If the string (or substr) is small enough we can write it in the // new CONTINUE block. Else, go through the loop again to write it in // one or more CONTINUE blocks @@ -1383,8 +1383,8 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri if ($written + $continue) { $this->_block_sizes[] = $written + $continue; } - - + + /* Calculate the total length of the SST and associated CONTINUEs (if any). The SST record will have a length even if it contains no strings. This length is required to set the offsets in the BOUNDSHEET records since @@ -1436,47 +1436,47 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $string_length = strlen($string); $encoding = 0; // assume there are no Unicode strings $split_string = 0; - + // Block length is the total length of the strings that will be // written out in a single SST or CONTINUE block. // $block_length += $string_length; - - + + // We can write the string if it doesn't cross a CONTINUE boundary if ($block_length < $continue_limit) { $this->_append($string); $written += $string_length; continue; } - + // Deal with the cases where the next string to be written will exceed // the CONTINUE boundary. If the string is very long it may need to be // written in more than one CONTINUE record. - // + // while ($block_length >= $continue_limit) { - + // We need to avoid the case where a string is continued in the first // n bytes that contain the string header information. // $header_length = 3; // Min string + header size -1 $space_remaining = $continue_limit - $written - $continue; - - + + // Unicode data should only be split on char (2 byte) boundaries. // Therefore, in some cases we need to reduce the amount of available - + if ($space_remaining > $header_length) { // Write as much as possible of the string in the current block $tmp = substr($string, 0, $space_remaining); $this->_append($tmp); - + // The remainder will be written in the next block(s) $string = substr($string, $space_remaining); - + // Reduce the current block length by the amount written $block_length -= $continue_limit - $continue; - + // If the current string was split then the next CONTINUE block // should have the string continue flag (grbit) set unless the // split string fits exactly into the remaining space. @@ -1491,7 +1491,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri $block_length -= $continue_limit - $space_remaining - $continue; $continue = 0; } - + // Write the CONTINUE block header if (!empty($this->_block_sizes)) { $record = 0x003C; @@ -1502,7 +1502,7 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri } $this->_append($header); } - + // If the string (or substr) is small enough we can write it in the // new CONTINUE block. Else, go through the loop again to write it in // one or more CONTINUE blocks diff --git a/Writer/Worksheet.php b/Writer/Worksheet.php index cb3bf08..3af4b6c 100644 --- a/Writer/Worksheet.php +++ b/Writer/Worksheet.php @@ -5,7 +5,7 @@ * The majority of this is _NOT_ my code. I simply ported it from the * PERL Spreadsheet::WriteExcel module. * -* The author of the Spreadsheet::WriteExcel module is John McNamara +* The author of the Spreadsheet::WriteExcel module is John McNamara * * * I _DO_ maintain this code, and John McNamara has nothing to do with the @@ -282,44 +282,44 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr * @var integer */ var $_outline_on; - + /** * Auto outline styles. * @var bool */ var $_outline_style; - + /** * Whether to have outline summary below. * @var bool */ var $_outline_below; - + /** * Whether to have outline summary at the right. * @var bool */ var $_outline_right; - + /** * Outline row level. * @var integer */ var $_outline_row_level; - + /** * Whether to fit to page when printing or not. * @var bool */ var $_fit_page; - /** + /** * Number of pages to fit wide * @var integer */ var $_fit_width; - /** + /** * Number of pages to fit high * @var integer */ @@ -355,7 +355,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr * @param string $name The name of the new worksheet * @param integer $index The index of the new worksheet * @param mixed &$activesheet The current activesheet of the workbook we belong to - * @param mixed &$firstsheet The first worksheet in the workbook we belong to + * @param mixed &$firstsheet The first worksheet in the workbook we belong to * @param mixed &$url_format The default format for hyperlinks * @param mixed &$parser The formula parser created for the Workbook * @access private @@ -371,7 +371,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_BIFF_version = $BIFF_version; $rowmax = 65536; // 16384 in Excel 5 $colmax = 256; - + $this->name = $name; $this->index = $index; $this->activesheet = &$activesheet; @@ -381,7 +381,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_str_table = &$str_table; $this->_url_format = &$url_format; $this->_parser = &$parser; - + //$this->ext_sheets = array(); $this->_filehandle = ""; $this->_using_tmpfile = true; @@ -400,7 +400,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_active_pane = 3; $this->_frozen = 0; $this->selected = 0; - + $this->_paper_size = 0x0; $this->_orientation = 0x1; $this->_header = ''; @@ -413,7 +413,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_margin_right = 0.75; $this->_margin_top = 1.00; $this->_margin_bottom = 1.00; - + $this->title_rowmin = NULL; $this->title_rowmax = NULL; $this->title_colmin = NULL; @@ -422,27 +422,27 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->print_rowmax = NULL; $this->print_colmin = NULL; $this->print_colmax = NULL; - + $this->_print_gridlines = 1; $this->_screen_gridlines = 1; $this->_print_headers = 0; - + $this->_fit_page = 0; $this->_fit_width = 0; $this->_fit_height = 0; - + $this->_hbreaks = array(); $this->_vbreaks = array(); - + $this->_protect = 0; $this->_password = NULL; - + $this->col_sizes = array(); $this->_row_sizes = array(); - + $this->_zoom = 100; $this->_print_scale = 100; - + $this->_outline_row_level = 0; $this->_outline_style = 0; $this->_outline_below = 1; @@ -455,7 +455,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_initialize(); } - + /** * Open a tmp file to store the majority of the Worksheet data. If this fails, * for example due to write permissions, store the data in memory. This can be @@ -475,70 +475,70 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_using_tmpfile = false; } } - + /** * Add data to the beginning of the workbook (note the reverse order) * and to the end of the workbook. * - * @access public + * @access public * @see Spreadsheet_Excel_Writer_Workbook::storeWorkbook() - * @param array $sheetnames The array of sheetnames from the Workbook this + * @param array $sheetnames The array of sheetnames from the Workbook this * worksheet belongs to */ function close($sheetnames) { $num_sheets = count($sheetnames); - + /*********************************************** * Prepend in reverse order!! */ - + // Prepend the sheet dimensions $this->_storeDimensions(); - + // Prepend the sheet password $this->_storePassword(); - + // Prepend the sheet protection $this->_storeProtect(); - + // Prepend the page setup $this->_storeSetup(); - + /* FIXME: margins are actually appended */ // Prepend the bottom margin $this->_storeMarginBottom(); - + // Prepend the top margin $this->_storeMarginTop(); - + // Prepend the right margin $this->_storeMarginRight(); - + // Prepend the left margin $this->_storeMarginLeft(); - + // Prepend the page vertical centering $this->_storeVcenter(); - + // Prepend the page horizontal centering $this->_storeHcenter(); - + // Prepend the page footer $this->_storeFooter(); - + // Prepend the page header $this->_storeHeader(); - + // Prepend the vertical page breaks $this->_storeVbreak(); - + // Prepend the horizontal page breaks $this->_storeHbreak(); - + // Prepend WSBOOL $this->_storeWsbool(); - + // Prepend GRIDSET $this->_storeGridset(); @@ -546,13 +546,13 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($this->_BIFF_version == 0x0500) { $this->_storeGuts(); } - + // Prepend PRINTGRIDLINES $this->_storePrintGridlines(); - + // Prepend PRINTHEADERS $this->_storePrintHeaders(); - + // Prepend EXTERNSHEET references if ($this->_BIFF_version == 0x0500) { for ($i = $num_sheets; $i > 0; $i--) { @@ -560,12 +560,12 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_storeExternsheet($sheetname); } } - + // Prepend the EXTERNCOUNT of external references. if ($this->_BIFF_version == 0x0500) { $this->_storeExterncount($num_sheets); } - + // Prepend the COLINFO records if they exist if (!empty($this->_colinfo)) { for ($i = 0; $i < count($this->_colinfo); $i++) { @@ -573,14 +573,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } $this->_storeDefcol(); } - + // Prepend the BOF record $this->_storeBof(0x0010); - + /* * End of prepend. Read upwards from here. ***********************************************/ - + // Append $this->_storeWindow2(); $this->_storeZoom(); @@ -595,7 +595,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr }*/ $this->_storeEof(); } - + /** * Retrieve the worksheet name. * This is usefull when creating worksheets without a name. @@ -607,7 +607,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { return $this->name; } - + /** * Retrieves data from memory in one chunk, or from disk in $buffer * sized chunks. @@ -617,7 +617,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr function getData() { $buffer = 4096; - + // Return data stored in memory if (isset($this->_data)) { $tmp = $this->_data; @@ -634,11 +634,11 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr return $tmp; } } - + // No data to return return ''; } - + /** * Sets a merged cell range * @@ -668,7 +668,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->selected = 1; } - + /** * Set this worksheet as the active worksheet, * i.e. the worksheet that is displayed when the workbook is opened. @@ -681,7 +681,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->selected = 1; $this->activesheet = $this->index; } - + /** * Set this worksheet as the first visible sheet. * This is necessary when there are a large number of worksheets and the @@ -693,7 +693,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->firstsheet = $this->index; } - + /** * Set the worksheet protection flag * to prevent accidental modification and to @@ -707,7 +707,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_protect = 1; $this->_password = $this->_encodePassword($password); } - + /** * Set the width of a single column or a range of columns. * @@ -722,15 +722,15 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr function setColumn($firstcol, $lastcol, $width, $format = 0, $hidden = 0, $level = 0) { $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; } } - + /** * Set which cell or cells are selected in a worksheet * @@ -744,7 +744,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_selection = array($first_row,$first_column,$last_row,$last_column); } - + /** * Set panes and mark them as frozen. * @@ -761,7 +761,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_frozen = 1; $this->_panes = $panes; } - + /** * Set panes and mark them as unfrozen. * @@ -778,7 +778,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_frozen = 0; $this->_panes = $panes; } - + /** * Set the page orientation as portrait. * @@ -788,7 +788,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_orientation = 1; } - + /** * Set the page orientation as landscape. * @@ -798,7 +798,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_orientation = 0; } - + /** * Set the paper type. Ex. 1 = US Letter, 9 = A4 * @@ -809,8 +809,8 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_paper_size = $size; } - - + + /** * Set the page header caption and optional margin. * @@ -827,7 +827,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_header = $string; $this->_margin_head = $margin; } - + /** * Set the page footer caption and optional margin. * @@ -844,7 +844,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_footer = $string; $this->_margin_foot = $margin; } - + /** * Center the page horinzontally. * @@ -855,7 +855,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_hcenter = $center; } - + /** * Center the page vertically. * @@ -866,7 +866,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_vcenter = $center; } - + /** * Set all the page margins to the same value in inches. * @@ -880,7 +880,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->setMarginTop($margin); $this->setMarginBottom($margin); } - + /** * Set the left and right margins to the same value in inches. * @@ -892,7 +892,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->setMarginLeft($margin); $this->setMarginRight($margin); } - + /** * Set the top and bottom margins to the same value in inches. * @@ -904,7 +904,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->setMarginTop($margin); $this->setMarginBottom($margin); } - + /** * Set the left margin in inches. * @@ -915,7 +915,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_margin_left = $margin; } - + /** * Set the right margin in inches. * @@ -926,7 +926,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_margin_right = $margin; } - + /** * Set the top margin in inches. * @@ -937,7 +937,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_margin_top = $margin; } - + /** * Set the bottom margin in inches. * @@ -948,7 +948,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_margin_bottom = $margin; } - + /** * Set the rows to repeat at the top of each printed page. * @@ -965,7 +965,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->title_rowmax = $first_row; } } - + /** * Set the columns to repeat at the left hand side of each printed page. * @@ -982,7 +982,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->title_colmax = $first_col; } } - + /** * Set the area of each worksheet that will be printed. * @@ -999,10 +999,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->print_rowmax = $last_row; $this->print_colmax = $last_col; } - - + + /** - * Set the option to hide gridlines on the printed page. + * Set the option to hide gridlines on the printed page. * * @access public */ @@ -1010,9 +1010,9 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_print_gridlines = 0; } - + /** - * Set the option to hide gridlines on the worksheet (as seen on the screen). + * Set the option to hide gridlines on the worksheet (as seen on the screen). * * @access public */ @@ -1020,7 +1020,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_screen_gridlines = 0; } - + /** * Set the option to print the row and column headers on the printed page. * @@ -1031,7 +1031,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $this->_print_headers = $print; } - + /** * Set the vertical and horizontal number of pages that will define the maximum area printed. * It doesn't seem to work with OpenOffice. @@ -1047,7 +1047,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_fit_width = $width; $this->_fit_height = $height; } - + /** * Store the horizontal page breaks on a worksheet (for printing). * The breaks represent the row after which the break is inserted. @@ -1061,7 +1061,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr array_push($this->_hbreaks,$break); } } - + /** * Store the vertical page breaks on a worksheet (for printing). * The breaks represent the column after which the break is inserted. @@ -1075,8 +1075,8 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr array_push($this->_vbreaks,$break); } } - - + + /** * Set the worksheet zoom factor. * @@ -1090,12 +1090,12 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->raiseError("Zoom factor $scale outside range: 10 <= zoom <= 400"); $scale = 100; } - + $this->_zoom = floor($scale); } - + /** - * Set the scale factor for the printed page. + * Set the scale factor for the printed page. * It turns off the "fit to page" option * * @access public @@ -1108,13 +1108,13 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->raiseError("Print scale $scale outside range: 10 <= zoom <= 400"); $scale = 100; } - + // Turn off "fit to page" option $this->_fit_page = 0; - + $this->_print_scale = floor($scale); } - + /** * Map to the appropriate write method acording to the token recieved. * @@ -1130,7 +1130,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr /*if ($_[0] =~ /^\D/) { @_ = $this->_substituteCellref(@_); }*/ - + if (preg_match("/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/",$token)) { // Match number return $this->writeNumber($row,$col,$token,$format); @@ -1157,7 +1157,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr return $this->writeString($row,$col,$token,$format); } } - + /** * Write an array of values as a row * @@ -1170,7 +1170,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr */ function writeRow($row, $col, $val, $format=0) - { + { $retval = ''; if (is_array($val)) { foreach($val as $v) { @@ -1186,7 +1186,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } return($retval); } - + /** * Write an array of values as a column * @@ -1197,12 +1197,12 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr * @param mixed $format The optional format to apply to the cell * @return mixed PEAR_Error on failure */ - + function writeCol($row, $col, $val, $format=0) { $retval = ''; if (is_array($val)) { - foreach($val as $v) { + foreach($val as $v) { $this->write($row, $col, $v, $format); $row++; } @@ -1211,7 +1211,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } return($retval); } - + /** * Returns an index to the XF record in the workbook * @@ -1227,15 +1227,15 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr return(0x0F); } } - - + + /****************************************************************************** ******************************************************************************* * * Internal methods */ - - + + /** * Store Worksheet data in memory using the parent's class append() or to a * temporary file, the default. @@ -1256,7 +1256,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr parent::_append($data); } } - + /** * Substitute an Excel cell reference in A1 notation for zero based row and * column values in an argument list. @@ -1270,31 +1270,31 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr function _substituteCellref($cell) { $cell = strtoupper($cell); - + // Convert a column range: 'A:A' or 'B:G' if (preg_match("/([A-I]?[A-Z]):([A-I]?[A-Z])/", $cell, $match)) { list($no_use, $col1) = $this->_cellToRowcol($match[1] .'1'); // Add a dummy row list($no_use, $col2) = $this->_cellToRowcol($match[2] .'1'); // Add a dummy row return(array($col1, $col2)); } - + // Convert a cell range: 'A1:B7' if (preg_match("/\$?([A-I]?[A-Z]\$?\d+):\$?([A-I]?[A-Z]\$?\d+)/", $cell, $match)) { list($row1, $col1) = $this->_cellToRowcol($match[1]); list($row2, $col2) = $this->_cellToRowcol($match[2]); return(array($row1, $col1, $row2, $col2)); } - + // Convert a cell reference: 'A1' or 'AD2000' if (preg_match("/\$?([A-I]?[A-Z]\$?\d+)/", $cell)) { list($row1, $col1) = $this->_cellToRowcol($match[1]); return(array($row1, $col1)); } - + // TODO use real error codes $this->raiseError("Unknown cell reference $cell", 0, PEAR_ERROR_DIE); } - + /** * Convert an Excel cell reference in A1 notation to a zero based row and column * reference; converts C1 to (0, 2). @@ -1308,25 +1308,25 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr preg_match("/\$?([A-I]?[A-Z])\$?(\d+)/",$cell,$match); $col = $match[1]; $row = $match[2]; - + // Convert base26 column string to number $chars = split('', $col); $expn = 0; $col = 0; - + while ($chars) { $char = array_pop($chars); // LS char first $col += (ord($char) -ord('A') +1) * pow(26,$expn); $expn++; } - + // Convert 1-index to zero-index $row--; $col--; - + return(array($row, $col)); } - + /** * Based on the algorithm provided by Daniel Rentz of OpenOffice. * @@ -1338,17 +1338,17 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $password = 0x0000; $i = 1; // char position - + // split the plain text password in its component characters $chars = preg_split('//', $plaintext, -1, PREG_SPLIT_NO_EMPTY); foreach($chars as $char) { - $value = ord($char) << $i; // shifted ASCII value + $value = ord($char) << $i; // shifted ASCII value $rotated_bits = $value >> 15; // rotated bits beyond bit 15 $value &= 0x7fff; // first 15 bits $password ^= ($value | $rotated_bits); $i++; } - + $password ^= strlen($plaintext); $password ^= 0xCE4B; @@ -1382,8 +1382,8 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr * * BIFF RECORDS */ - - + + /** * Write a double to the specified row and column (zero indexed). * An integer can be written as a double. Excel will display an @@ -1403,9 +1403,9 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0203; // Record identifier $length = 0x000E; // Number of bytes to follow - + $xf = $this->_XF($format); // The cell format - + // Check that row and col are valid and store max and min values if ($row >= $this->_xls_rowmax) { return(-2); @@ -1425,18 +1425,18 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($col > $this->_dim_colmax) { $this->_dim_colmax = $col; } - + $header = pack("vv", $record, $length); $data = pack("vvv", $row, $col, $xf); $xl_double = pack("d", $num); if ($this->_byte_order) { // if it's Big Endian $xl_double = strrev($xl_double); } - + $this->_append($header.$data.$xl_double); return(0); } - + /** * Write a string to the specified row and column (zero indexed). * NOTE: there is an Excel 5 defined limit of 255 characters. @@ -1461,9 +1461,9 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $record = 0x0204; // Record identifier $length = 0x0008 + $strlen; // Bytes to follow $xf = $this->_XF($format); // The cell format - + $str_error = 0; - + // Check that row and col are valid and store max and min values if ($row >= $this->_xls_rowmax) { return(-2); @@ -1483,14 +1483,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($col > $this->_dim_colmax) { $this->_dim_colmax = $col; } - + if ($strlen > $this->_xls_strmax) { // LABEL must be < 255 chars $str = substr($str, 0, $this->_xls_strmax); $length = 0x0008 + $this->_xls_strmax; $strlen = $this->_xls_strmax; $str_error = -3; } - + $header = pack("vv", $record, $length); $data = pack("vvvv", $row, $col, $xf, $strlen); $this->_append($header.$data.$str); @@ -1504,9 +1504,9 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $length = 0x000A; // Bytes to follow $xf = $this->_XF($format); // The cell format $encoding = 0x0; - + $str_error = 0; - + // Check that row and col are valid and store max and min values if ($this->_checkRowCol($row, $col) == false) { return -2; @@ -1519,7 +1519,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_str_table[$str] = $this->_str_unique++; } $this->_str_total++; - + $header = pack('vv', $record, $length); $data = pack('vvvV', $row, $col, $xf, $this->_str_table[$str]); $this->_append($header.$data); @@ -1594,7 +1594,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($col > $this->_dim_colmax) { $this->_dim_colmax = $col; } - + // Length for this record is no more than 2048 + 6 $length = 0x0006 + min($note_length, 2048); $header = pack("vv", $record, $length); @@ -1634,11 +1634,11 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($format == 0) { return(0); } - + $record = 0x0201; // Record identifier $length = 0x0006; // Number of bytes to follow $xf = $this->_XF($format); // The cell format - + // Check that row and col are valid and store max and min values if ($row >= $this->_xls_rowmax) { return(-2); @@ -1658,7 +1658,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($col > $this->_dim_colmax) { $this->_dim_colmax = $col; } - + $header = pack("vv", $record, $length); $data = pack("vvv", $row, $col, $xf); $this->_append($header.$data); @@ -1684,7 +1684,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr function writeFormula($row, $col, $formula, $format = 0) { $record = 0x0006; // Record identifier - + // Excel normally stores the last calculated value of the formula in $num. // Clearly we are not in a position to calculate this a priori. Instead // we set $num to zero and set the option flags in $grbit to ensure @@ -1694,13 +1694,13 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $num = 0x00; // Current value of formula $grbit = 0x03; // Option flags $unknown = 0x0000; // Must be zero - - + + // Check that row and col are valid and store max and min values if ($this->_checkRowCol($row, $col) == false) { return -2; } - + // Strip the '=' or '@' sign at the beginning of the formula string if (preg_match("/^=/",$formula)) { $formula = preg_replace("/(^=)/","",$formula); @@ -1711,31 +1711,31 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->writeString($row, $col, 'Unrecognised character for formula'); return -1; } - + // Parse the formula using the parser in Parser.php $error = $this->_parser->parse($formula); if ($this->isError($error)) { - $this->writeString($row, $col, $error->getMessage()); + $this->writeString($row, $col, $error->getMessage()); return -1; } - + $formula = $this->_parser->toReversePolish(); if ($this->isError($formula)) { $this->writeString($row, $col, $formula->getMessage()); return -1; } - + $formlen = strlen($formula); // Length of the binary string $length = 0x16 + $formlen; // Length of the record data - + $header = pack("vv", $record, $length); $data = pack("vvvdvVv", $row, $col, $xf, $num, $grbit, $unknown, $formlen); - + $this->_append($header.$data.$formula); return 0; } - + /** * Write a hyperlink. * This is comprised of two elements: the visible label and @@ -1764,7 +1764,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr // Add start row and col to arg list return($this->_writeUrlRange($row, $col, $row, $col, $url, $string, $format)); } - + /** * This is the more general form of writeUrl(). It allows a hyperlink to be * written to a range of cells. This function also decides the type of hyperlink @@ -1782,10 +1782,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr * @param mixed $format The cell format * @return integer */ - + function _writeUrlRange($row1, $col1, $row2, $col2, $url, $string = '', $format = 0) { - + // Check for internal/external sheet links or default to web link if (preg_match('[^internal:]', $url)) { return($this->_writeUrlInternal($row1, $col1, $row2, $col2, $url, $string, $format)); @@ -1795,8 +1795,8 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } return($this->_writeUrlWeb($row1, $col1, $row2, $col2, $url, $string, $format)); } - - + + /** * Used to write http, ftp and mailto hyperlinks. * The link type ($options) is 0x03 is the same as absolute dir ref without @@ -1817,11 +1817,11 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x01B8; // Record identifier $length = 0x00000; // Bytes to follow - + if ($format == 0) { $format = $this->_url_format; } - + // Write the visible label using the writeString() method. if ($str == '') { $str = $url; @@ -1830,35 +1830,35 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (($str_error == -2) || ($str_error == -3)) { return $str_error; } - + // Pack the undocumented parts of the hyperlink stream $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); $unknown2 = pack("H*", "E0C9EA79F9BACE118C8200AA004BA90B"); - + // Pack the option flags $options = pack("V", 0x03); - + // Convert URL to a null terminated wchar string $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); $url = $url . "\0\0\0"; - + // Pack the length of the URL $url_len = pack("V", strlen($url)); - + // Calculate the data length $length = 0x34 + strlen($url); - + // Pack the header data $header = pack("vv", $record, $length); $data = pack("vvvv", $row1, $row2, $col1, $col2); - + // Write the packed data $this->_append( $header. $data. $unknown1. $options. $unknown2. $url_len. $url); return($str_error); } - + /** * Used to write internal reference hyperlinks such as "Sheet1!A1". * @@ -1877,14 +1877,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x01B8; // Record identifier $length = 0x00000; // Bytes to follow - + if ($format == 0) { $format = $this->_url_format; } - + // Strip URL type $url = preg_replace('[^internal:]', '', $url); - + // Write the visible label if ($str == '') { $str = $url; @@ -1893,34 +1893,34 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (($str_error == -2) || ($str_error == -3)) { return $str_error; } - + // Pack the undocumented parts of the hyperlink stream $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); - + // Pack the option flags $options = pack("V", 0x08); - + // Convert the URL type and to a null terminated wchar string $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); $url = $url . "\0\0\0"; - + // Pack the length of the URL as chars (not wchars) $url_len = pack("V", floor(strlen($url)/2)); - + // Calculate the data length $length = 0x24 + strlen($url); - + // Pack the header data $header = pack("vv", $record, $length); $data = pack("vvvv", $row1, $row2, $col1, $col2); - + // Write the packed data $this->_append($header. $data. $unknown1. $options. $url_len. $url); return($str_error); } - + /** * Write links to external directory names such as 'c:\foo.xls', * c:\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'. @@ -1946,19 +1946,19 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (preg_match('[^external:\\\\]', $url)) { return; //($this->_writeUrlExternal_net($row1, $col1, $row2, $col2, $url, $str, $format)); } - + $record = 0x01B8; // Record identifier $length = 0x00000; // Bytes to follow - + if ($format == 0) { $format = $this->_url_format; } - + // Strip URL type and change Unix dir separator to Dos style (if needed) // $url = preg_replace('[^external:]', '', $url); $url = preg_replace('[/]', "\\", $url); - + // Write the visible label if ($str == '') { $str = preg_replace('[\#]', ' - ', $url); @@ -1967,12 +1967,12 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (($str_error == -2) || ($str_error == -3)) { return $str_error; } - + // Determine if the link is relative or absolute: // relative if link contains no dir separator, "somefile.xls" // relative if link starts with up-dir, "..\..\somefile.xls" // otherwise, absolute - + $absolute = 0x02; // Bit mask if (!preg_match('[\\]', $url)) { $absolute = 0x00; @@ -1980,13 +1980,13 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (preg_match('[^\.\.\\]', $url)) { $absolute = 0x00; } - + // Determine if the link contains a sheet reference and change some of the // parameters accordingly. // Split the dir name and sheet name (if it exists) list($dir_long , $sheet) = split('/\#/', $url); $link_type = 0x01 | $absolute; - + if (isset($sheet)) { $link_type |= 0x08; $sheet_len = pack("V", strlen($sheet) + 0x01); @@ -1997,32 +1997,32 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $sheet_len = ''; $sheet = ''; } - + // Pack the link type $link_type = pack("V", $link_type); - + // Calculate the up-level dir count e.g.. (..\..\..\ == 3) $up_count = preg_match_all("/\.\.\\/", $dir_long, $useless); $up_count = pack("v", $up_count); - + // Store the short dos dir name (null terminated) $dir_short = preg_replace('/\.\.\\/', '', $dir_long) . "\0"; - + // Store the long dir name as a wchar string (non-null terminated) $dir_long = join("\0", split('', $dir_long)); $dir_long = $dir_long . "\0"; - + // Pack the lengths of the dir strings $dir_short_len = pack("V", strlen($dir_short) ); $dir_long_len = pack("V", strlen($dir_long) ); $stream_len = pack("V", strlen($dir_long) + 0x06); - + // Pack the undocumented parts of the hyperlink stream $unknown1 = pack("H*",'D0C9EA79F9BACE118C8200AA004BA90B02000000' ); $unknown2 = pack("H*",'0303000000000000C000000000000046' ); $unknown3 = pack("H*",'FFFFADDE000000000000000000000000000000000000000'); $unknown4 = pack("v", 0x03 ); - + // Pack the main data stream $data = pack("vvvv", $row1, $row2, $col1, $col2) . $unknown1 . @@ -2038,23 +2038,23 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $dir_long . $sheet_len . $sheet ; - + // Pack the header data $length = strlen($data); $header = pack("vv", $record, $length); - + // Write the packed data $this->_append($header. $data); return($str_error); } - - + + /** * This method is used to set the height and format for a row. * * @access public * @param integer $row The row to set - * @param integer $height Height we are giving to the row. + * @param integer $height Height we are giving to the row. * Use NULL to set XF without setting height * @param mixed $format XF format we are giving to the row * @param bool $hidden The optional hidden attribute @@ -2064,7 +2064,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0208; // Record identifier $length = 0x0010; // Number of bytes to follow - + $colMic = 0x0000; // First defined column $colMac = 0x0000; // Last defined column $irwMac = 0x0000; // Used by Excel to optimise loading @@ -2107,7 +2107,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $irwMac,$reserved, $grbit, $ixfe); $this->_append($header.$data); } - + /** * Writes Excel DIMENSIONS to define the area in which there is data. * @@ -2121,7 +2121,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $col_min = $this->_dim_colmin; // First column $col_max = $this->_dim_colmax + 1; // Last column plus 1 $reserved = 0x0000; // Reserved by Excel - + if ($this->_BIFF_version == 0x0500) { $length = 0x000A; // Number of bytes to follow $data = pack("vvvvv", $row_min, $row_max, @@ -2134,7 +2134,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $header = pack("vv", $record, $length); $this->_prepend($header.$data); } - + /** * Write BIFF record Window2. * @@ -2152,8 +2152,8 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $grbit = 0x00B6; // Option flags $rwTop = 0x0000; // Top row visible in window $colLeft = 0x0000; // Leftmost column visible in window - - + + // The options flags that comprise $grbit $fDspFmla = 0; // 0 - bit $fDspGrid = $this->_screen_gridlines; // 1 @@ -2166,7 +2166,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $fFrozenNoSplit = 0; // 0 - bit $fSelected = $this->selected; // 1 $fPaged = 1; // 2 - + $grbit = $fDspFmla; $grbit |= $fDspGrid << 1; $grbit |= $fDspRwCol << 2; @@ -2178,7 +2178,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $grbit |= $fFrozenNoSplit << 8; $grbit |= $fSelected << 9; $grbit |= $fPaged << 10; - + $header = pack("vv", $record, $length); $data = pack("vvv", $grbit, $rwTop, $colLeft); // FIXME !!! @@ -2193,7 +2193,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } $this->_append($header.$data); } - + /** * Write BIFF record DEFCOLWIDTH if COLINFO records are in use. * @@ -2204,12 +2204,12 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $record = 0x0055; // Record identifier $length = 0x0002; // Number of bytes to follow $colwidth = 0x0008; // Default column width - + $header = pack("vv", $record, $length); $data = pack("v", $colwidth); $this->_prepend($header.$data); } - + /** * Write BIFF record COLINFO to define column widths * @@ -2255,10 +2255,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } $record = 0x007D; // Record identifier $length = 0x000B; // Number of bytes to follow - + $coldx += 0.72; // Fudge. Excel subtracts 0.72 !? $coldx *= 256; // Convert to units of 1/256 of a char - + $ixfe = $this->_XF($format); $reserved = 0x00; // Reserved @@ -2270,7 +2270,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $ixfe, $grbit, $reserved); $this->_prepend($header.$data); } - + /** * Write BIFF record SELECTION. * @@ -2283,29 +2283,29 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr list($rwFirst,$colFirst,$rwLast,$colLast) = $array; $record = 0x001D; // Record identifier $length = 0x000F; // Number of bytes to follow - + $pnn = $this->_active_pane; // Pane position $rwAct = $rwFirst; // Active row $colAct = $colFirst; // Active column $irefAct = 0; // Active cell ref $cref = 1; // Number of refs - + if (!isset($rwLast)) { $rwLast = $rwFirst; // Last row in reference } if (!isset($colLast)) { $colLast = $colFirst; // Last col in reference } - + // Swap last row/col for first row/col as necessary if ($rwFirst > $rwLast) { list($rwFirst, $rwLast) = array($rwLast, $rwFirst); } - + if ($colFirst > $colLast) { list($colFirst, $colLast) = array($colLast, $colFirst); } - + $header = pack("vv", $record, $length); $data = pack("CvvvvvvCC", $pnn, $rwAct, $colAct, $irefAct, $cref, @@ -2313,7 +2313,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $colFirst, $colLast); $this->_append($header.$data); } - + /** * Store the MERGEDCELLS record for all ranges of merged cells * @@ -2326,8 +2326,8 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr return; } $record = 0x00E5; - $length = 2 + count($this->_merged_ranges) * 8; - + $length = 2 + count($this->_merged_ranges) * 8; + $header = pack('vv', $record, $length); $data = pack('v', count($this->_merged_ranges)); foreach ($this->_merged_ranges as $range) { @@ -2335,7 +2335,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } $this->_append($header.$data); } - + /** * Write BIFF record EXTERNCOUNT to indicate the number of external sheet * references in a worksheet. @@ -2353,12 +2353,12 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0016; // Record identifier $length = 0x0002; // Number of bytes to follow - + $header = pack("vv", $record, $length); $data = pack("v", $count); $this->_prepend($header.$data); } - + /** * Writes the Excel BIFF EXTERNSHEET record. These references are used by * formulas. A formula references a sheet name via an index. Since we store a @@ -2371,7 +2371,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr function _storeExternsheet($sheetname) { $record = 0x0017; // Record identifier - + // References to the current sheet are encoded differently to references to // external sheets. // @@ -2385,12 +2385,12 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $cch = strlen($sheetname); $rgch = 0x03; // Reference to a sheet in the current workbook } - + $header = pack("vv", $record, $length); $data = pack("CC", $cch, $rgch); $this->_prepend($header.$data.$sheetname); } - + /** * Writes the Excel BIFF PANE record. * The panes can either be frozen or thawed (unfrozen). @@ -2418,7 +2418,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } $record = 0x0041; // Record identifier $length = 0x000A; // Number of bytes to follow - + // Code specific to frozen or thawed panes. if ($this->_frozen) { // Set default values for $rwTop and $colLeft @@ -2436,7 +2436,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (!isset($colLeft)) { $colLeft = 0; } - + // Convert Excel's row and column units to the internal units. // The default row height is 12.75 // The default column width is 8.43 @@ -2445,8 +2445,8 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $y = 20*$y + 255; $x = 113.879*$x + 390; } - - + + // Determine which pane should be active. There is also the undocumented // option to override this should it be necessary: may be removed later. // @@ -2464,14 +2464,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $pnnAct = 3; // Top left } } - + $this->_active_pane = $pnnAct; // Used in _storeSelection - + $header = pack("vv", $record, $length); $data = pack("vvvvv", $x, $y, $rwTop, $colLeft, $pnnAct); $this->_append($header.$data); } - + /** * Store the page setup SETUP BIFF record. * @@ -2481,7 +2481,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x00A1; // Record identifier $length = 0x0022; // Number of bytes to follow - + $iPaperSize = $this->_paper_size; // Paper size $iScale = $this->_print_scale; // Print scaling factor $iPageStart = 0x01; // Starting page number @@ -2493,7 +2493,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $numHdr = $this->_margin_head; // Header Margin $numFtr = $this->_margin_foot; // Footer Margin $iCopies = 0x01; // Number of copies - + $fLeftToRight = 0x0; // Print over then down $fLandscape = $this->_orientation; // Page orientation $fNoPls = 0x0; // Setup not read from printer @@ -2502,7 +2502,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $fNotes = 0x0; // Print notes $fNoOrient = 0x0; // Orientation not set $fUsePage = 0x0; // Use custom starting page - + $grbit = $fLeftToRight; $grbit |= $fLandscape << 1; $grbit |= $fNoPls << 2; @@ -2511,14 +2511,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $grbit |= $fNotes << 5; $grbit |= $fNoOrient << 6; $grbit |= $fUsePage << 7; - + $numHdr = pack("d", $numHdr); $numFtr = pack("d", $numFtr); if ($this->_byte_order) { // if it's Big Endian $numHdr = strrev($numHdr); $numFtr = strrev($numFtr); } - + $header = pack("vv", $record, $length); $data1 = pack("vvvvvvvv", $iPaperSize, $iScale, @@ -2532,7 +2532,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $data3 = pack("v", $iCopies); $this->_prepend($header.$data1.$data2.$data3); } - + /** * Store the header caption BIFF record. * @@ -2541,7 +2541,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr function _storeHeader() { $record = 0x0014; // Record identifier - + $str = $this->_header; // header string $cch = strlen($str); // Length of header string if ($this->_BIFF_version == 0x0600) { @@ -2556,10 +2556,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } else { $data = pack("C", $cch); } - + $this->_append($header.$data.$str); } - + /** * Store the footer caption BIFF record. * @@ -2568,7 +2568,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr function _storeFooter() { $record = 0x0015; // Record identifier - + $str = $this->_footer; // Footer string $cch = strlen($str); // Length of footer string if ($this->_BIFF_version == 0x0600) { @@ -2583,10 +2583,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } else { $data = pack("C", $cch); } - + $this->_append($header.$data.$str); } - + /** * Store the horizontal centering HCENTER BIFF record. * @@ -2596,15 +2596,15 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0083; // Record identifier $length = 0x0002; // Bytes to follow - + $fHCenter = $this->_hcenter; // Horizontal centering - + $header = pack("vv", $record, $length); $data = pack("v", $fHCenter); - + $this->_append($header.$data); } - + /** * Store the vertical centering VCENTER BIFF record. * @@ -2614,14 +2614,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0084; // Record identifier $length = 0x0002; // Bytes to follow - + $fVCenter = $this->_vcenter; // Horizontal centering - + $header = pack("vv", $record, $length); $data = pack("v", $fVCenter); $this->_append($header.$data); } - + /** * Store the LEFTMARGIN BIFF record. * @@ -2631,18 +2631,18 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0026; // Record identifier $length = 0x0008; // Bytes to follow - + $margin = $this->_margin_left; // Margin in inches - + $header = pack("vv", $record, $length); $data = pack("d", $margin); if ($this->_byte_order) { // if it's Big Endian $data = strrev($data); } - + $this->_append($header.$data); } - + /** * Store the RIGHTMARGIN BIFF record. * @@ -2652,18 +2652,18 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0027; // Record identifier $length = 0x0008; // Bytes to follow - + $margin = $this->_margin_right; // Margin in inches - + $header = pack("vv", $record, $length); $data = pack("d", $margin); if ($this->_byte_order) { // if it's Big Endian $data = strrev($data); } - + $this->_append($header.$data); } - + /** * Store the TOPMARGIN BIFF record. * @@ -2673,18 +2673,18 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0028; // Record identifier $length = 0x0008; // Bytes to follow - + $margin = $this->_margin_top; // Margin in inches - + $header = pack("vv", $record, $length); $data = pack("d", $margin); if ($this->_byte_order) { // if it's Big Endian $data = strrev($data); } - + $this->_append($header.$data); } - + /** * Store the BOTTOMMARGIN BIFF record. * @@ -2694,15 +2694,15 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0029; // Record identifier $length = 0x0008; // Bytes to follow - + $margin = $this->_margin_bottom; // Margin in inches - + $header = pack("vv", $record, $length); $data = pack("d", $margin); if ($this->_byte_order) { // if it's Big Endian $data = strrev($data); } - + $this->_append($header.$data); } @@ -2727,15 +2727,15 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($first_row > $last_row) { list($first_row, $last_row) = array($last_row, $first_row); } - + if ($first_col > $last_col) { list($first_col, $last_col) = array($last_col, $first_col); } - + $header = pack("vv", $record, $length); $data = pack("vvvvv", $cref, $first_row, $last_row, $first_col, $last_col); - + $this->_append($header.$data); } @@ -2748,14 +2748,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x002a; // Record identifier $length = 0x0002; // Bytes to follow - + $fPrintRwCol = $this->_print_headers; // Boolean flag - + $header = pack("vv", $record, $length); $data = pack("v", $fPrintRwCol); $this->_prepend($header.$data); } - + /** * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the * GRIDSET record. @@ -2766,14 +2766,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x002b; // Record identifier $length = 0x0002; // Bytes to follow - + $fPrintGrid = $this->_print_gridlines; // Boolean flag - + $header = pack("vv", $record, $length); $data = pack("v", $fPrintGrid); $this->_prepend($header.$data); } - + /** * Write the GRIDSET BIFF record. Must be used in conjunction with the * PRINTGRIDLINES record. @@ -2784,14 +2784,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0082; // Record identifier $length = 0x0002; // Bytes to follow - + $fGridSet = !($this->_print_gridlines); // Boolean flag - + $header = pack("vv", $record, $length); $data = pack("v", $fGridSet); $this->_prepend($header.$data); } - + /** * Write the GUTS BIFF record. This is used to configure the gutter margins * where Excel outline symbols are displayed. The visibility of the gutters is @@ -2804,13 +2804,13 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x0080; // Record identifier $length = 0x0008; // Bytes to follow - + $dxRwGut = 0x0000; // Size of row gutter $dxColGut = 0x0000; // Size of col gutter - + $row_level = $this->_outline_row_level; $col_level = 0; - + // Calculate the maximum column outline level. The equivalent calculation // for the row outline level is carried out in setRow(). for ($i = 0; $i < count($this->_colinfo); $i++) { @@ -2819,10 +2819,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $col_level = max($this->_colinfo[$i][5], $col_level); } } - + // Set the limits for the outline levels (0 <= x <= 7). $col_level = max(0, min($col_level, 7)); - + // The displayed level is one greater than the max outline levels if ($row_level) { $row_level++; @@ -2830,10 +2830,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($col_level) { $col_level++; } - + $header = pack("vv", $record, $length); $data = pack("vvvv", $dxRwGut, $dxColGut, $row_level, $col_level); - + $this->_prepend($header.$data); } @@ -2849,7 +2849,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $record = 0x0081; // Record identifier $length = 0x0002; // Bytes to follow $grbit = 0x0000; - + // The only option that is of interest is the flag for fit to page. So we // set all the options in one go. // @@ -2892,14 +2892,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (empty($this->_hbreaks)) { return; } - + // Sort and filter array of page breaks $breaks = $this->_hbreaks; sort($breaks, SORT_NUMERIC); if ($breaks[0] == 0) { // don't use first break if it's 0 array_shift($breaks); } - + $record = 0x001b; // Record identifier $cbrk = count($breaks); // Number of page breaks if ($this->_BIFF_version == 0x0600) { @@ -2910,7 +2910,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $header = pack("vv", $record, $length); $data = pack("v", $cbrk); - + // Append each page break foreach($breaks as $break) { if ($this->_BIFF_version == 0x0600) { @@ -2919,11 +2919,11 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $data .= pack("v", $break); } } - + $this->_prepend($header.$data); } - - + + /** * Write the VERTICALPAGEBREAKS BIFF record. * @@ -2935,17 +2935,17 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (empty($this->_vbreaks)) { return; } - + // 1000 vertical pagebreaks appears to be an internal Excel 5 limit. // It is slightly higher in Excel 97/200, approx. 1026 $breaks = array_slice($this->_vbreaks,0,1000); - + // Sort and filter array of page breaks sort($breaks, SORT_NUMERIC); if ($breaks[0] == 0) { // don't use first break if it's 0 array_shift($breaks); } - + $record = 0x001a; // Record identifier $cbrk = count($breaks); // Number of page breaks if ($this->_BIFF_version == 0x0600) { @@ -2953,10 +2953,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr } else { $length = 2 + 2*$cbrk; // Bytes to follow } - + $header = pack("vv", $record, $length); $data = pack("v", $cbrk); - + // Append each page break foreach ($breaks as $break) { if ($this->_BIFF_version == 0x0600) { @@ -2965,10 +2965,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $data .= pack("v", $break); } } - + $this->_prepend($header.$data); } - + /** * Set the Biff PROTECT record to indicate that the worksheet is protected. * @@ -2980,18 +2980,18 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($this->_protect == 0) { return; } - + $record = 0x0012; // Record identifier $length = 0x0002; // Bytes to follow - + $fLock = $this->_protect; // Worksheet is protected - + $header = pack("vv", $record, $length); $data = pack("v", $fLock); - + $this->_prepend($header.$data); } - + /** * Write the worksheet PASSWORD record. * @@ -3003,18 +3003,18 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (($this->_protect == 0) || (!isset($this->_password))) { return; } - + $record = 0x0013; // Record identifier $length = 0x0002; // Bytes to follow - + $wPassword = $this->_password; // Encoded password - + $header = pack("vv", $record, $length); $data = pack("v", $wPassword); - + $this->_prepend($header.$data); } - + /** * Insert a 24bit bitmap image in a worksheet. @@ -3036,25 +3036,25 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr return; } list($width, $height, $size, $data) = $bitmap_array; //$this->_processBitmap($bitmap); - + // Scale the frame of the image. $width *= $scale_x; $height *= $scale_y; - + // Calculate the vertices of the image and write the OBJ record $this->_positionImage($col, $row, $x, $y, $width, $height); - + // Write the IMDATA record to store the bitmap data $record = 0x007f; $length = 8 + $size; $cf = 0x09; $env = 0x01; $lcb = $size; - + $header = pack("vvvvV", $record, $length, $cf, $env, $lcb); $this->_append($header.$data); } - + /** * Calculate the vertices that define the position of the image as required by * the OBJ record. @@ -3111,7 +3111,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr // Initialise end cell to the same as the start cell $col_end = $col_start; // Col containing lower right corner of object $row_end = $row_start; // Row containing bottom right corner of object - + // Zero the specified offset if greater than the cell dimensions if ($x1 >= $this->_sizeCol($col_start)) { $x1 = 0; @@ -3119,22 +3119,22 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($y1 >= $this->_sizeRow($row_start)) { $y1 = 0; } - + $width = $width + $x1 -1; $height = $height + $y1 -1; - + // Subtract the underlying cell widths to find the end cell of the image while ($width >= $this->_sizeCol($col_end)) { $width -= $this->_sizeCol($col_end); $col_end++; } - + // Subtract the underlying cell heights to find the end cell of the image while ($height >= $this->_sizeRow($row_end)) { $height -= $this->_sizeRow($row_end); $row_end++; } - + // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell // with zero eight or width. // @@ -3150,27 +3150,27 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($this->_sizeRow($row_end) == 0) { return; } - + // Convert the pixel values to the percentage value expected by Excel $x1 = $x1 / $this->_sizeCol($col_start) * 1024; $y1 = $y1 / $this->_sizeRow($row_start) * 256; $x2 = $width / $this->_sizeCol($col_end) * 1024; // Distance to right side of object $y2 = $height / $this->_sizeRow($row_end) * 256; // Distance to bottom of object - + $this->_storeObjPicture( $col_start, $x1, $row_start, $y1, $col_end, $x2, $row_end, $y2 ); } - + /** * Convert the width of a cell from user's units to pixels. By interpolation * the relationship is: y = 7x +5. If the width hasn't been set by the user we * use the default value. If the col is hidden we use a value of zero. * * @access private - * @param integer $col The column + * @param integer $col The column * @return integer The width in pixels */ function _sizeCol($col) @@ -3186,7 +3186,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr return(64); } } - + /** * Convert the height of a cell from user's units to pixels. By interpolation * the relationship is: y = 4/3x. If the height hasn't been set by the user we @@ -3210,7 +3210,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr return(17); } } - + /** * Store the OBJ record that precedes an IMDATA record. This could be generalise * to support other Excel objects. @@ -3229,16 +3229,16 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x005d; // Record identifier $length = 0x003c; // Bytes to follow - + $cObj = 0x0001; // Count of objects in file (set to 1) $OT = 0x0008; // Object type. 8 = Picture $id = 0x0001; // Object ID $grbit = 0x0614; // Option flags - + $cbMacro = 0x0000; // Length of FMLA structure $Reserved1 = 0x0000; // Reserved $Reserved2 = 0x0000; // Reserved - + $icvBack = 0x09; // Background colour $icvFore = 0x09; // Foreground colour $fls = 0x00; // Fill pattern @@ -3254,8 +3254,8 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $Reserved4 = 0x0000; // Reserved $grbit2 = 0x0001; // Option flags $Reserved5 = 0x0000; // Reserved - - + + $header = pack("vv", $record, $length); $data = pack("V", $cObj); $data .= pack("v", $OT); @@ -3287,10 +3287,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $data .= pack("v", $Reserved4); $data .= pack("v", $grbit2); $data .= pack("V", $Reserved5); - + $this->_append($header.$data); } - + /** * Convert a 24 bit bitmap into the modified internal format used by Windows. * This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the @@ -3307,24 +3307,24 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if (!$bmp_fd) { $this->raiseError("Couldn't import $bitmap"); } - + // Slurp the file into a string. $data = fread($bmp_fd, filesize($bitmap)); - + // Check that the file is big enough to be a bitmap. if (strlen($data) <= 0x36) { $this->raiseError("$bitmap doesn't contain enough data.\n"); } - + // The first 2 bytes are used to identify the bitmap. $identity = unpack("A2ident", $data); if ($identity['ident'] != "BM") { $this->raiseError("$bitmap doesn't appear to be a valid bitmap image.\n"); } - + // Remove bitmap data: ID. $data = substr($data, 2); - + // Read and remove the bitmap size. This is more reliable than reading // the data size at offset 0x22. // @@ -3333,22 +3333,22 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $data = substr($data, 4); $size -= 0x36; // Subtract size of bitmap header. $size += 0x0C; // Add size of BIFF header. - + // Remove bitmap data: reserved, offset, header length. $data = substr($data, 12); - + // Read and remove the bitmap width and height. Verify the sizes. $width_and_height = unpack("V2", substr($data, 0, 8)); $width = $width_and_height[1]; $height = $width_and_height[2]; $data = substr($data, 8); - if ($width > 0xFFFF) { + if ($width > 0xFFFF) { $this->raiseError("$bitmap: largest image width supported is 65k.\n"); } - if ($height > 0xFFFF) { + if ($height > 0xFFFF) { $this->raiseError("$bitmap: largest image height supported is 65k.\n"); } - + // Read and remove the bitmap planes and bpp data. Verify them. $planes_and_bitcount = unpack("v2", substr($data, 0, 4)); $data = substr($data, 4); @@ -3358,26 +3358,26 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($planes_and_bitcount[1] != 1) { $this->raiseError("$bitmap: only 1 plane supported in bitmap image.\n"); } - + // Read and remove the bitmap compression. Verify compression. $compression = unpack("Vcomp", substr($data, 0, 4)); $data = substr($data, 4); - + //$compression = 0; if ($compression['comp'] != 0) { $this->raiseError("$bitmap: compression not supported in bitmap image.\n"); } - + // Remove bitmap data: data size, hres, vres, colours, imp. colours. $data = substr($data, 20); - + // Add the BITMAPCOREHEADER data $header = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); $data = $header . $data; - + return (array($width, $height, $size, $data)); } - + /** * Store the window zoom factor. This should be a reduced fraction but for * simplicity we will store all fractions with a numerator of 100. @@ -3390,10 +3390,10 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr if ($this->_zoom == 100) { return; } - + $record = 0x00A0; // Record identifier $length = 0x0004; // Bytes to follow - + $header = pack("vv", $record, $length); $data = pack("vv", $this->_zoom, 100); $this->_append($header.$data); @@ -3407,7 +3407,7 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr $this->_dv[] = $validator->_getData() . pack("vvvvv", 1, $row1, $row2, $col1, $col2); } - + /** * Store the DVAL and DV records. * @@ -3417,17 +3417,17 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr { $record = 0x01b2; // Record identifier $length = 0x0012; // Bytes to follow - + $grbit = 0x0002; // Prompt box at cell, no cached validity data at DV records $horPos = 0x00000000; // Horizontal position of prompt box, if fixed position $verPos = 0x00000000; // Vertical position of prompt box, if fixed position $objId = 0xffffffff; // Object identifier of drop down arrow object, or -1 if not visible - + $header = pack('vv', $record, $length); $data = pack('vVVVV', $grbit, $horPos, $verPos, $objId, count($this->_dv)); $this->_append($header.$data); - + $record = 0x01be; // Record identifier foreach($this->_dv as $dv) { $length = strlen($dv); // Bytes to follow