>  기사  >  백엔드 개발  >  PHP를 통해 Excel 문서 내용을 얻는 코드 예제

PHP를 통해 Excel 문서 내용을 얻는 코드 예제

高洛峰
高洛峰원래의
2017-03-25 11:53:061995검색

1. readexcel.system.php

<?php 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ 
/** 
* A class for reading Microsoft Excel Spreadsheets. 
* 
* Originally developed by Vadim Tkachenko under the name PHPExcelReader. 
* (http://sourceforge.net/projects/phpexcelreader) 
* Based on the Java version by Andy Khan (http://www.3ppt.com). Now 
* maintained by David Sanders. Reads only Biff 7 and Biff 8 formats. 
* 
* PHP versions 4 and 5 
* 
* LICENSE: This source file is subject to version 3.0 of the PHP license 
* that is available through the world-wide-web at the following URI: 
* http://www.php.cn/license/3_0.txt. If you did not receive a copy of 
* the PHP License and are unable to obtain it through the web, please 
* send a note to license@php.cn so we can mail you a copy immediately. 
* 
* @category Spreadsheet 
* @package Spreadsheet_Excel_Reader 
* @author Vadim Tkachenko <vt@apachephp.com> 
* @license http://www.php.cn/license/3_0.txt PHP License 3.0 
* @version CVS: $Id: reader.php 19 2007-03-13 12:42:41Z shangxiao $ 
* @link http://pear.php.cn/package/Spreadsheet_Excel_Reader 
* @see OLE, Spreadsheet_Excel_Writer 
*/ 
//require_once &#39;PEAR.php&#39;; 
//require_once &#39;oleread.php&#39;; 
//oleread.php的内容start======================================================================================================= 
define(&#39;NUM_BIG_BLOCK_DEPOT_BLOCKS_POS&#39;, 0x2c); 
define(&#39;SMALL_BLOCK_DEPOT_BLOCK_POS&#39;, 0x3c); 
define(&#39;ROOT_START_BLOCK_POS&#39;, 0x30); 
define(&#39;BIG_BLOCK_SIZE&#39;, 0x200); 
define(&#39;SMALL_BLOCK_SIZE&#39;, 0x40); 
define(&#39;EXTENSION_BLOCK_POS&#39;, 0x44); 
define(&#39;NUM_EXTENSION_BLOCK_POS&#39;, 0x48); 
define(&#39;PROPERTY_STORAGE_BLOCK_SIZE&#39;, 0x80); 
define(&#39;BIG_BLOCK_DEPOT_BLOCKS_POS&#39;, 0x4c); 
define(&#39;SMALL_BLOCK_THRESHOLD&#39;, 0x1000); 
// property storage offsets 
define(&#39;SIZE_OF_NAME_POS&#39;, 0x40); 
define(&#39;TYPE_POS&#39;, 0x42); 
define(&#39;START_BLOCK_POS&#39;, 0x74); 
define(&#39;SIZE_POS&#39;, 0x78); 
define(&#39;IDENTIFIER_OLE&#39;, pack("CCCCCCCC",0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1)); 
//echo &#39;ROOT_START_BLOCK_POS = &#39;.ROOT_START_BLOCK_POS."n"; 
//echo bin2hex($data[ROOT_START_BLOCK_POS])."n"; 
//echo "a="; 
//echo $data[ROOT_START_BLOCK_POS]; 
//function log 
function GetInt4d($data, $pos) 
{ 
$value
 = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | 
(ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24); 
if ($value>=4294967294) 
{ 
$value=-2; 
} 
return $value; 
} 
class OLERead { 
var $data = &#39;&#39;; 
function OLERead(){ 
} 
function read($sFileName){ 
// check if file exist and is readable (Darko Miljanovic) 
if(!is_readable($sFileName)) { 
$this->error = 1; 
return false; 
} 
$this->data = @file_get_contents($sFileName); 
if (!$this->data) { 
$this->error = 1; 
return false; 
} 
//echo IDENTIFIER_OLE; 
//echo &#39;start&#39;; 
if (substr($this->data, 0, 8) != IDENTIFIER_OLE) { 
$this->error = 1; 
return false; 
} 
$this->numBigBlockDepotBlocks = GetInt4d($this->data, NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); 
$this->sbdStartBlock = GetInt4d($this->data, SMALL_BLOCK_DEPOT_BLOCK_POS); 
$this->rootStartBlock = GetInt4d($this->data, ROOT_START_BLOCK_POS); 
$this->extensionBlock = GetInt4d($this->data, EXTENSION_BLOCK_POS); 
$this->numExtensionBlocks = GetInt4d($this->data, NUM_EXTENSION_BLOCK_POS); 
/* 
echo $this->numBigBlockDepotBlocks." "; 
echo $this->sbdStartBlock." "; 
echo $this->rootStartBlock." "; 
echo $this->extensionBlock." "; 
echo $this->numExtensionBlocks." "; 
*/ 
//echo "sbdStartBlock = $this->sbdStartBlockn"; 
$bigBlockDepotBlocks = array(); 
$pos = BIG_BLOCK_DEPOT_BLOCKS_POS; 
// echo "pos = $pos"; 
$bbdBlocks = $this->numBigBlockDepotBlocks; 
if ($this->numExtensionBlocks != 0) { 
$bbdBlocks = (BIG_BLOCK_SIZE - BIG_BLOCK_DEPOT_BLOCKS_POS)/4; 
} 
for ($i = 0; $i < $bbdBlocks; $i++) { 
$bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos); 
$pos += 4; 
} 
for ($j = 0; $j < $this->numExtensionBlocks; $j++) { 
$pos = ($this->extensionBlock + 1) * BIG_BLOCK_SIZE; 
$blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, BIG_BLOCK_SIZE / 4 - 1); 
for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; $i++) { 
$bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos); 
$pos += 4; 
} 
$bbdBlocks += $blocksToRead; 
if ($bbdBlocks < $this->numBigBlockDepotBlocks) { 
$this->extensionBlock = GetInt4d($this->data, $pos); 
} 
} 
// var_dump($bigBlockDepotBlocks); 
// readBigBlockDepot 
$pos = 0; 
$index = 0; 
$this->bigBlockChain = array(); 
for ($i = 0; $i < $this->numBigBlockDepotBlocks; $i++) { 
$pos = ($bigBlockDepotBlocks[$i] + 1) * BIG_BLOCK_SIZE; 
//echo "pos = $pos"; 
for ($j = 0 ; $j < BIG_BLOCK_SIZE / 4; $j++) { 
$this->bigBlockChain[$index] = GetInt4d($this->data, $pos); 
$pos += 4 ; 
$index++; 
} 
} 
//var_dump($this->bigBlockChain); 
//echo &#39;=====2&#39;; 
// readSmallBlockDepot(); 
$pos = 0; 
$index = 0; 
$sbdBlock = $this->sbdStartBlock; 
$this->smallBlockChain = array(); 
while ($sbdBlock != -2) { 
$pos = ($sbdBlock + 1) * BIG_BLOCK_SIZE; 
for ($j = 0; $j < BIG_BLOCK_SIZE / 4; $j++) { 
$this->smallBlockChain[$index] = GetInt4d($this->data, $pos); 
$pos += 4; 
$index++; 
} 
$sbdBlock = $this->bigBlockChain[$sbdBlock]; 
} 
// readData(rootStartBlock) 
$block = $this->rootStartBlock; 
$pos = 0; 
$this->entry = $this->__readData($block); 
/* 
while ($block != -2) { 
$pos = ($block + 1) * BIG_BLOCK_SIZE; 
$this->entry = $this->entry.substr($this->data, $pos, BIG_BLOCK_SIZE); 
$block = $this->bigBlockChain[$block]; 
} 
*/ 
//echo &#39;===&#39;.$this->entry."==="; 
$this->__readPropertySets(); 
} 
function __readData($bl) { 
$block = $bl; 
$pos = 0; 
$data = &#39;&#39;; 
while ($block != -2) { 
$pos = ($block + 1) * BIG_BLOCK_SIZE; 
$data = $data.substr($this->data, $pos, BIG_BLOCK_SIZE); 
//echo "pos = $pos data=$datan"; 
$block = $this->bigBlockChain[$block]; 
} 
return $data; 
} 
function __readPropertySets(){ 
$offset = 0; 
//var_dump($this->entry); 
while ($offset < strlen($this->entry)) { 
$d = substr($this->entry, $offset, PROPERTY_STORAGE_BLOCK_SIZE); 
$nameSize = ord($d[SIZE_OF_NAME_POS]) | (ord($d[SIZE_OF_NAME_POS+1]) << 8); 
$type = ord($d[TYPE_POS]); 
//$maxBlock = strlen($d) / BIG_BLOCK_SIZE - 1; 
$startBlock = GetInt4d($d, START_BLOCK_POS); 
$size = GetInt4d($d, SIZE_POS); 
$name = &#39;&#39;; 
for ($i = 0; $i < $nameSize ; $i++) { 
$name .= $d[$i]; 
} 
$name = str_replace("x00", "", $name); 
$this->props[] = array ( 
&#39;name&#39; => $name, 
&#39;type&#39; => $type, 
&#39;startBlock&#39; => $startBlock, 
&#39;size&#39; => $size); 
if (($name == "Workbook") || ($name == "Book")) { 
$this->wrkbook = count($this->props) - 1; 
} 
if ($name == "Root Entry") { 
$this->rootentry = count($this->props) - 1; 
} 
//echo "name ==$name=n"; 
$offset += PROPERTY_STORAGE_BLOCK_SIZE; 
} 
} 
function getWorkBook(){ 
if ($this->props[$this->wrkbook][&#39;size&#39;] < SMALL_BLOCK_THRESHOLD){ 
// getSmallBlockStream(PropertyStorage ps) 
$rootdata = $this->__readData($this->props[$this->rootentry][&#39;startBlock&#39;]); 
$streamData = &#39;&#39;; 
$block = $this->props[$this->wrkbook][&#39;startBlock&#39;]; 
//$count = 0; 
$pos = 0; 
while ($block != -2) { 
$pos = $block * SMALL_BLOCK_SIZE; 
$streamData .= substr($rootdata, $pos, SMALL_BLOCK_SIZE); 
$block = $this->smallBlockChain[$block]; 
} 
return $streamData; 
}else{ 
$numBlocks = $this->props[$this->wrkbook][&#39;size&#39;] / BIG_BLOCK_SIZE; 
if ($this->props[$this->wrkbook][&#39;size&#39;] % BIG_BLOCK_SIZE != 0) { 
$numBlocks++; 
} 
if ($numBlocks == 0) return &#39;&#39;; 
//echo "numBlocks = $numBlocksn"; 
//byte[] streamData = new byte[numBlocks * BIG_BLOCK_SIZE]; 
//print_r($this->wrkbook); 
$streamData = &#39;&#39;; 
$block = $this->props[$this->wrkbook][&#39;startBlock&#39;]; 
//$count = 0; 
$pos = 0; 
//echo "block = $block"; 
while ($block != -2) { 
$pos = ($block + 1) * BIG_BLOCK_SIZE; 
$streamData .= substr($this->data, $pos, BIG_BLOCK_SIZE); 
$block = $this->bigBlockChain[$block]; 
} 
//echo &#39;stream&#39;.$streamData; 
return $streamData; 
} 
} 
} 
//oleread.php的内容end======================================================================================================= 
//require_once &#39;OLE.php&#39;; 
define(&#39;SPREADSHEET_EXCEL_READER_BIFF8&#39;, 0x600); 
define(&#39;SPREADSHEET_EXCEL_READER_BIFF7&#39;, 0x500); 
define(&#39;SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS&#39;, 0x5); 
define(&#39;SPREADSHEET_EXCEL_READER_WORKSHEET&#39;, 0x10); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_BOF&#39;, 0x809); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_EOF&#39;, 0x0a); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET&#39;, 0x85); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_DIMENSION&#39;, 0x200); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_ROW&#39;, 0x208); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_DBCELL&#39;, 0xd7); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_FILEPASS&#39;, 0x2f); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_NOTE&#39;, 0x1c); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_TXO&#39;, 0x1b6); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_RK&#39;, 0x7e); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_RK2&#39;, 0x27e); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_MULRK&#39;, 0xbd); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_MULBLANK&#39;, 0xbe); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_INDEX&#39;, 0x20b); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_SST&#39;, 0xfc); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_EXTSST&#39;, 0xff); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_CONTINUE&#39;, 0x3c); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_LABEL&#39;, 0x204); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_LABELSST&#39;, 0xfd); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_NUMBER&#39;, 0x203); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_NAME&#39;, 0x18); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_ARRAY&#39;, 0x221); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_STRING&#39;, 0x207); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_FORMULA&#39;, 0x406); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_FORMULA2&#39;, 0x6); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_FORMAT&#39;, 0x41e); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_XF&#39;, 0xe0); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_BOOLERR&#39;, 0x205); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_UNKNOWN&#39;, 0xffff); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR&#39;, 0x22); 
define(&#39;SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS&#39;, 0xE5); 
define(&#39;SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS&#39; , 25569); 
define(&#39;SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904&#39;, 24107); 
define(&#39;SPREADSHEET_EXCEL_READER_MSINADAY&#39;, 86400); 
//define(&#39;SPREADSHEET_EXCEL_READER_MSINADAY&#39;, 24 * 60 * 60); 
//define(&#39;SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT&#39;, "%.2f"); 
define(&#39;SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT&#39;, "%s"); 
/* 
* Place includes, constant defines and $_GLOBAL settings here. 
* Make sure they have appropriate docblocks to avoid phpDocumentor 
* construing they are documented by the page-level docblock. 
*/ 
/** 
* A class for reading Microsoft Excel Spreadsheets. 
* 
* Originally developed by Vadim Tkachenko under the name PHPExcelReader. 
* (http://sourceforge.net/projects/phpexcelreader) 
* Based on the Java version by Andy Khan (http://www.3ppt.com). Now 
* maintained by David Sanders. Reads only Biff 7 and Biff 8 formats. 
* 
* @category Spreadsheet 
* @package Spreadsheet_Excel_Reader 
* @author Vadim Tkachenko <vt@shoujidy.com> 
* @copyright 2010-2011 The PHP Group 
* @license http://www.php.cn/license/3_0.txt PHP License 3.0 
* @version Release: @package_version@ 
* @link http://pear.php.cn/package/PackageName 
* @see OLE, Spreadsheet_Excel_Writer 
*/ 
class ReadexcelSystem{ 
/** 
* Array of worksheets found 
* 
* @var array 
* @access public 
*/ 
var $boundsheets = array(); 
/** 
* Array of format records found 
* 
* @var array 
* @access public 
*/ 
var $formatRecords = array(); 
/** 
* todo 
* 
* @var array 
* @access public 
*/ 
var $sst = array(); 
/** 
* Array of worksheets 
* 
* The data is stored in &#39;cells&#39; and the meta-data is stored in an array 
* called &#39;cellsInfo&#39; 
* 
* Example: 
* 
* $sheets --> &#39;cells&#39; --> row --> column --> Interpreted value 
* --> &#39;cellsInfo&#39; --> row --> column --> &#39;type&#39; - Can be &#39;date&#39;, &#39;number&#39;, or &#39;unknown&#39; 
* --> &#39;raw&#39; - The raw data that Excel stores for that data cell 
* 
* @var array 
* @access public 
*/ 
var $sheets = array(); 
/** 
* The data returned by OLE 
* 
* @var string 
* @access public 
*/ 
var $data; 
/** 
* OLE object for reading the file 
* 
* @var OLE object 
* @access private 
*/ 
var $_ole; 
/** 
* Default encoding 
* 
* @var string 
* @access private 
*/ 
var $_defaultEncoding; 
/** 
* Default number format 
* 
* @var integer 
* @access private 
*/ 
var $_defaultFormat = SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT; 
/** 
* todo 
* List of formats to use for each column 
* 
* @var array 
* @access private 
*/ 
var $_columnsFormat = array(); 
/** 
* todo 
* 
* @var integer 
* @access private 
*/ 
var $_rowoffset = 1; 
/** 
* todo 
* 
* @var integer 
* @access private 
*/ 
var $_coloffset = 1; 
/** 
* List of default date formats used by Excel 
* 
* @var array 
* @access public 
*/ 
var $dateFormats = array ( 
0xe => "d/m/Y", 
0xf => "d-M-Y", 
0x10 => "d-M", 
0x11 => "M-Y", 
0x12 => "h:i a", 
0x13 => "h:i:s a", 
0x14 => "H:i", 
0x15 => "H:i:s", 
0x16 => "d/m/Y H:i", 
0x2d => "i:s", 
0x2e => "H:i:s", 
0x2f => "i:s.S"); 
/** 
* Default number formats used by Excel 
* 
* @var array 
* @access public 
*/ 
var $numberFormats = array( 
0x1 => "%1.0f", // "0" 
0x2 => "%1.2f", // "0.00", 
0x3 => "%1.0f", //"#,##0", 
0x4 => "%1.2f", //"#,##0.00", 
0x5 => "%1.0f", /*"$#,##0;($#,##0)",*/ 
0x6 => &#39;$%1.0f&#39;, /*"$#,##0;($#,##0)",*/ 
0x7 => &#39;$%1.2f&#39;, //"$#,##0.00;($#,##0.00)", 
0x8 => &#39;$%1.2f&#39;, //"$#,##0.00;($#,##0.00)", 
0x9 => &#39;%1.0f%%&#39;, // "0%" 
0xa => &#39;%1.2f%%&#39;, // "0.00%" 
0xb => &#39;%1.2f&#39;, // 0.00E00", 
0x25 => &#39;%1.0f&#39;, // "#,##0;(#,##0)", 
0x26 => &#39;%1.0f&#39;, //"#,##0;(#,##0)", 
0x27 => &#39;%1.2f&#39;, //"#,##0.00;(#,##0.00)", 
0x28 => &#39;%1.2f&#39;, //"#,##0.00;(#,##0.00)", 
0x29 => &#39;%1.0f&#39;, //"#,##0;(#,##0)", 
0x2a => &#39;$%1.0f&#39;, //"$#,##0;($#,##0)", 
0x2b => &#39;%1.2f&#39;, //"#,##0.00;(#,##0.00)", 
0x2c => &#39;$%1.2f&#39;, //"$#,##0.00;($#,##0.00)", 
0x30 => &#39;%1.0f&#39;); //"##0.0E0"; 
// }}} 
// {{{ Spreadsheet_Excel_Reader() 
/** 
* Constructor 
* 
* Some basic initialisation 
*/ 
function __construct() 
{ 
$this->_ole =& new OLERead(); 
$this->setUTFEncoder(&#39;iconv&#39;); 
} 
// }}} 
// {{{ setOutputEncoding() 
/** 
* Set the encoding method 
* 
* @param string Encoding to use 
* @access public 
*/ 
function setOutputEncoding($encoding) 
{ 
$this->_defaultEncoding = $encoding; 
} 
// }}} 
// {{{ setUTFEncoder() 
/** 
* $encoder = &#39;iconv&#39; or &#39;mb&#39; 
* set iconv if you would like use &#39;iconv&#39; for encode UTF-16LE to your encoding 
* set mb if you would like use &#39;mb_convert_encoding&#39; for encode UTF-16LE to your encoding 
* 
* @access public 
* @param string Encoding type to use. Either &#39;iconv&#39; or &#39;mb&#39; 
*/ 
function setUTFEncoder($encoder = &#39;iconv&#39;) 
{ 
$this->_encoderFunction = &#39;&#39;; 
if ($encoder == &#39;iconv&#39;) { 
$this->_encoderFunction = function_exists(&#39;iconv&#39;) ? &#39;iconv&#39; : &#39;&#39;; 
} elseif ($encoder == &#39;mb&#39;) { 
$this->_encoderFunction = function_exists(&#39;mb_convert_encoding&#39;) ? 
&#39;mb_convert_encoding&#39; : 
&#39;&#39;; 
} 
} 
// }}} 
// {{{ setRowColOffset() 
/** 
* todo 
* 
* @access public 
* @param offset 
*/ 
function setRowColOffset($iOffset) 
{ 
$this->_rowoffset = $iOffset; 
$this->_coloffset = $iOffset; 
} 
// }}} 
// {{{ setDefaultFormat() 
/** 
* Set the default number format 
* 
* @access public 
* @param Default format 
*/ 
function setDefaultFormat($sFormat) 
{ 
$this->_defaultFormat = $sFormat; 
} 
// }}} 
// {{{ setColumnFormat() 
/** 
* Force a column to use a certain format 
* 
* @access public 
* @param integer Column number 
* @param string Format 
*/ 
function setColumnFormat($column, $sFormat) 
{ 
$this->_columnsFormat[$column] = $sFormat; 
} 
// }}} 
// {{{ read() 
/** 
* Read the spreadsheet file using OLE, then parse 
* 
* @access public 
* @param filename 
* @todo return a valid value 
*/ 
function read($sFileName) 
{ 
/* 
require_once &#39;OLE.php&#39;; 
$ole = new OLE(); 
$ole->read($sFileName); 
foreach ($ole->_list as $i => $pps) { 
if (($pps->Name == &#39;Workbook&#39; || $pps->Name == &#39;Book&#39;) && 
$pps->Size >= SMALL_BLOCK_THRESHOLD) { 
$this->data = $ole->getData($i, 0, $ole->getDataLength($i)); 
} elseif ($pps->Name == &#39;Root Entry&#39;) { 
$this->data = $ole->getData($i, 0, $ole->getDataLength($i)); 
} 
//var_dump(strlen($ole->getData($i,
 0, $ole->getDataLength($i))), $pps->Name, md5($this->data), 
$ole->getDataLength($i)); 
} 
//exit; 
$this->_parse(); 
return sizeof($this->sheets) > 0; 
*/ 
$res = $this->_ole->read($sFileName); 
// oops, something goes wrong (Darko Miljanovic) 
if($res === false) { 
// check error code 
if($this->_ole->error == 1) { 
// bad file 
die(&#39;The filename &#39; . $sFileName . &#39; is not readable&#39;); 
} 
// check other error codes here (eg bad fileformat, etc...) 
} 
$this->data = $this->_ole->getWorkBook(); 
/* 
$res = $this->_ole->read($sFileName); 
if ($this->isError($res)) { 
// var_dump($res); 
return $this->raiseError($res); 
} 
$total = $this->_ole->ppsTotal(); 
for ($i = 0; $i < $total; $i++) { 
if ($this->_ole->isFile($i)) { 
$type = unpack("v", $this->_ole->getData($i, 0, 2)); 
if ($type[&#39;&#39;] == 0x0809) { // check if it&#39;s a BIFF stream 
$this->_index = $i; 
$this->data = $this->_ole->getData($i, 0, $this->_ole->getDataLength($i)); 
break; 
} 
} 
} 
if ($this->_index === null) { 
return $this->raiseError("$file doesn&#39;t seem to be an Excel file"); 
} 
*/ 
//echo "data =".$this->data; 
//$this->readRecords(); 
$this->_parse(); 
} 
// }}} 
// {{{ _parse() 
/** 
* Parse a workbook 
* 
* @access private 
* @return bool 
*/ 
function _parse() 
{ 
$pos = 0; 
$code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8; 
$length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8; 
$version = ord($this->data[$pos + 4]) | ord($this->data[$pos + 5])<<8; 
$substreamType = ord($this->data[$pos + 6]) | ord($this->data[$pos + 7])<<8; 
//echo
 "Start parse code=".base_convert($code,10,16)." 
version=".base_convert($version,10,16)." 
substreamType=".base_convert($substreamType,10,16).""."n"; 
if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && 
($version != SPREADSHEET_EXCEL_READER_BIFF7)) { 
return false; 
} 
if ($substreamType != SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS){ 
return false; 
} 
//print_r($rec); 
$pos += $length + 4; 
$code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8; 
$length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8; 
while ($code != SPREADSHEET_EXCEL_READER_TYPE_EOF) { 
switch ($code) { 
case SPREADSHEET_EXCEL_READER_TYPE_SST: 
//echo "Type_SSTn"; 
$spos = $pos + 4; 
$limitpos = $spos + $length; 
$uniqueStrings = $this->_GetInt4d($this->data, $spos+4); 
$spos += 8; 
for ($i = 0; $i < $uniqueStrings; $i++) { 
// Read in the number of characters 
if ($spos == $limitpos) { 
$opcode = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$conlength = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
if ($opcode != 0x3c) { 
return -1; 
} 
$spos += 4; 
$limitpos = $spos + $conlength; 
} 
$numChars = ord($this->data[$spos]) | (ord($this->data[$spos+1]) << 8); 
//echo "i = $i pos = $pos numChars = $numChars "; 
$spos += 2; 
$optionFlags = ord($this->data[$spos]); 
$spos++; 
$asciiEncoding = (($optionFlags & 0x01) == 0) ; 
$extendedString = ( ($optionFlags & 0x04) != 0); 
// See if string contains formatting information 
$richString = ( ($optionFlags & 0x08) != 0); 
if ($richString) { 
// Read in the crun 
$formattingRuns = ord($this->data[$spos]) | (ord($this->data[$spos+1]) << 8); 
$spos += 2; 
} 
if ($extendedString) { 
// Read in cchExtRst 
$extendedRunLength = $this->_GetInt4d($this->data, $spos); 
$spos += 4; 
} 
$len = ($asciiEncoding)? $numChars : $numChars*2; 
if ($spos + $len < $limitpos) { 
$retstr = substr($this->data, $spos, $len); 
$spos += $len; 
}else{ 
// found countinue 
$retstr = substr($this->data, $spos, $limitpos - $spos); 
$bytesRead = $limitpos - $spos; 
$charsLeft = $numChars - (($asciiEncoding) ? $bytesRead : ($bytesRead / 2)); 
$spos = $limitpos; 
while ($charsLeft > 0){ 
$opcode = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$conlength = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
if ($opcode != 0x3c) { 
return -1; 
} 
$spos += 4; 
$limitpos = $spos + $conlength; 
$option = ord($this->data[$spos]); 
$spos += 1; 
if ($asciiEncoding && ($option == 0)) { 
$len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength); 
$retstr .= substr($this->data, $spos, $len); 
$charsLeft -= $len; 
$asciiEncoding = true; 
}elseif (!$asciiEncoding && ($option != 0)){ 
$len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength); 
$retstr .= substr($this->data, $spos, $len); 
$charsLeft -= $len/2; 
$asciiEncoding = false; 
}elseif (!$asciiEncoding && ($option == 0)) { 
// Bummer - the string starts off as Unicode, but after the 
// continuation it is in straightforward ASCII encoding 
$len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength); 
for ($j = 0; $j < $len; $j++) { 
$retstr .= $this->data[$spos + $j].chr(0); 
} 
$charsLeft -= $len; 
$asciiEncoding = false; 
}else{ 
$newstr = &#39;&#39;; 
for ($j = 0; $j < strlen($retstr); $j++) { 
$newstr = $retstr[$j].chr(0); 
} 
$retstr = $newstr; 
$len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength); 
$retstr .= substr($this->data, $spos, $len); 
$charsLeft -= $len/2; 
$asciiEncoding = false; 
//echo "Izavratn"; 
} 
$spos += $len; 
} 
} 
$retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr); 
// echo "Str $i = $retstrn"; 
if ($richString){ 
$spos += 4 * $formattingRuns; 
} 
// For extended strings, skip over the extended string data 
if ($extendedString) { 
$spos += $extendedRunLength; 
} 
//if ($retstr == &#39;Derby&#39;){ 
// echo "bbn"; 
//} 
$this->sst[]=$retstr; 
} 
/*$continueRecords = array(); 
while ($this->getNextCode() == Type_CONTINUE) { 
$continueRecords[] = &$this->nextRecord(); 
} 
//echo " 1 Type_SSTn"; 
$this->shareStrings = new SSTRecord($r, $continueRecords); 
//print_r($this->shareStrings->strings); 
*/ 
// echo &#39;SST read: &#39;.($time_end-$time_start)."n"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_FILEPASS: 
return false; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_NAME: 
//echo "Type_NAMEn"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_FORMAT: 
$indexCode = ord($this->data[$pos+4]) | ord($this->data[$pos+5]) << 8; 
if ($version == SPREADSHEET_EXCEL_READER_BIFF8) { 
$numchars = ord($this->data[$pos+6]) | ord($this->data[$pos+7]) << 8; 
if (ord($this->data[$pos+8]) == 0){ 
$formatString = substr($this->data, $pos+9, $numchars); 
} else { 
$formatString = substr($this->data, $pos+9, $numchars*2); 
} 
} else { 
$numchars = ord($this->data[$pos+6]); 
$formatString = substr($this->data, $pos+7, $numchars*2); 
} 
$this->formatRecords[$indexCode] = $formatString; 
// echo "Type.FORMATn"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_XF: 
//global $dateFormats, $numberFormats; 
$indexCode = ord($this->data[$pos+6]) | ord($this->data[$pos+7]) << 8; 
//echo "nType.XF ".count($this->formatRecords[&#39;xfrecords&#39;])." $indexCode "; 
if (array_key_exists($indexCode, $this->dateFormats)) { 
//echo "isdate ".$dateFormats[$indexCode]; 
$this->formatRecords[&#39;xfrecords&#39;][] = array( 
&#39;type&#39; => &#39;date&#39;, 
&#39;format&#39; => $this->dateFormats[$indexCode] 
); 
}elseif (array_key_exists($indexCode, $this->numberFormats)) { 
//echo "isnumber ".$this->numberFormats[$indexCode]; 
$this->formatRecords[&#39;xfrecords&#39;][] = array( 
&#39;type&#39; => &#39;number&#39;, 
&#39;format&#39; => $this->numberFormats[$indexCode] 
); 
}else{ 
$isdate = FALSE; 
if ($indexCode > 0){ 
if (isset($this->formatRecords[$indexCode])) 
$formatstr = $this->formatRecords[$indexCode]; 
//echo &#39;.other.&#39;; 
//echo "ndate-time=$formatstr=n"; 
if ($formatstr) 
if (preg_match("/[^hmsday/-:s]/i", $formatstr) == 0) { // found day and time format 
$isdate = TRUE; 
$formatstr = str_replace(&#39;mm&#39;, &#39;i&#39;, $formatstr); 
$formatstr = str_replace(&#39;h&#39;, &#39;H&#39;, $formatstr); 
//echo "ndate-time $formatstr n"; 
} 
} 
if ($isdate){ 
$this->formatRecords[&#39;xfrecords&#39;][] = array( 
&#39;type&#39; => &#39;date&#39;, 
&#39;format&#39; => $formatstr, 
); 
}else{ 
$this->formatRecords[&#39;xfrecords&#39;][] = array( 
&#39;type&#39; => &#39;other&#39;, 
&#39;format&#39; => &#39;&#39;, 
&#39;code&#39; => $indexCode 
); 
} 
} 
//echo "n"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR: 
//echo "Type.NINETEENFOURn"; 
$this->nineteenFour = (ord($this->data[$pos+4]) == 1); 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET: 
//echo "Type.BOUNDSHEETn"; 
$rec_offset = $this->_GetInt4d($this->data, $pos+4); 
$rec_typeFlag = ord($this->data[$pos+8]); 
$rec_visibilityFlag = ord($this->data[$pos+9]); 
$rec_length = ord($this->data[$pos+10]); 
if ($version == SPREADSHEET_EXCEL_READER_BIFF8){ 
$chartype = ord($this->data[$pos+11]); 
if ($chartype == 0){ 
$rec_name = substr($this->data, $pos+12, $rec_length); 
} else { 
$rec_name = $this->_encodeUTF16(substr($this->data, $pos+12, $rec_length*2)); 
} 
}elseif ($version == SPREADSHEET_EXCEL_READER_BIFF7){ 
$rec_name = substr($this->data, $pos+11, $rec_length); 
} 
$this->boundsheets[] = array(&#39;name&#39;=>$rec_name, 
&#39;offset&#39;=>$rec_offset); 
break; 
} 
//echo "Code = ".base_convert($r[&#39;code&#39;],10,16)."n"; 
$pos += $length + 4; 
$code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8; 
$length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8; 
//$r = &$this->nextRecord(); 
//echo "1 Code = ".base_convert($r[&#39;code&#39;],10,16)."n"; 
} 
foreach ($this->boundsheets as $key=>$val){ 
$this->sn = $key; 
$this->_parsesheet($val[&#39;offset&#39;]); 
} 
return true; 
} 
/** 
* Parse a worksheet 
* 
* @access private 
* @param todo 
* @todo fix return codes 
*/ 
function _parsesheet($spos) 
{ 
$cont = true; 
// read BOF 
$code = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
$version = ord($this->data[$spos + 4]) | ord($this->data[$spos + 5])<<8; 
$substreamType = ord($this->data[$spos + 6]) | ord($this->data[$spos + 7])<<8; 
if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && ($version != SPREADSHEET_EXCEL_READER_BIFF7)) { 
return -1; 
} 
if ($substreamType != SPREADSHEET_EXCEL_READER_WORKSHEET){ 
return -2; 
} 
//echo
 "Start parse code=".base_convert($code,10,16)." 
version=".base_convert($version,10,16)." 
substreamType=".base_convert($substreamType,10,16).""."n"; 
$spos += $length + 4; 
//var_dump($this->formatRecords); 
//echo "code $code $length"; 
while($cont) { 
//echo "mem= ".memory_get_usage()."n"; 
// $r = &$this->file->nextRecord(); 
$lowcode = ord($this->data[$spos]); 
if ($lowcode == SPREADSHEET_EXCEL_READER_TYPE_EOF) break; 
$code = $lowcode | ord($this->data[$spos+1])<<8; 
$length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
$spos += 4; 
$this->sheets[$this->sn][&#39;maxrow&#39;] = $this->_rowoffset - 1; 
$this->sheets[$this->sn][&#39;maxcol&#39;] = $this->_coloffset - 1; 
//echo "Code=".base_convert($code,10,16)." $coden"; 
unset($this->rectype); 
$this->multiplier = 1; // need for format with % 
switch ($code) { 
case SPREADSHEET_EXCEL_READER_TYPE_DIMENSION: 
//echo &#39;Type_DIMENSION &#39;; 
if (!isset($this->numRows)) { 
if (($length == 10) || ($version == SPREADSHEET_EXCEL_READER_BIFF7)){ 
$this->sheets[$this->sn][&#39;numRows&#39;] = ord($this->data[$spos+2]) | ord($this->data[$spos+3]) << 8; 
$this->sheets[$this->sn][&#39;numCols&#39;] = ord($this->data[$spos+6]) | ord($this->data[$spos+7]) << 8; 
} else { 
$this->sheets[$this->sn][&#39;numRows&#39;] = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8; 
$this->sheets[$this->sn][&#39;numCols&#39;] = ord($this->data[$spos+10]) | ord($this->data[$spos+11]) << 8; 
} 
} 
//echo &#39;numRows &#39;.$this->numRows.&#39; &#39;.$this->numCols."n"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS: 
$cellRanges = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
for ($i = 0; $i < $cellRanges; $i++) { 
$fr = ord($this->data[$spos + 8*$i + 2]) | ord($this->data[$spos + 8*$i + 3])<<8; 
$lr = ord($this->data[$spos + 8*$i + 4]) | ord($this->data[$spos + 8*$i + 5])<<8; 
$fc = ord($this->data[$spos + 8*$i + 6]) | ord($this->data[$spos + 8*$i + 7])<<8; 
$lc = ord($this->data[$spos + 8*$i + 8]) | ord($this->data[$spos + 8*$i + 9])<<8; 
//$this->sheets[$this->sn][&#39;mergedCells&#39;][] = array($fr + 1, $fc + 1, $lr + 1, $lc + 1); 
if ($lr - $fr > 0) { 
$this->sheets[$this->sn][&#39;cellsInfo&#39;][$fr+1][$fc+1][&#39;rowspan&#39;] = $lr - $fr + 1; 
} 
if ($lc - $fc > 0) { 
$this->sheets[$this->sn][&#39;cellsInfo&#39;][$fr+1][$fc+1][&#39;colspan&#39;] = $lc - $fc + 1; 
} 
} 
//echo "Merged Cells $cellRanges $lr $fr $lc $fcn"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_RK: 
case SPREADSHEET_EXCEL_READER_TYPE_RK2: 
//echo &#39;SPREADSHEET_EXCEL_READER_TYPE_RK&#39;."n"; 
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
$rknum = $this->_GetInt4d($this->data, $spos + 6); 
$numValue = $this->_GetIEEE754($rknum); 
//echo $numValue." "; 
if ($this->isDate($spos)) { 
list($string, $raw) = $this->createDate($numValue); 
}else{ 
$raw = $numValue; 
if (isset($this->_columnsFormat[$column + 1])){ 
$this->curformat = $this->_columnsFormat[$column + 1]; 
} 
$string = sprintf($this->curformat, $numValue * $this->multiplier); 
//$this->addcell(RKRecord($r)); 
} 
$this->addcell($row, $column, $string, $raw); 
//echo "Type_RK $row $column $string $raw {$this->curformat}n"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_LABELSST: 
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
$xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5])<<8; 
$index = $this->_GetInt4d($this->data, $spos + 6); 
//var_dump($this->sst); 
$this->addcell($row, $column, $this->sst[$index]); 
//echo "LabelSST $row $column $stringn"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_MULRK: 
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$colFirst = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
$colLast = ord($this->data[$spos + $length - 2]) | ord($this->data[$spos + $length - 1])<<8; 
$columns = $colLast - $colFirst + 1; 
$tmppos = $spos+4; 
for ($i = 0; $i < $columns; $i++) { 
$numValue = $this->_GetIEEE754($this->_GetInt4d($this->data, $tmppos + 2)); 
if ($this->isDate($tmppos-4)) { 
list($string, $raw) = $this->createDate($numValue); 
}else{ 
$raw = $numValue; 
if (isset($this->_columnsFormat[$colFirst + $i + 1])){ 
$this->curformat = $this->_columnsFormat[$colFirst + $i + 1]; 
} 
$string = sprintf($this->curformat, $numValue * $this->multiplier); 
} 
//$rec[&#39;rknumbers&#39;][$i][&#39;xfindex&#39;] = ord($rec[&#39;data&#39;][$pos]) | ord($rec[&#39;data&#39;][$pos+1]) << 8; 
$tmppos += 6; 
$this->addcell($row, $colFirst + $i, $string, $raw); 
//echo "MULRK $row ".($colFirst + $i)." $stringn"; 
} 
//MulRKRecord($r); 
// Get the inpidual cell records from the multiple record 
//$num = ; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_NUMBER: 
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
$tmp = unpack("ddouble", substr($this->data, $spos + 6, 8)); // It machine machine dependent 
if ($this->isDate($spos)) { 
list($string, $raw) = $this->createDate($tmp[&#39;double&#39;]); 
// $this->addcell(DateRecord($r, 1)); 
}else{ 
//$raw = $tmp[&#39;&#39;]; 
if (isset($this->_columnsFormat[$column + 1])){ 
$this->curformat = $this->_columnsFormat[$column + 1]; 
} 
$raw = $this->createNumber($spos); 
$string = sprintf($this->curformat, $raw * $this->multiplier); 
// $this->addcell(NumberRecord($r)); 
} 
$this->addcell($row, $column, $string, $raw); 
//echo "Number $row $column $stringn"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_FORMULA: 
case SPREADSHEET_EXCEL_READER_TYPE_FORMULA2: 
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
if
 ((ord($this->data[$spos+6])==0) && 
(ord($this->data[$spos+12])==255) && 
(ord($this->data[$spos+13])==255)) { 
//String formula. Result follows in a STRING record 
//echo "FORMULA $row $column Formula with a string<br>n"; 
}
 elseif ((ord($this->data[$spos+6])==1) && 
(ord($this->data[$spos+12])==255) && 
(ord($this->data[$spos+13])==255)) { 
//Boolean formula. Result is in +2; 0=false,1=true 
}
 elseif ((ord($this->data[$spos+6])==2) && 
(ord($this->data[$spos+12])==255) && 
(ord($this->data[$spos+13])==255)) { 
//Error formula. Error code is in +2; 
}
 elseif ((ord($this->data[$spos+6])==3) && 
(ord($this->data[$spos+12])==255) && 
(ord($this->data[$spos+13])==255)) { 
//Formula result is a null string. 
} else { 
// result is a number, so first 14 bytes are just like a _NUMBER record 
$tmp = unpack("ddouble", substr($this->data, $spos + 6, 8)); // It machine machine dependent 
if ($this->isDate($spos)) { 
list($string, $raw) = $this->createDate($tmp[&#39;double&#39;]); 
// $this->addcell(DateRecord($r, 1)); 
}else{ 
//$raw = $tmp[&#39;&#39;]; 
if (isset($this->_columnsFormat[$column + 1])){ 
$this->curformat = $this->_columnsFormat[$column + 1]; 
} 
$raw = $this->createNumber($spos); 
$string = sprintf($this->curformat, $raw * $this->multiplier); 
// $this->addcell(NumberRecord($r)); 
} 
$this->addcell($row, $column, $string, $raw); 
//echo "Number $row $column $stringn"; 
} 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_BOOLERR: 
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
$string = ord($this->data[$spos+6]); 
$this->addcell($row, $column, $string); 
//echo &#39;Type_BOOLERR &#39;."n"; 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_ROW: 
case SPREADSHEET_EXCEL_READER_TYPE_DBCELL: 
case SPREADSHEET_EXCEL_READER_TYPE_MULBLANK: 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_LABEL: 
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; 
$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; 
$this->addcell($row,
 $column, substr($this->data, $spos + 8, ord($this->data[$spos + 
6]) | ord($this->data[$spos + 7])<<8)); 
// $this->addcell(LabelRecord($r)); 
break; 
case SPREADSHEET_EXCEL_READER_TYPE_EOF: 
$cont = false; 
break; 
default: 
//echo &#39; unknown :&#39;.base_convert($r[&#39;code&#39;],10,16)."n"; 
break; 
} 
$spos += $length; 
} 
if (!isset($this->sheets[$this->sn][&#39;numRows&#39;])) 
$this->sheets[$this->sn][&#39;numRows&#39;] = $this->sheets[$this->sn][&#39;maxrow&#39;]; 
if (!isset($this->sheets[$this->sn][&#39;numCols&#39;])) 
$this->sheets[$this->sn][&#39;numCols&#39;] = $this->sheets[$this->sn][&#39;maxcol&#39;]; 
} 
/** 
* Check whether the current record read is a date 
* 
* @param todo 
* @return boolean True if date, false otherwise 
*/ 
function isDate($spos) 
{ 
//$xfindex = GetInt2d(, 4); 
$xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8; 
//echo &#39;check is date &#39;.$xfindex.&#39; &#39;.$this->formatRecords[&#39;xfrecords&#39;][$xfindex][&#39;type&#39;]."n"; 
//var_dump($this->formatRecords[&#39;xfrecords&#39;][$xfindex]); 
if ($this->formatRecords[&#39;xfrecords&#39;][$xfindex][&#39;type&#39;] == &#39;date&#39;) { 
$this->curformat = $this->formatRecords[&#39;xfrecords&#39;][$xfindex][&#39;format&#39;]; 
$this->rectype = &#39;date&#39;; 
return true; 
} else { 
if ($this->formatRecords[&#39;xfrecords&#39;][$xfindex][&#39;type&#39;] == &#39;number&#39;) { 
$this->curformat = $this->formatRecords[&#39;xfrecords&#39;][$xfindex][&#39;format&#39;]; 
$this->rectype = &#39;number&#39;; 
if (($xfindex == 0x9) || ($xfindex == 0xa)){ 
$this->multiplier = 100; 
} 
}else{ 
$this->curformat = $this->_defaultFormat; 
$this->rectype = &#39;unknown&#39;; 
} 
return false; 
} 
} 
//}}} 
//{{{ createDate() 
/** 
* Convert the raw Excel date into a human readable format 
* 
* Dates in Excel are stored as number of seconds from an epoch. On 
* Windows, the epoch is 30/12/1899 and on Mac it&#39;s 01/01/1904 
* 
* @access private 
* @param integer The raw Excel value to convert 
* @return array First element is the converted date, the second element is number a unix timestamp 
*/ 
function createDate($numValue) 
{ 
if ($numValue > 1) { 
$utcDays
 = $numValue - ($this->nineteenFour ? 
SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904 : 
SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS); 
$utcValue = round(($utcDays+1) * SPREADSHEET_EXCEL_READER_MSINADAY); 
$string = date ($this->curformat, $utcValue); 
$raw = $utcValue; 
} else { 
$raw = $numValue; 
$hours = floor($numValue * 24); 
$mins = floor($numValue * 24 * 60) - $hours * 60; 
$secs = floor($numValue * SPREADSHEET_EXCEL_READER_MSINADAY) - $hours * 60 * 60 - $mins * 60; 
$string = date ($this->curformat, mktime($hours, $mins, $secs)); 
} 
return array($string, $raw); 
} 
function createNumber($spos) 
{ 
$rknumhigh = $this->_GetInt4d($this->data, $spos + 10); 
$rknumlow = $this->_GetInt4d($this->data, $spos + 6); 
//for ($i=0; $i<8; $i++) { echo ord($this->data[$i+$spos+6]) . " "; } echo "<br>"; 
$sign = ($rknumhigh & 0x80000000) >> 31; 
$exp = ($rknumhigh & 0x7ff00000) >> 20; 
$mantissa = (0x100000 | ($rknumhigh & 0x000fffff)); 
$mantissalow1 = ($rknumlow & 0x80000000) >> 31; 
$mantissalow2 = ($rknumlow & 0x7fffffff); 
$value = $mantissa / pow( 2 , (20- ($exp - 1023))); 
if ($mantissalow1 != 0) $value += 1 / pow (2 , (21 - ($exp - 1023))); 
$value += $mantissalow2 / pow (2 , (52 - ($exp - 1023))); 
//echo
 "Sign = $sign, Exp = $exp, mantissahighx = $mantissa, mantissalow1 = 
$mantissalow1, mantissalow2 = $mantissalow2<br>n"; 
if ($sign) {$value = -1 * $value;} 
return $value; 
} 
function addcell($row, $col, $string, $raw = &#39;&#39;) 
{ 
//echo "ADD cel $row-$col $stringn"; 
$this->sheets[$this->sn][&#39;maxrow&#39;] = max($this->sheets[$this->sn][&#39;maxrow&#39;], $row + $this->_rowoffset); 
$this->sheets[$this->sn][&#39;maxcol&#39;] = max($this->sheets[$this->sn][&#39;maxcol&#39;], $col + $this->_coloffset); 
$this->sheets[$this->sn][&#39;cells&#39;][$row + $this->_rowoffset][$col + $this->_coloffset] = $string; 
if ($raw) 
$this->sheets[$this->sn][&#39;cellsInfo&#39;][$row + $this->_rowoffset][$col + $this->_coloffset][&#39;raw&#39;] = $raw; 
if (isset($this->rectype)) 
$this->sheets[$this->sn][&#39;cellsInfo&#39;][$row
 + $this->_rowoffset][$col + $this->_coloffset][&#39;type&#39;] = 
$this->rectype; 
} 
function _GetIEEE754($rknum) 
{ 
if (($rknum & 0x02) != 0) { 
$value = $rknum >> 2; 
} else { 
//mmp 
// first comment out the previously existing 7 lines of code here 
// $tmp = unpack("d", pack("VV", 0, ($rknum & 0xfffffffc))); 
// //$value = $tmp[&#39;&#39;]; 
// if (array_key_exists(1, $tmp)) { 
// $value = $tmp[1]; 
// } else { 
// $value = $tmp[&#39;&#39;]; 
// } 
// I got my info on IEEE754 encoding from 
// http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html 
// The RK format calls for using only the most significant 30 bits of the 
// 64 bit floating point value. The other 34 bits are assumed to be 0 
// So, we use the upper 30 bits of $rknum as follows... 
$sign = ($rknum & 0x80000000) >> 31; 
$exp = ($rknum & 0x7ff00000) >> 20; 
$mantissa = (0x100000 | ($rknum & 0x000ffffc)); 
$value = $mantissa / pow( 2 , (20- ($exp - 1023))); 
if ($sign) {$value = -1 * $value;} 
//end of changes by mmp 
} 
if (($rknum & 0x01) != 0) { 
$value /= 100; 
} 
return $value; 
} 
function _encodeUTF16($string) 
{ 
$result = $string; 
if ($this->_defaultEncoding){ 
switch ($this->_encoderFunction){ 
case &#39;iconv&#39; : $result = iconv(&#39;UTF-16LE&#39;, $this->_defaultEncoding, $string); 
break; 
case &#39;mb_convert_encoding&#39; : $result = mb_convert_encoding($string, $this->_defaultEncoding, &#39;UTF-16LE&#39; ); 
break; 
} 
} 
return $result; 
} 
function _GetInt4d($data, $pos) 
{ 
$value
 = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | 
(ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24); 
if ($value>=4294967294) 
{ 
$value=-2; 
} 
return $value; 
} 
} 
/* 
* Local variables: 
* tab-width: 4 
* c-basic-offset: 4 
* c-hanging-comment-ender-p: nil 
* End: 
*/ 
?>

2. 호출 방법

<?php 
$data = new ReadexcelSystem(); 
$data->setOutputEncoding(&#39;utf-8&#39;); 
$data->read($location); 
print_r($data->sheets[0][&#39;cells&#39;] ); 
?> 
$data->sheets[0][&#39;cells&#39;]

관련글:

PHP가 Excel을 내보낼 때 과학적 표기법을 처리하는 방법

PHP가 기본적으로 Excel 파일을 내보내는 두 가지 방법

PHPExcel을 사용하여 Excel 시간을 읽는 샘플 코드 자세히 설명

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.