New file |
0,0 → 1,940 |
<?php |
/* |
* Module written/ported by Xavier Noguer <xnoguer@rezebra.com> |
* |
* 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 |
* <jmcnamara@cpan.org> |
* |
* I _DO_ maintain this code, and John McNamara has nothing to do with the |
* porting of this code to PHP. Any questions directly related to this |
* class library should be directed to me. |
* |
* License Information: |
* |
* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets |
* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com |
* |
* This library is free software; you can redistribute it and/or |
* modify it under the terms of the GNU Lesser General Public |
* License as published by the Free Software Foundation; either |
* version 2.1 of the License, or (at your option) any later version. |
* |
* This library is distributed in the hope that it will be useful, |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
* Lesser General Public License for more details. |
* |
* You should have received a copy of the GNU Lesser General Public |
* License along with this library; if not, write to the Free Software |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
*/ |
|
require_once('PEAR.php'); |
|
/** |
* Class for generating Excel XF records (formats) |
* |
* @author Xavier Noguer <xnoguer@rezebra.com> |
* @category FileFormats |
* @package Spreadsheet_Excel_Writer |
*/ |
|
class Spreadsheet_Excel_Writer_Format extends PEAR |
{ |
/** |
* The index given by the workbook when creating a new format. |
* @var integer |
*/ |
var $_xf_index; |
|
/** |
* Index to the FONT record. |
* @var integer |
*/ |
var $font_index; |
|
/** |
* The font name (ASCII). |
* @var string |
*/ |
var $_font_name; |
|
/** |
* Height of font (1/20 of a point) |
* @var integer |
*/ |
var $_size; |
|
/** |
* Bold style |
* @var integer |
*/ |
var $_bold; |
|
/** |
* Bit specifiying if the font is italic. |
* @var integer |
*/ |
var $_italic; |
|
/** |
* Index to the cell's color |
* @var integer |
*/ |
var $_color; |
|
/** |
* The text underline property |
* @var integer |
*/ |
var $_underline; |
|
/** |
* Bit specifiying if the font has strikeout. |
* @var integer |
*/ |
var $_font_strikeout; |
|
/** |
* Bit specifiying if the font has outline. |
* @var integer |
*/ |
var $_font_outline; |
|
/** |
* Bit specifiying if the font has shadow. |
* @var integer |
*/ |
var $_font_shadow; |
|
/** |
* 2 bytes specifiying the script type for the font. |
* @var integer |
*/ |
var $_font_script; |
|
/** |
* Byte specifiying the font family. |
* @var integer |
*/ |
var $_font_family; |
|
/** |
* Byte specifiying the font charset. |
* @var integer |
*/ |
var $_font_charset; |
|
/** |
* An index (2 bytes) to a FORMAT record (number format). |
* @var integer |
*/ |
var $_num_format; |
|
/** |
* Bit specifying if formulas are hidden. |
* @var integer |
*/ |
var $_hidden; |
|
/** |
* Bit specifying if the cell is locked. |
* @var integer |
*/ |
var $_locked; |
|
/** |
* The three bits specifying the text horizontal alignment. |
* @var integer |
*/ |
var $_text_h_align; |
|
/** |
* Bit specifying if the text is wrapped at the right border. |
* @var integer |
*/ |
var $_text_wrap; |
|
/** |
* The three bits specifying the text vertical alignment. |
* @var integer |
*/ |
var $_text_v_align; |
|
/** |
* 1 bit, apparently not used. |
* @var integer |
*/ |
var $_text_justlast; |
|
/** |
* The two bits specifying the text rotation. |
* @var integer |
*/ |
var $_rotation; |
|
/** |
* The cell's foreground color. |
* @var integer |
*/ |
var $_fg_color; |
|
/** |
* The cell's background color. |
* @var integer |
*/ |
var $_bg_color; |
|
/** |
* The cell's background fill pattern. |
* @var integer |
*/ |
var $_pattern; |
|
/** |
* Style of the bottom border of the cell |
* @var integer |
*/ |
var $_bottom; |
|
/** |
* Color of the bottom border of the cell. |
* @var integer |
*/ |
var $_bottom_color; |
|
/** |
* Style of the top border of the cell |
* @var integer |
*/ |
var $_top; |
|
/** |
* Color of the top border of the cell. |
* @var integer |
*/ |
var $_top_color; |
|
/** |
* Style of the left border of the cell |
* @var integer |
*/ |
var $_left; |
|
/** |
* Color of the left border of the cell. |
* @var integer |
*/ |
var $_left_color; |
|
/** |
* Style of the right border of the cell |
* @var integer |
*/ |
var $_right; |
|
/** |
* Color of the right border of the cell. |
* @var integer |
*/ |
var $_right_color; |
|
/** |
* Constructor |
* |
* @access public |
* @param integer $index the XF index for the format. |
* @param array $properties array with properties to be set on initialization. |
*/ |
function Spreadsheet_Excel_Writer_Format($index = 0,$properties = array()) |
{ |
$this->_xf_index = $index; |
|
$this->font_index = 0; |
$this->_font_name = 'Arial'; |
$this->_size = 10; |
$this->_bold = 0x0190; |
$this->_italic = 0; |
$this->_color = 0x7FFF; |
$this->_underline = 0; |
$this->_font_strikeout = 0; |
$this->_font_outline = 0; |
$this->_font_shadow = 0; |
$this->_font_script = 0; |
$this->_font_family = 0; |
$this->_font_charset = 0; |
|
$this->_num_format = 0; |
|
$this->_hidden = 0; |
$this->_locked = 1; |
|
$this->_text_h_align = 0; |
$this->_text_wrap = 0; |
$this->_text_v_align = 2; |
$this->_text_justlast = 0; |
$this->_rotation = 0; |
|
$this->_fg_color = 0x40; |
$this->_bg_color = 0x41; |
|
$this->_pattern = 0; |
|
$this->_bottom = 0; |
$this->_top = 0; |
$this->_left = 0; |
$this->_right = 0; |
|
$this->_bottom_color = 0x40; |
$this->_top_color = 0x40; |
$this->_left_color = 0x40; |
$this->_right_color = 0x40; |
|
// Set properties passed to Spreadsheet_Excel_Writer_Workbook::addFormat() |
foreach($properties as $property => $value) |
{ |
if(method_exists($this,'set'.ucwords($property))) |
{ |
$method_name = 'set'.ucwords($property); |
$this->$method_name($value); |
} |
} |
} |
|
|
/** |
* Generate an Excel BIFF XF record (style or cell). |
* |
* @param string $style The type of the XF record ('style' or 'cell'). |
* @return string The XF record |
*/ |
function getXf($style) |
{ |
// Set the type of the XF record and some of the attributes. |
if ($style == "style") { |
$style = 0xFFF5; |
} |
else { |
$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; |
$atr_alc = ($this->_text_wrap)?1:0; |
$atr_bdr = ($this->_bottom || |
$this->_top || |
$this->_left || |
$this->_right)?1:0; |
$atr_pat = (($this->_fg_color != 0x40) || |
($this->_bg_color != 0x41) || |
$this->_pattern)?1:0; |
$atr_prot = 0; |
|
// Zero the default border colour if the border has not been set. |
if ($this->_bottom == 0) { |
$this->_bottom_color = 0; |
} |
if ($this->_top == 0) { |
$this->_top_color = 0; |
} |
if ($this->_right == 0) { |
$this->_right_color = 0; |
} |
if ($this->_left == 0) { |
$this->_left_color = 0; |
} |
|
$record = 0x00E0; // Record identifier |
$length = 0x0010; // Number of bytes to follow |
|
$ifnt = $this->font_index; // Index to FONT record |
$ifmt = $this->_num_format; // Index to FORMAT record |
|
$align = $this->_text_h_align; // Alignment |
$align |= $this->_text_wrap << 3; |
$align |= $this->_text_v_align << 4; |
$align |= $this->_text_justlast << 7; |
$align |= $this->_rotation << 8; |
$align |= $atr_num << 10; |
$align |= $atr_fnt << 11; |
$align |= $atr_alc << 12; |
$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, |
$border1, $border2); |
return($header.$data); |
} |
|
/** |
* Generate an Excel BIFF FONT record. |
* |
* @return string The FONT record |
*/ |
function getFont() |
{ |
$dyHeight = $this->_size * 20; // Height of font (1/20 of a point) |
$icv = $this->_color; // Index to color palette |
$bls = $this->_bold; // Bold style |
$sss = $this->_font_script; // Superscript/subscript |
$uls = $this->_underline; // Underline |
$bFamily = $this->_font_family; // Font family |
$bCharSet = $this->_font_charset; // Character set |
$rgch = $this->_font_name; // Font name |
|
$cch = strlen($rgch); // Length of font name |
$record = 0x31; // Record identifier |
$length = 0x0F + $cch; // Record length |
$reserved = 0x00; // Reserved |
$grbit = 0x00; // Font attributes |
if ($this->_italic) { |
$grbit |= 0x02; |
} |
if ($this->_font_strikeout) { |
$grbit |= 0x08; |
} |
if ($this->_font_outline) { |
$grbit |= 0x10; |
} |
if ($this->_font_shadow) { |
$grbit |= 0x20; |
} |
|
$header = pack("vv", $record, $length); |
$data = pack("vvvvvCCCCC", $dyHeight, $grbit, $icv, $bls, |
$sss, $uls, $bFamily, |
$bCharSet, $reserved, $cch); |
return($header . $data. $this->_font_name); |
} |
|
/** |
* 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 |
* generating a unique key. Elements that hold a large range of numbers |
* (eg. _color) are placed between two binary elements such as _italic |
* |
* @return string A key for this font |
*/ |
function getFontKey() |
{ |
$key = "$this->_font_name$this->_size"; |
$key .= "$this->_font_script$this->_underline"; |
$key .= "$this->_font_strikeout$this->_bold$this->_font_outline"; |
$key .= "$this->_font_family$this->_font_charset"; |
$key .= "$this->_font_shadow$this->_color$this->_italic"; |
$key = str_replace(" ","_",$key); |
return ($key); |
} |
|
/** |
* Returns the index used by Spreadsheet_Excel_Writer_Worksheet::_XF() |
* |
* @return integer The index for the XF record |
*/ |
function getXfIndex() |
{ |
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 |
* to 8..63 to comply with Gnumeric. Colors 0..7 are repeated in 8..15. |
* |
* @access private |
* @param string $name_color name of the color (i.e.: 'blue', 'red', etc..). Optional. |
* @return integer The color index |
*/ |
function _getColor($name_color = '') |
{ |
$colors = array( |
'aqua' => 0x0F, |
'cyan' => 0x0F, |
'black' => 0x08, |
'blue' => 0x0C, |
'brown' => 0x10, |
'magenta' => 0x0E, |
'fuchsia' => 0x0E, |
'gray' => 0x17, |
'grey' => 0x17, |
'green' => 0x11, |
'lime' => 0x0B, |
'navy' => 0x12, |
'orange' => 0x35, |
'purple' => 0x14, |
'red' => 0x0A, |
'silver' => 0x16, |
'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. |
* |
* @access public |
* @param string $location alignment for the cell ('left', 'right', etc...). |
*/ |
function setAlign($location) |
{ |
if (preg_match("/\d/",$location)) { |
return; // Ignore numbers |
} |
|
$location = strtolower($location); |
|
if ($location == 'left') { |
$this->_text_h_align = 1; |
} |
if ($location == 'centre') { |
$this->_text_h_align = 2; |
} |
if ($location == 'center') { |
$this->_text_h_align = 2; |
} |
if ($location == 'right') { |
$this->_text_h_align = 3; |
} |
if ($location == 'fill') { |
$this->_text_h_align = 4; |
} |
if ($location == 'justify') { |
$this->_text_h_align = 5; |
} |
if ($location == 'merge') { |
$this->_text_h_align = 6; |
} |
if ($location == 'equal_space') { // For T.K. |
$this->_text_h_align = 7; |
} |
if ($location == 'top') { |
$this->_text_v_align = 0; |
} |
if ($location == 'vcentre') { |
$this->_text_v_align = 1; |
} |
if ($location == 'vcenter') { |
$this->_text_v_align = 1; |
} |
if ($location == 'bottom') { |
$this->_text_v_align = 2; |
} |
if ($location == 'vjustify') { |
$this->_text_v_align = 3; |
} |
if ($location == 'vequal_space') { // For T.K. |
$this->_text_v_align = 4; |
} |
} |
|
/** |
* This is an alias for the unintuitive setAlign('merge') |
* |
* @access public |
*/ |
function setMerge() |
{ |
$this->setAlign('merge'); |
} |
|
/** |
* Sets the boldness of the text. |
* Bold has a range 100..1000. |
* 0 (400) is normal. 1 (700) is bold. |
* |
* @access public |
* @param integer $weight Weight for the text, 0 maps to 400 (normal text), |
1 maps to 700 (bold text). Valid range is: 100-1000. |
It's Optional, default is 1 (bold). |
*/ |
function setBold($weight = 1) |
{ |
if($weight == 1) { |
$weight = 0x2BC; // Bold text |
} |
if($weight == 0) { |
$weight = 0x190; // Normal text |
} |
if($weight < 0x064) { |
$weight = 0x190; // Lower bound |
} |
if($weight > 0x3E8) { |
$weight = 0x190; // Upper bound |
} |
$this->_bold = $weight; |
} |
|
|
/************************************ |
* FUNCTIONS FOR SETTING CELLS BORDERS |
*/ |
|
/** |
* Sets the width for the bottom border of the cell |
* |
* @access public |
* @param integer $style style of the cell border. 1 => thin, 2 => thick. |
*/ |
function setBottom($style) |
{ |
$this->_bottom = $style; |
} |
|
/** |
* Sets the width for the top border of the cell |
* |
* @access public |
* @param integer $style style of the cell top border. 1 => thin, 2 => thick. |
*/ |
function setTop($style) |
{ |
$this->_top = $style; |
} |
|
/** |
* Sets the width for the left border of the cell |
* |
* @access public |
* @param integer $style style of the cell left border. 1 => thin, 2 => thick. |
*/ |
function setLeft($style) |
{ |
$this->_left = $style; |
} |
|
/** |
* Sets the width for the right border of the cell |
* |
* @access public |
* @param integer $style style of the cell right border. 1 => thin, 2 => thick. |
*/ |
function setRight($style) |
{ |
$this->_right = $style; |
} |
|
|
/** |
* Set cells borders to the same style |
* |
* @access public |
* @param integer $style style to apply for all cell borders. 1 => thin, 2 => thick. |
*/ |
function setBorder($style) |
{ |
$this->setBottom($style); |
$this->setTop($style); |
$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'), |
* or an integer (range is [8...63]). |
*/ |
function setBorderColor($color) |
{ |
$this->setBottomColor($color); |
$this->setTopColor($color); |
$this->setLeftColor($color); |
$this->setRightColor($color); |
} |
|
/** |
* Sets the cell's bottom border color |
* |
* @access public |
* @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). |
*/ |
function setBottomColor($color) |
{ |
$value = $this->_getColor($color); |
$this->_bottom_color = $value; |
} |
|
/** |
* Sets the cell's top border color |
* |
* @access public |
* @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). |
*/ |
function setTopColor($color) |
{ |
$value = $this->_getColor($color); |
$this->_top_color = $value; |
} |
|
/** |
* Sets the cell's left border color |
* |
* @access public |
* @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). |
*/ |
function setLeftColor($color) |
{ |
$value = $this->_getColor($color); |
$this->_left_color = $value; |
} |
|
/** |
* Sets the cell's right border color |
* |
* @access public |
* @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). |
*/ |
function setRightColor($color) |
{ |
$value = $this->_getColor($color); |
$this->_right_color = $value; |
} |
|
|
/** |
* Sets the cell's foreground color |
* |
* @access public |
* @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). |
*/ |
function setFgColor($color) |
{ |
$value = $this->_getColor($color); |
$this->_fg_color = $value; |
} |
|
/** |
* Sets the cell's background color |
* |
* @access public |
* @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). |
*/ |
function setBgColor($color) |
{ |
$value = $this->_getColor($color); |
$this->_bg_color = $value; |
} |
|
/** |
* Sets the cell's color |
* |
* @access public |
* @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). |
*/ |
function setColor($color) |
{ |
$value = $this->_getColor($color); |
$this->_color = $value; |
} |
|
/** |
* Sets the fill pattern attribute of a cell |
* |
* @access public |
* @param integer $arg Optional. Defaults to 1. Meaningful values are: 0-18, |
* 0 meaning no background. |
*/ |
function setPattern($arg = 1) |
{ |
$this->_pattern = $arg; |
} |
|
/** |
* Sets the underline of the text |
* |
* @access public |
* @param integer $underline The value for underline. Possible values are: |
* 1 => underline, 2 => double underline. |
*/ |
function setUnderline($underline) |
{ |
$this->_underline = $underline; |
} |
|
/** |
* Sets the font style as italic |
* |
* @access public |
*/ |
function setItalic() |
{ |
$this->_italic = 1; |
} |
|
/** |
* Sets the font size |
* |
* @access public |
* @param integer $size The font size (in pixels I think). |
*/ |
function setSize($size) |
{ |
$this->_size = $size; |
} |
|
/** |
* Sets text wrapping |
* |
* @access public |
*/ |
function setTextWrap() |
{ |
$this->_text_wrap = 1; |
} |
|
/** |
* Sets the orientation of the text |
* |
* @access public |
* @param integer $angle The rotation angle for the text (clockwise). Possible |
values are: 0, 90, 270 and -1 for stacking top-to-bottom. |
*/ |
function setTextRotation($angle) |
{ |
switch ($angle) |
{ |
case 0: |
$this->_rotation = 0; |
break; |
case 90: |
$this->_rotation = 3; |
break; |
case 270: |
$this->_rotation = 2; |
break; |
case -1: |
$this->_rotation = 1; |
break; |
default : |
$this->raiseError("Invalid value for angle.". |
" Possible values are: 0, 90, 270 and -1 ". |
"for stacking top-to-bottom."); |
$this->_rotation = 0; |
break; |
} |
} |
|
/** |
* Sets the numeric format. |
* It can be date, time, currency, etc... |
* |
* @access public |
* @param integer $num_format The numeric format. |
*/ |
function setNumFormat($num_format) |
{ |
$this->_num_format = $num_format; |
} |
|
/** |
* Sets font as strikeout. |
* |
* @access public |
*/ |
function setStrikeOut() |
{ |
$this->_font_strikeout = 1; |
} |
|
/** |
* Sets outlining for a font. |
* |
* @access public |
*/ |
function setOutLine() |
{ |
$this->_font_outline = 1; |
} |
|
/** |
* Sets font as shadow. |
* |
* @access public |
*/ |
function setShadow() |
{ |
$this->_font_shadow = 1; |
} |
|
/** |
* Sets the script type of the text |
* |
* @access public |
* @param integer $script The value for script type. Possible values are: |
* 1 => superscript, 2 => subscript. |
*/ |
function setScript($script) |
{ |
$this->_font_script = $script; |
} |
|
/** |
* Unlocks a cell. Useful for unprotecting particular cells of a protected sheet. |
* |
* @access public |
*/ |
function setUnLocked() |
{ |
$this->_locked = 0; |
} |
} |
?> |