phpexcel读取excel文档代码

作者:袖梨 2022-06-24

最近刚刚做了个导入excle文件,群发短信的功能,在这里总结下用php教程获取excle文件数据的方法,

1、readexcel.system.php

/* vim: set expandtab tabstop=4 shiftsofttabstop=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.andykhan.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.net/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 [email protected] so we can mail you a copy immediately.
*
* @category   Spreadsheet
* @package    Spreadsheet_Excel_Reader
* @author     Vadim Tkachenko <[email protected]>
* @license    http://www.php.net/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.net/package/Spreadsheet_Excel_Reader
* @see        OLE, Spreadsheet_Excel_Writer
*/
//require_once 'PEAR.php';
//require_once 'oleread.php';
//oleread.php的内容start=======================================================================================================
define('NUM_BIG_BLOCK_DEPOT_BLOCKS_POS', 0x2c);
define('SMALL_BLOCK_DEPOT_BLOCK_POS', 0x3c);
define('ROOT_START_BLOCK_POS', 0x30);
define('BIG_BLOCK_SIZE', 0x200);
define('SMALL_BLOCK_SIZE', 0x40);
define('EXTENSION_BLOCK_POS', 0x44);
define('NUM_EXTENSION_BLOCK_POS', 0x48);
define('PROPERTY_STORAGE_BLOCK_SIZE', 0x80);
define('BIG_BLOCK_DEPOT_BLOCKS_POS', 0x4c);
define('SMALL_BLOCK_THRESHOLD', 0x1000);
// property storage offsets
define('SIZE_OF_NAME_POS', 0x40);
define('TYPE_POS', 0x42);
define('START_BLOCK_POS', 0x74);
define('SIZE_POS', 0x78);
define('IDENTIFIER_OLE', pack("CCCCCCCC",0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1));
//echo 'ROOT_START_BLOCK_POS = '.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 = '';
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 'start';
       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 '=====2';
        // 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 '==='.$this->entry."===";
        $this->__readPropertySets();

    }

function __readData($bl) {
        $block = $bl;
        $pos = 0;
        $data = '';
        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 = '';
            for ($i = 0; $i < $nameSize ; $i++) {
              $name .= $d[$i];
            }
            $name = str_replace("x00", "", $name);
            $this->props教程[] = array (
                'name' => $name,
                'type' => $type,
                'startBlock' => $startBlock,
                'size' => $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]['size'] < SMALL_BLOCK_THRESHOLD){
//            getSmallBlockStream(PropertyStorage ps)
               $rootdata = $this->__readData($this->props[$this->rootentry]['startBlock']);
               $streamData = '';
               $block = $this->props[$this->wrkbook]['startBlock'];
               //$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]['size'] / BIG_BLOCK_SIZE;
               if ($this->props[$this->wrkbook]['size'] % BIG_BLOCK_SIZE != 0) {
                   $numBlocks++;
               }    
               if ($numBlocks == 0) return '';
               //echo "numBlocks = $numBlocksn";
           //byte[] streamData = new byte[numBlocks * BIG_BLOCK_SIZE];
               //print_r($this->wrkbook);
               $streamData = '';
               $block = $this->props[$this->wrkbook]['startBlock'];
               //$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 'stream'.$streamData;
               return $streamData;
    }
    }
}
//oleread.php的内容end=======================================================================================================

//require_once 'OLE.php';
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',          86400);
//define('SPREADSHEET_EXCEL_READER_MSINADAY', 24 * 60 * 60);
//define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT', "%.2f");
define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT',    "%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.andykhan.com).  Now
* maintained by David Sanders.  Reads only Biff 7 and Biff 8 formats.
*
* @category   Spreadsheet
* @package    Spreadsheet_Excel_Reader
* @author     Vadim Tkachenko <[email protected]>
* @copyright  1997-2005 The PHP Group
* @license    http://www.php.net/license/3_0.txt  PHP License 3.0
* @version    Release: @package_version@
* @link       http://pear.php.net/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 'cells' and the meta-data is stored in an array
     * called 'cellsInfo'
     *
     * Example:
     *
     * $sheets  -->  'cells'  -->  row --> column --> Interpreted value
     *          -->  'cellsInfo' --> row --> column --> 'type' - Can be 'date', 'number', or 'unknown'
     *                                            --> 'raw' - 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 => '$%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";
    // }}}
    // {{{ Spreadsheet_Excel_Reader()

    /**
     * Constructor
     *
     * Some basic initialisation
     */
   function __construct()
    {
        $this->_ole =& new OLERead();
        $this->setUTFEncoder('iconv');
    }

    // }}}
    // {{{ setOutputEncoding()
    /**
     * Set the encoding method
     *
     * @param string Encoding to use
     * @access public
     */

    function setOutputEncoding($encoding)
    {
        $this->_defaultEncoding = $encoding;
    }

    // }}}
    // {{{ setUTFEncoder()
    /**
     *  $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

     *

     * @access public

     * @param string Encoding type to use.  Either 'iconv' or 'mb'

     */

    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' :

                                      '';

        }

    }

 

    // }}}

    // {{{ 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 'OLE.php';

        $ole = new OLE();

        $ole->read($sFileName);

 

        foreach ($ole->_list as $i => $pps) {

            if (($pps->Name == 'Workbook' || $pps->Name == 'Book') &&

                $pps->Size >= SMALL_BLOCK_THRESHOLD) {

 

                $this->data = $ole->getData($i, 0, $ole->getDataLength($i));

            } elseif ($pps->Name == 'Root Entry') {

                $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('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");

        }

 

        */

 

    //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) {

                       &

相关文章

精彩推荐