meteor_shower
高级会员

揮刀戲江湖譜寫情緣傳奇
UID 66798
精华
2
积分 977
帖子 913
金钱 947 喜悦币
威望 30
人脉 0
阅读权限 50
注册 2005-9-21 来自 深圳
状态 离线
|
用於讀取Excel 文件的庫
<?php //require_once 'PEAR.php'; require_once 'oleread.inc';
//define('Spreadsheet_Excel_Reader_HAVE_ICONV', function_exists('iconv')); //define('Spreadsheet_Excel_Reader_HAVE_MB', function_exists('mb_convert_encoding'));
define('Spreadsheet_Excel_Reader_BIFF8', 0x600); define('Spreadsheet_Excel_Reader_BIFF7', 0x500); define('Spreadsheet_Excel_Reader_WorkbookGlobals', 0x5); define('Spreadsheet_Excel_Reader_Worksheet', 0x10);
define('Spreadsheet_Excel_Reader_Type_BOF', 0x809); define('Spreadsheet_Excel_Reader_Type_EOF', 0x0a); define('Spreadsheet_Excel_Reader_Type_BOUNDSHEET', 0x85); define('Spreadsheet_Excel_Reader_Type_DIMENSION', 0x200); define('Spreadsheet_Excel_Reader_Type_ROW', 0x208); define('Spreadsheet_Excel_Reader_Type_DBCELL', 0xd7); define('Spreadsheet_Excel_Reader_Type_FILEPASS', 0x2f); define('Spreadsheet_Excel_Reader_Type_NOTE', 0x1c); define('Spreadsheet_Excel_Reader_Type_TXO', 0x1b6); define('Spreadsheet_Excel_Reader_Type_RK', 0x7e); define('Spreadsheet_Excel_Reader_Type_RK2', 0x27e); define('Spreadsheet_Excel_Reader_Type_MULRK', 0xbd); define('Spreadsheet_Excel_Reader_Type_MULBLANK', 0xbe); define('Spreadsheet_Excel_Reader_Type_INDEX', 0x20b); define('Spreadsheet_Excel_Reader_Type_SST', 0xfc); define('Spreadsheet_Excel_Reader_Type_EXTSST', 0xff); define('Spreadsheet_Excel_Reader_Type_CONTINUE', 0x3c); define('Spreadsheet_Excel_Reader_Type_LABEL', 0x204); define('Spreadsheet_Excel_Reader_Type_LABELSST', 0xfd); define('Spreadsheet_Excel_Reader_Type_NUMBER', 0x203); define('Spreadsheet_Excel_Reader_Type_NAME', 0x18); define('Spreadsheet_Excel_Reader_Type_ARRAY', 0x221); define('Spreadsheet_Excel_Reader_Type_STRING', 0x207); define('Spreadsheet_Excel_Reader_Type_FORMULA', 0x406); define('Spreadsheet_Excel_Reader_Type_FORMULA2', 0x6); define('Spreadsheet_Excel_Reader_Type_FORMAT', 0x41e); define('Spreadsheet_Excel_Reader_Type_XF', 0xe0); define('Spreadsheet_Excel_Reader_Type_BOOLERR', 0x205); define('Spreadsheet_Excel_Reader_Type_UNKNOWN', 0xffff); define('Spreadsheet_Excel_Reader_Type_NINETEENFOUR', 0x22); define('Spreadsheet_Excel_Reader_Type_MERGEDCELLS', 0xE5);
define('Spreadsheet_Excel_Reader_utcOffsetDays' , 25569); define('Spreadsheet_Excel_Reader_utcOffsetDays1904', 24107); define('Spreadsheet_Excel_Reader_msInADay', 24 * 60 * 60);
//define('Spreadsheet_Excel_Reader_DEF_NUM_FORMAT', "%.2f"); define('Spreadsheet_Excel_Reader_DEF_NUM_FORMAT', "%s");
// function file_get_contents for PHP < 4.3.0 // Thanks Marian Steinbach for this function if (!function_exists('file_get_contents')) { function file_get_contents($filename, $use_include_path = 0) { $data = ''; $file = @fopen($filename, "rb", $use_include_path); if ($file) { while (!feof($file)) $data .= fread($file, 1024); fclose($file); } else { // There was a problem opening the file $data = FALSE; } return $data; } }
//class Spreadsheet_Excel_Reader extends PEAR { class Spreadsheet_Excel_Reader {
var $boundsheets = array(); var $formatRecords = array(); var $sst = array(); var $sheets = array(); var $data; var $pos; var $_ole; var $_defaultEncoding; var $_defaultFormat = Spreadsheet_Excel_Reader_DEF_NUM_FORMAT; var $_columnsFormat = array(); var $_rowoffset = 1; var $_coloffset = 1; 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");
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 => '$%1.0f', /*"$#,##0;($#,##0)",*/ 0x7 => '$%1.2f', //"$#,##0.00;($#,##0.00)", 0x8 => '$%1.2f', //"$#,##0.00;($#,##0.00)", 0x9 => '%1.0f%%', // "0%" 0xa => '%1.2f%%', // "0.00%" 0xb => '%1.2f', // 0.00E00", 0x25 => '%1.0f', // "#,##0;(#,##0)", 0x26 => '%1.0f', //"#,##0;(#,##0)", 0x27 => '%1.2f', //"#,##0.00;(#,##0.00)", 0x28 => '%1.2f', //"#,##0.00;(#,##0.00)", 0x29 => '%1.0f', //"#,##0;(#,##0)", 0x2a => '$%1.0f', //"$#,##0;($#,##0)", 0x2b => '%1.2f', //"#,##0.00;(#,##0.00)", 0x2c => '$%1.2f', //"$#,##0.00;($#,##0.00)", 0x30 => '%1.0f'); //"##0.0E0";
function Spreadsheet_Excel_Reader(){ $this->_ole =& new OLERead(); $this->setUTFEncoder('iconv');
}
function setOutputEncoding($Encoding){ $this->_defaultEncoding = $Encoding; }
/** * $encoder = 'iconv' or 'mb' * set iconv if you would like use 'iconv' for encode UTF-16LE to your encoding * set mb if you would like use 'mb_convert_encoding' for encode UTF-16LE to your encoding */ function setUTFEncoder($encoder = 'iconv'){ $this->_encoderFunction = ''; if ($encoder == 'iconv'){ $this->_encoderFunction = function_exists('iconv') ? 'iconv' : ''; }elseif ($encoder == 'mb') { $this->_encoderFunction = function_exists('mb_convert_encoding') ? 'mb_convert_encoding' : ''; } }
function setRowColOffset($iOffset){ $this->_rowoffset = $iOffset; $this->_coloffset = $iOffset; }
function setDefaultFormat($sFormat){ $this->_defaultFormat = $sFormat; }
function setColumnFormat($column, $sFormat){ $this->_columnsFormat[$column] = $sFormat; }
function read($sFileName) { $errlevel = error_reporting(); error_reporting($errlevel ^ E_NOTICE); $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('The filename ' . $sFileName . ' is not readable'); } // 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[''] == 0x0809) { // check if it'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't seem to be an Excel file"); } */ //var_dump($this->data); //echo "data =".$this->data; $this->pos = 0; //$this->readRecords(); $this->_parse(); error_reporting($errlevel);
}
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 = ''; 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 == 'Derby'){ // 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 'SST read: '.($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< | |