reader.php.svn-base

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

SVN-BASE
811
字号
                                                  // 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 "Izavrat\n";                                                                  }                                                          $spos += $len;                                                         }                                                }                                                $retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr);//                                              echo "Str $i = $retstr\n";                                        if ($richString){                                                  $spos += 4 * $formattingRuns;                                                }                                                // For extended strings, skip over the extended string data                                                if ($extendedString) {                                                  $spos += $extendedRunLength;                                                }                                                        //if ($retstr == 'Derby'){                                                        //      echo "bb\n";                                                        //}                                                $this->sst[]=$retstr;                                       }                    /*$continueRecords = array();                    while ($this->getNextCode() == Type_CONTINUE) {                        $continueRecords[] = &$this->nextRecord();                    }                    //echo " 1 Type_SST\n";                    $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_NAME\n";                    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.FORMAT\n";                    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['xfrecords'])." $indexCode ";                        if (array_key_exists($indexCode, $this->dateFormats)) {                            //echo "isdate ".$dateFormats[$indexCode];                            $this->formatRecords['xfrecords'][] = array(                                    'type' => 'date',                                    'format' => $this->dateFormats[$indexCode]                                    );                        }elseif (array_key_exists($indexCode, $this->numberFormats)) {                        //echo "isnumber ".$this->numberFormats[$indexCode];                            $this->formatRecords['xfrecords'][] = array(                                    'type' => 'number',                                    'format' => $this->numberFormats[$indexCode]                                    );                        }else{                            $isdate = FALSE;                            if ($indexCode > 0){                            	if (isset($this->formatRecords[$indexCode]))                                	$formatstr = $this->formatRecords[$indexCode];                                //echo '.other.';                                //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('mm', 'i', $formatstr);                                    $formatstr = str_replace('h', 'H', $formatstr);                                    //echo "\ndate-time $formatstr \n";                                }                            }                            if ($isdate){                                $this->formatRecords['xfrecords'][] = array(                                        'type' => 'date',                                        'format' => $formatstr,                                        );                            }else{                                $this->formatRecords['xfrecords'][] = array(                                        'type' => 'other',                                        'format' => '',                                        'code' => $indexCode                                        );                            }                        }                        //echo "\n";                    break;                case Spreadsheet_Excel_Reader_Type_NINETEENFOUR:                    //echo "Type.NINETEENFOUR\n";                    $this->nineteenFour = (ord($this->data[$pos+4]) == 1);                    break;                case Spreadsheet_Excel_Reader_Type_BOUNDSHEET:                    //echo "Type.BOUNDSHEET\n";                        $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('name'=>$rec_name,                                                 'offset'=>$rec_offset);                    break;            }            //echo "Code = ".base_convert($r['code'],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['code'],10,16)."\n";        }        foreach ($this->boundsheets as $key=>$val){            $this->sn = $key;            $this->_parsesheet($val['offset']);        }        return true;    }    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]['maxrow'] = $this->_rowoffset - 1;            $this->sheets[$this->sn]['maxcol'] = $this->_coloffset - 1;            //echo "Code=".base_convert($code,10,16)." $code\n";            unset($this->rectype);            $this->multiplier = 1; // need for format with %            switch ($code) {                case Spreadsheet_Excel_Reader_Type_DIMENSION:                    //echo 'Type_DIMENSION ';                    if (!isset($this->numRows)) {                        if (($length == 10) ||  ($version == Spreadsheet_Excel_Reader_BIFF7)){                            $this->sheets[$this->sn]['numRows'] = ord($this->data[$spos+2]) | ord($this->data[$spos+3]) << 8;                            $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+6]) | ord($this->data[$spos+7]) << 8;                        } else {                            $this->sheets[$this->sn]['numRows'] = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8;                            $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+10]) | ord($this->data[$spos+11]) << 8;                        }                    }                    //echo 'numRows '.$this->numRows.' '.$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]['mergedCells'][] = array($fr + 1, $fc + 1, $lr + 1, $lc + 1);                        if ($lr - $fr > 0) {                            $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['rowspan'] = $lr - $fr + 1;                        }                        if ($lc - $fc > 0) {                            $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['colspan'] = $lc - $fc + 1;                        }                    }                    //echo "Merged Cells $cellRanges $lr $fr $lc $fc\n";                    break;                case Spreadsheet_Excel_Reader_Type_RK:                case Spreadsheet_Excel_Reader_Type_RK2:                    //echo 'Spreadsheet_Excel_Reader_Type_RK'."\n";                    $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;

⌨️ 快捷键说明

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