parent
7d2579b36e
commit
003ee63187
@ -1,104 +0,0 @@ |
||||
<?php |
||||
/* |
||||
* Module written/ported by Xavier Noguer <xnoguer@rezebra.com> |
||||
* |
||||
* 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(api_get_path(LIBRARY_PATH).'pear/PEAR.php'); |
||||
require_once 'Writer/Workbook.php'; |
||||
|
||||
/** |
||||
* Class for writing Excel Spreadsheets. This class should change COMPLETELY. |
||||
* |
||||
* @author Xavier Noguer <xnoguer@rezebra.com> |
||||
* @category FileFormats |
||||
* @package Spreadsheet_Excel_Writer |
||||
*/ |
||||
|
||||
class Spreadsheet_Excel_Writer extends Spreadsheet_Excel_Writer_Workbook |
||||
{ |
||||
/** |
||||
* The constructor. It just creates a Workbook |
||||
* |
||||
* @param string $filename The optional filename for the Workbook. |
||||
* @return Spreadsheet_Excel_Writer_Workbook The Workbook created |
||||
*/ |
||||
function Spreadsheet_Excel_Writer($filename = '') |
||||
{ |
||||
$this->_filename = $filename; |
||||
$this->Spreadsheet_Excel_Writer_Workbook($filename); |
||||
} |
||||
|
||||
/** |
||||
* Send HTTP headers for the Excel file. |
||||
* |
||||
* @param string $filename The filename to use for HTTP headers |
||||
* @access public |
||||
*/ |
||||
function send($filename) |
||||
{ |
||||
header("Content-type: application/vnd.ms-excel"); |
||||
header("Content-Disposition: attachment; filename=\"$filename\""); |
||||
header("Expires: 0"); |
||||
header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); |
||||
header("Pragma: public"); |
||||
} |
||||
|
||||
/** |
||||
* Utility function for writing formulas |
||||
* Converts a cell's coordinates to the A1 format. |
||||
* |
||||
* @access public |
||||
* @static |
||||
* @param integer $row Row for the cell to convert (0-indexed). |
||||
* @param integer $col Column for the cell to convert (0-indexed). |
||||
* @return string The cell identifier in A1 format |
||||
*/ |
||||
function rowcolToCell($row, $col) |
||||
{ |
||||
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; |
||||
} |
||||
} |
||||
?> |
||||
@ -1,261 +0,0 @@ |
||||
<?php |
||||
/* |
||||
* Module written/ported by Xavier Noguer <xnoguer@php.net> |
||||
* |
||||
* 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@php.net |
||||
* |
||||
* 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 <xnoguer@php.net> |
||||
* @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; |
||||
|
||||
/** |
||||
* The temporary dir for storing the OLE file |
||||
* @var string |
||||
*/ |
||||
var $_tmp_dir; |
||||
|
||||
/** |
||||
* Constructor |
||||
* |
||||
* @access public |
||||
*/ |
||||
function Spreadsheet_Excel_Writer_BIFFwriter() |
||||
{ |
||||
$this->_byte_order = ''; |
||||
$this->_data = ''; |
||||
$this->_datasize = 0; |
||||
$this->_limit = 2080; |
||||
$this->_tmp_dir = ''; |
||||
// 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. |
||||
$data_length = strlen($data); |
||||
for ($i = $limit; $i < ($data_length - $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; |
||||
} |
||||
|
||||
/** |
||||
* Sets the temp dir used for storing the OLE file |
||||
* |
||||
* @access public |
||||
* @param string $dir The dir to be used as temp dir |
||||
* @return true if given dir is valid, false otherwise |
||||
*/ |
||||
function setTempDir($dir) |
||||
{ |
||||
if (is_dir($dir)) { |
||||
$this->_tmp_dir = $dir; |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
} |
||||
?> |
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,230 +0,0 @@ |
||||
<?php |
||||
/* |
||||
* Module written by Herman Kuiper <herman@ozuzo.net> |
||||
* |
||||
* 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'); |
||||
|
||||
// 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 = ...; |
||||
} |
||||
}*/ |
||||
|
||||
?> |
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,6 +0,0 @@ |
||||
<html> |
||||
<head> |
||||
</head> |
||||
<body> |
||||
</body> |
||||
</html> |
||||
@ -1,6 +0,0 @@ |
||||
<html> |
||||
<head> |
||||
</head> |
||||
<body> |
||||
</body> |
||||
</html> |
||||
Loading…
Reference in new issue