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 + -
显示快捷键?