|
From: Benjamin C. <bc...@us...> - 2004-05-02 17:06:07
|
Update of /cvsroot/phpbt/phpbt/inc/pear/Spreadsheet/Excel/Writer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20031/Excel/Writer Added Files: Tag: htmltemplates BIFFwriter.php Format.php Parser.php Validator.php Workbook.php Worksheet.php Log Message: Spreadsheet generator class from PEAR --- NEW FILE: BIFFwriter.php --- <?php /* * Module written/ported by Xavier Noguer <xn...@ph...> * * 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 * <jmc...@cp...> * * 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 xn...@ph... * * 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 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 * 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 * window into a document; another describes a picture format. * * @author Xavier Noguer <xn...@ph...> * @category FileFormats * @package Spreadsheet_Excel_Writer */ class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR { /** * The BIFF/Excel version (5). * @var integer */ var $_BIFF_version = 0x0500; /** * The byte order of this architecture. 0 => little endian, 1 => big endian * @var integer */ var $_byte_order; /** * The string containing the data of the BIFF stream * @var string */ var $_data; /** * The size of the data in bytes. Should be the same as strlen($this->_data) * @var integer */ var $_datasize; /** * The maximun length for a BIFF record. See _addContinue() * @var integer * @see _addContinue() */ var $_limit; /** * Constructor * * @access public */ function Spreadsheet_Excel_Writer_BIFFwriter() { $this->_byte_order = ''; $this->_data = ''; $this->_datasize = 0; $this->_limit = 2080; // Set the byte order $this->_setByteOrder(); } /** * Determine the byte order and store it as class data to avoid * recalculating it for each call to new(). * * @access private */ function _setByteOrder() { // Check if "pack" gives the required IEEE 64bit float $teststr = pack("d", 1.2345); $number = pack("C8", 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F); if ($number == $teststr) { $byte_order = 0; // Little Endian } elseif ($number == strrev($teststr)){ $byte_order = 1; // Big Endian } else { // Give up. I'll fix this in a later version. return $this->raiseError("Required floating point format ". "not supported on this platform."); } $this->_byte_order = $byte_order; } /** * General storage function * * @param string $data binary data to prepend * @access private */ function _prepend($data) { if (strlen($data) > $this->_limit) { $data = $this->_addContinue($data); } $this->_data = $data.$this->_data; $this->_datasize += strlen($data); } /** * General storage function * * @param string $data binary data to append * @access private */ function _append($data) { if (strlen($data) > $this->_limit) { $data = $this->_addContinue($data); } $this->_data = $this->_data.$data; $this->_datasize += strlen($data); } /** * Writes Excel BOF record to indicate the beginning of a stream or * sub-stream in the BIFF file. * * @param integer $type Type of BIFF file to write: 0x0005 Workbook, * 0x0010 Worksheet. * @access private */ function _storeBof($type) { $record = 0x0809; // Record identifier // According to the SDK $build and $year should be set to zero. // However, this throws a warning in Excel 5. So, use magic numbers. if ($this->_BIFF_version == 0x0500) { $length = 0x0008; $unknown = ''; $build = 0x096C; $year = 0x07C9; } elseif ($this->_BIFF_version == 0x0600) { $length = 0x0010; $unknown = pack("VV", 0x00000041, 0x00000006); //unknown last 8 bytes for BIFF8 $build = 0x0DBB; $year = 0x07CC; } $version = $this->_BIFF_version; $header = pack("vv", $record, $length); $data = pack("vvvv", $version, $type, $build, $year); $this->_prepend($header.$data.$unknown); } /** * Writes Excel EOF record to indicate the end of a BIFF stream. * * @access private */ function _storeEof() { $record = 0x000A; // Record identifier $length = 0x0000; // Number of bytes to follow $header = pack("vv", $record, $length); $this->_append($header); } /** * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In * Excel 97 the limit is 8228 bytes. Records that are longer than these limits * must be split up into CONTINUE blocks. * * This function takes a long BIFF record and inserts CONTINUE records as * necessary. * * @param string $data The original binary data to be written * @return string A very convenient string of continue blocks * @access private */ function _addContinue($data) { $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; } } ?> --- NEW FILE: Format.php --- <?php /* * Module written/ported by Xavier Noguer <xn...@re...> * * 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 * <jmc...@cp...> * * 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 xn...@re... * [...996 lines suppressed...] * @access public */ function setUnLocked() { $this->_locked = 0; } /** * Sets the font family name. * * @access public * @param string $fontfamily The font family name. Possible values are: * 'Times New Roman', 'Arial', 'Courier'. */ function setFontFamily($font_family) { $this->_font_name = $font_family; } } ?> --- NEW FILE: Parser.php --- <?php /** * Class for parsing Excel formulas * * License Information: * * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets * Copyright (c) 2002-2003 Xavier Noguer xn...@re... * * 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. * [...1721 lines suppressed...] $left_tree = ''; } if (PEAR::isError($left_tree)) { return $left_tree; } // add it's left subtree and return. return $left_tree.$this->_convertFunction($tree['value'], $tree['right']); } else { $converted_tree = $this->_convert($tree['value']); if (PEAR::isError($converted_tree)) { return $converted_tree; } } $polish .= $converted_tree; return $polish; } } ?> --- NEW FILE: Validator.php --- <?php /* * Module written by Herman Kuiper <he...@oz...> * * License Information: * * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets * Copyright (c) 2002-2003 Xavier Noguer xn...@re... * * 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'); // Possible operator types /* FIXME: change prefixes */ define("OP_BETWEEN", 0x00); define("OP_NOTBETWEEN", 0x01); define("OP_EQUAL", 0x02); define("OP_NOTEQUAL", 0x03); define("OP_GT", 0x04); define("OP_LT", 0x05); define("OP_GTE", 0x06); define("OP_LTE", 0x07); /** * Baseclass for generating Excel DV records (validations) * * @author Herman Kuiper * @category FileFormats * @package Spreadsheet_Excel_Writer */ class Spreadsheet_Excel_Writer_Validator { var $_type; var $_style; var $_fixedList; var $_blank; var $_incell; var $_showprompt; var $_showerror; var $_title_prompt; var $_descr_prompt; var $_title_error; var $_descr_error; var $_operator; var $_formula1; var $_formula2; /** * The parser from the workbook. Used to parse validation formulas also * @var Spreadsheet_Excel_Writer_Parser */ var $_parser; function Spreadsheet_Excel_Writer_Validator(&$parser) { $this->_parser = $parser; $this->_type = 0x01; // FIXME: add method for setting datatype $this->_style = 0x00; $this->_fixedList = false; $this->_blank = false; $this->_incell = false; $this->_showprompt = false; $this->_showerror = true; $this->_title_prompt = "\x00"; $this->_descr_prompt = "\x00"; $this->_title_error = "\x00"; $this->_descr_error = "\x00"; $this->_operator = 0x00; // default is equal $this->_formula1 = ""; $this->_formula2 = ""; } function setPrompt($promptTitle = "\x00", $promptDescription = "\x00", $showPrompt = true) { $this->_showprompt = $showPrompt; $this->_title_prompt = $promptTitle; $this->_descr_prompt = $promptDescription; } function setError($errorTitle = "\x00", $errorDescription = "\x00", $showError = true) { $this->_showerror = $showError; $this->_title_error = $errorTitle; $this->_descr_error = $errorDescription; } function allowBlank() { $this->_blank = true; } function onInvalidStop() { $this->_style = 0x00; } function onInvalidWarn() { $this->_style = 0x01; } function onInvalidInfo() { $this->_style = 0x02; } function setFormula1($formula) { // Parse the formula using the parser in Parser.php $error = $this->_parser->parse($formula); if (PEAR::isError($error)) { return $this->_formula1; } $this->_formula1 = $this->_parser->toReversePolish(); if (PEAR::isError($this->_formula1)) { return $this->_formula1; } return true; } function setFormula2($formula) { // Parse the formula using the parser in Parser.php $error = $this->_parser->parse($formula); if (PEAR::isError($error)) { return $this->_formula2; } $this->_formula2 = $this->_parser->toReversePolish(); if (PEAR::isError($this->_formula2)) { return $this->_formula2; } return true; } function _getOptions() { $options = $this->_type; $options |= $this->_style << 3; if($this->_fixedList) $options |= 0x80; if($this->_blank) $options |= 0x100; if(!$this->_incell) $options |= 0x200; if($this->_showprompt) $options |= 0x40000; if($this->_showerror) $options |= 0x80000; $options |= $this->_operator << 20; return $options; } function _getData() { $title_prompt_len = strlen($this->_title_prompt); $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); $data = pack("V", $this->_getOptions()); $data .= pack("vC", $title_prompt_len, 0x00) . $this->_title_prompt; $data .= pack("vC", $title_error_len, 0x00) . $this->_title_error; $data .= pack("vC", $descr_prompt_len, 0x00) . $this->_descr_prompt; $data .= pack("vC", $descr_error_len, 0x00) . $this->_descr_error; $data .= pack("vv", $formula1_size, 0x0000) . $this->_formula1; $data .= pack("vv", $formula2_size, 0x0000) . $this->_formula2; return $data; } } /*class Spreadsheet_Excel_Writer_Validation_List extends Spreadsheet_Excel_Writer_Validation { function Spreadsheet_Excel_Writer_Validation_list() { parent::Spreadsheet_Excel_Writer_Validation(); $this->_type = 0x03; } function setList($source, $incell = true) { $this->_incell = $incell; $this->_fixedList = true; $source = implode("\x00", $source); $this->_formula1 = pack("CCC", 0x17, strlen($source), 0x0c) . $source; } function setRow($row, $col1, $col2, $incell = true) { $this->_incell = $incell; //$this->_formula1 = ...; } function setCol($col, $row1, $row2, $incell = true) { $this->_incell = $incell; //$this->_formula1 = ...; } }*/ ?> --- NEW FILE: Workbook.php --- <?php /* * Module written/ported by Xavier Noguer <xn...@re...> * * 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 * <jmc...@cp...> * * 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 xn...@re... * [...1502 lines suppressed...] $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 // if ($block_length < $continue_limit) { $this->_append($string); $written = $block_length; } else { $written = 0; } } } } } ?> --- NEW FILE: Worksheet.php --- <?php /* * Module written/ported by Xavier Noguer <xn...@re...> * * 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 * <jmc...@cp...> * * 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 xn...@re... * [...3450 lines suppressed...] $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 $header = pack("vv", $record, $length); $this->_append($header.$dv); } } } ?> |