reader.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 811 行 · 第 1/3 页

SVN-BASE
811
字号
                    $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 $string\n";                    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['rknumbers'][$i]['xfindex'] = ord($rec['data'][$pos]) | ord($rec['data'][$pos+1]) << 8;                      $tmppos += 6;                      $this->addcell($row, $colFirst + $i, $string, $raw);                      //echo "MULRK $row ".($colFirst + $i)." $string\n";                    }                     //MulRKRecord($r);                    // Get the individual 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['double']);                     //   $this->addcell(DateRecord($r, 1));                    }else{                        //$raw = $tmp[''];                        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 $string\n";                    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['double']);	                     //   $this->addcell(DateRecord($r, 1));	                    }else{	                        //$raw = $tmp[''];	                        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 $string\n";					}					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 'Type_BOOLERR '."\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 ' unknown :'.base_convert($r['code'],10,16)."\n";                    break;            }            $spos += $length;        }        if (!isset($this->sheets[$this->sn]['numRows']))        	 $this->sheets[$this->sn]['numRows'] = $this->sheets[$this->sn]['maxrow'];        if (!isset($this->sheets[$this->sn]['numCols']))        	 $this->sheets[$this->sn]['numCols'] = $this->sheets[$this->sn]['maxcol'];    }    function isDate($spos){        //$xfindex = GetInt2d(, 4);        $xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8;        //echo 'check is date '.$xfindex.' '.$this->formatRecords['xfrecords'][$xfindex]['type']."\n";        //var_dump($this->formatRecords['xfrecords'][$xfindex]);        if ($this->formatRecords['xfrecords'][$xfindex]['type'] == 'date') {            $this->curformat = $this->formatRecords['xfrecords'][$xfindex]['format'];            $this->rectype = 'date';            return true;        } else {            if ($this->formatRecords['xfrecords'][$xfindex]['type'] == 'number') {                $this->curformat = $this->formatRecords['xfrecords'][$xfindex]['format'];                $this->rectype = 'number';                if (($xfindex == 0x9) || ($xfindex == 0xa)){                    $this->multiplier = 100;                }            }else{                $this->curformat = $this->_defaultFormat;                $this->rectype = 'unknown';            }            return false;        }    }    function createDate($numValue){        if ($numValue > 1){            $utcDays = $numValue - ($this->nineteenFour ? Spreadsheet_Excel_Reader_utcOffsetDays1904 : Spreadsheet_Excel_Reader_utcOffsetDays);            $utcValue = round($utcDays * 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 = ''){        //echo "ADD cel $row-$col $string\n";        $this->sheets[$this->sn]['maxrow'] = max($this->sheets[$this->sn]['maxrow'], $row + $this->_rowoffset);        $this->sheets[$this->sn]['maxcol'] = max($this->sheets[$this->sn]['maxcol'], $col + $this->_coloffset);        $this->sheets[$this->sn]['cells'][$row + $this->_rowoffset][$col + $this->_coloffset] = $string;        if ($raw)            $this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset]['raw'] = $raw;        if (isset($this->rectype))            $this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset]['type'] = $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[''];//                if (array_key_exists(1, $tmp)) {//                    $value = $tmp[1];//                } else {//                    $value = $tmp[''];//                }// 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 'iconv' : 	$result = iconv('UTF-16LE', $this->_defaultEncoding, $string);        						break;        		case 'mb_convert_encoding' : 	$result = mb_convert_encoding($string, $this->_defaultEncoding, 'UTF-16LE' );        						break;        	}        }        return $result;    }    function _GetInt4d($data, $pos) {        return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24);    }}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?