Ignore:
Timestamp:
Nov 6, 2014, 11:29:01 AM (5 years ago)
Author:
kent1@…
Message:

Indentation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/fulltext/trunk/lib/simplexlsx.class.php

    r52790 r85892  
    55// Classe SimpleXLSX php v0.4 de Sergey Schuchkin legerement modifiee pour SPIP
    66// MS Excel 2007 workbooks reader
    7 // Example: 
     7// Example:
    88//   $xlsx = new SimpleXLSX('book.xlsx');
    99//   print_r( $xlsx->rows() );
    10 // Example 2: 
     10// Example 2:
    1111//   $xlsx = new SimpleXLSX('book.xlsx');
    1212//   print_r( $xlsx->rowsEx() );
    13 // Example 3: 
     13// Example 3:
    1414//   $xlsx = new SimpleXLSX('book.xlsx');
    1515//   print_r( $xlsx->rows(2) ); // second worksheet
     
    2525        private $sharedstrings;
    2626        // scheme
    27         const SCHEMA_OFFICEDOCUMENT  =  'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument';
    28         const SCHEMA_RELATIONSHIP  =  'http://schemas.openxmlformats.org/package/2006/relationships';
    29         const SCHEMA_SHAREDSTRINGS =  'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings';
    30         const SCHEMA_WORKSHEETRELATION =  'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet';
    31        
    32         function __construct( $filename ) {
    33                 $this->_unzip( $filename );
    34                 $this->_parse();
    35         }
     27        const SCHEMA_OFFICEDOCUMENT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument';
     28        const SCHEMA_RELATIONSHIP = 'http://schemas.openxmlformats.org/package/2006/relationships';
     29        const SCHEMA_SHAREDSTRINGS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings';
     30        const SCHEMA_WORKSHEETRELATION = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet';
     31
     32        function __construct($filename) {
     33                $this -> _unzip($filename);
     34                $this -> _parse();
     35        }
     36
    3637        function sheets() {
    37                 return $this->sheets;
    38         }
     38                return $this -> sheets;
     39        }
     40
    3941        function sheetsCount() {
    40                 return count($this->sheets);
    41         }
    42         function worksheet( $worksheet_id ) {
    43                 if ( isset( $this->sheets[ $worksheet_id ] ) ) {
    44                         $ws = $this->sheets[ $worksheet_id ];
    45                        
    46                         if (isset($ws->hyperlinks)) {
    47                                 $this->hyperlinks = array();
    48                                 foreach( $ws->hyperlinks->hyperlink as $hyperlink ) {
    49                                         $this->hyperlinks[ (string) $hyperlink['ref'] ] = (string) $hyperlink['display'];
    50                                 }
    51                         }
    52                        
     42                return count($this -> sheets);
     43        }
     44
     45        function worksheet($worksheet_id) {
     46                if (isset($this -> sheets[$worksheet_id])) {
     47                        $ws = $this -> sheets[$worksheet_id];
     48
     49                        if (isset($ws -> hyperlinks)) {
     50                                $this -> hyperlinks = array();
     51                                foreach ($ws->hyperlinks->hyperlink as $hyperlink) {
     52                                        $this -> hyperlinks[(string)$hyperlink['ref']] = (string)$hyperlink['display'];
     53                                }
     54                        }
     55
    5356                        return $ws;
    5457                }
    55                        
    56         }
    57         function dimension( $worksheet_id = 1 ) {
    58                 $ws = $this->worksheet($worksheet_id);
    59                 $ref = (string) $ws->dimension['ref'];
     58
     59        }
     60
     61        function dimension($worksheet_id = 1) {
     62                $ws = $this -> worksheet($worksheet_id);
     63                $ref = (string)$ws -> dimension['ref'];
    6064                $d = explode(':', $ref);
    61                 $index = $this->_columnIndex( $d[1] );         
    62                 return array( $index[0]+1, $index[1]+1);
    63         }
     65                $index = $this -> _columnIndex($d[1]);
     66                return array($index[0] + 1, $index[1] + 1);
     67        }
     68
    6469        // sheets numeration: 1,2,3....
    65         function rows( $worksheet_id = 1 ) {
    66                
    67                 $ws = $this->worksheet( $worksheet_id);
    68                
     70        function rows($worksheet_id = 1) {
     71
     72                $ws = $this -> worksheet($worksheet_id);
     73
    6974                $rows = array();
    7075                $curR = 0;
    71                                
     76
    7277                foreach ($ws->sheetData->row as $row) {
    73                        
     78
    7479                        foreach ($row->c as $c) {
    75                                 list($curC,) = $this->_columnIndex((string) $c['r']);
    76                                 $rows[ $curR ][ $curC ] = $this->value($c);
    77                         }
    78                        
     80                                list($curC, ) = $this -> _columnIndex((string)$c['r']);
     81                                $rows[$curR][$curC] = $this -> value($c);
     82                        }
     83
    7984                        $curR++;
    8085                }
    8186                return $rows;
    8287        }
    83         function rowsEx( $worksheet_id = 1 ) {
     88
     89        function rowsEx($worksheet_id = 1) {
    8490                $rows = array();
    8591                $curR = 0;
    86                 if (($ws = $this->worksheet( $worksheet_id)) === false)
     92                if (($ws = $this -> worksheet($worksheet_id)) === false)
    8793                        return false;
    8894                foreach ($ws->sheetData->row as $row) {
    89                        
     95
    9096                        foreach ($row->c as $c) {
    91                                 list($curC,) = $this->_columnIndex((string) $c['r']);
    92                                 $rows[ $curR ][ $curC ] = array(
    93                                         'name' => (string) $c['r'],
    94                                         'value' => $this->value($c),
    95                                         'href' => $this->href( $c ),
    96                                 );
     97                                list($curC, ) = $this -> _columnIndex((string)$c['r']);
     98                                $rows[$curR][$curC] = array('name' => (string)$c['r'], 'value' => $this -> value($c), 'href' => $this -> href($c), );
    9799                        }
    98100                        $curR++;
     
    101103
    102104        }
     105
    103106        // thx Gonzo
    104         function _columnIndex( $cell = 'A1' ) {
    105                
     107        function _columnIndex($cell = 'A1') {
     108
    106109                if (preg_match("/([A-Z]+)(\d+)/", $cell, $matches)) {
    107                        
     110
    108111                        $col = $matches[1];
    109112                        $row = $matches[2];
    110                        
     113
    111114                        $colLen = strlen($col);
    112115                        $index = 0;
    113116
    114                         for ($i = $colLen-1; $i >= 0; $i--)
    115                                 $index += (ord($col{$i}) - 64) * pow(26, $colLen-$i-1);
    116 
    117                         return array($index-1, $row-1);
    118                 }
    119                
    120         }
    121         function value( $cell ) {
     117                        for ($i = $colLen - 1; $i >= 0; $i--)
     118                                $index += (ord($col{$i}) - 64) * pow(26, $colLen - $i - 1);
     119
     120                        return array($index - 1, $row - 1);
     121                }
     122
     123        }
     124
     125        function value($cell) {
    122126                // Determine data type
    123127                $dataType = (string)$cell["t"];
    124128                switch ($dataType) {
    125                         case "s":
     129                        case "s" :
    126130                                // Value is a shared string
    127                                 if ((string)$cell->v != '') {
    128                                         $value = $this->sharedstrings[intval($cell->v)];
     131                                if ((string)$cell -> v != '') {
     132                                        $value = $this -> sharedstrings[intval($cell -> v)];
    129133                                } else {
    130134                                        $value = '';
     
    132136
    133137                                break;
    134                                
    135                         case "b":
     138
     139                        case "b" :
    136140                                // Value is boolean
    137                                 $value = (string)$cell->v;
     141                                $value = (string)$cell -> v;
    138142                                if ($value == '0') {
    139143                                        $value = false;
     
    141145                                        $value = true;
    142146                                } else {
    143                                         $value = (bool)$cell->v;
    144                                 }
    145 
    146                                 break;
    147                                
    148                         case "inlineStr":
     147                                        $value = (bool)$cell -> v;
     148                                }
     149
     150                                break;
     151
     152                        case "inlineStr" :
    149153                                // Value is rich text inline
    150                                 $value = $this->_parseRichText($cell->is);
    151                                                        
    152                                 break;
    153                                
    154                         case "e":
     154                                $value = $this -> _parseRichText($cell -> is);
     155
     156                                break;
     157
     158                        case "e" :
    155159                                // Value is an error message
    156                                 if ((string)$cell->v != '') {
    157                                         $value = (string)$cell->v;
     160                                if ((string)$cell -> v != '') {
     161                                        $value = (string)$cell -> v;
    158162                                } else {
    159163                                        $value = '';
     
    162166                                break;
    163167
    164                         default:
     168                        default :
    165169                                // Value is a string
    166                                 $value = (string)$cell->v;
     170                                $value = (string)$cell -> v;
    167171
    168172                                // Check for numeric values
    169173                                if (is_numeric($value) && $dataType != 's') {
    170                                         if ($value == (int)$value) $value = (int)$value;
    171                                         elseif ($value == (float)$value) $value = (float)$value;
    172                                         elseif ($value == (double)$value) $value = (double)$value;
     174                                        if ($value == (int)$value)
     175                                                $value = (int)$value;
     176                                        elseif ($value == (float)$value)
     177                                                $value = (float)$value;
     178                                        elseif ($value == (double)$value)
     179                                                $value = (double)$value;
    173180                                }
    174181                }
    175182                return $value;
    176183        }
    177         function href( $cell ) {
    178                 return isset( $this->hyperlinks[ (string) $cell['r'] ] ) ? $this->hyperlinks[ (string) $cell['r'] ] : '';
    179         }
    180         function _unzip( $filename ) {
     184
     185        function href($cell) {
     186                return isset($this -> hyperlinks[(string)$cell['r']]) ? $this -> hyperlinks[(string)$cell['r']] : '';
     187        }
     188
     189        function _unzip($filename) {
    181190                // Clear current file
    182                 $this->datasec = array();
     191                $this -> datasec = array();
    183192
    184193                // Package information
    185                 $this->package = array(
    186                         'filename' => $filename,
    187                         'mtime' => filemtime( $filename ),
    188                         'size' => filesize( $filename ),
    189                         'comment' => '',
    190                         'entries' => array()
    191                 );
    192         // Read file
     194                $this -> package = array('filename' => $filename, 'mtime' => filemtime($filename), 'size' => filesize($filename), 'comment' => '', 'entries' => array());
     195                // Read file
    193196                $oF = fopen($filename, 'rb');
    194                 $vZ = fread($oF, $this->package['size']);
     197                $vZ = fread($oF, $this -> package['size']);
    195198                fclose($oF);
    196199                // Cut end of central directory
     
    199202                // Normal way
    200203                $aP = unpack('x16/v1CL', $aE[1]);
    201                 $this->package['comment'] = substr($aE[1], 18, $aP['CL']);
     204                $this -> package['comment'] = substr($aE[1], 18, $aP['CL']);
    202205
    203206                // Translates end of line from other operating systems
    204                 $this->package['comment'] = strtr($this->package['comment'], array("\r\n" => "\n", "\r" => "\n"));
     207                $this -> package['comment'] = strtr($this -> package['comment'], array("\r\n" => "\n", "\r" => "\n"));
    205208
    206209                // Cut the entries from the central directory
     
    214217                foreach ($aE as $vZ) {
    215218                        $aI = array();
    216                         $aI['E']  = 0;
     219                        $aI['E'] = 0;
    217220                        $aI['EM'] = '';
    218221                        // Retrieving local file header information
    219 //                      $aP = unpack('v1VN/v1GPF/v1CM/v1FT/v1FD/V1CRC/V1CS/V1UCS/v1FNL', $vZ);
     222                        //                      $aP = unpack('v1VN/v1GPF/v1CM/v1FT/v1FD/V1CRC/V1CS/V1UCS/v1FNL', $vZ);
    220223                        $aP = unpack('v1VN/v1GPF/v1CM/v1FT/v1FD/V1CRC/V1CS/V1UCS/v1FNL/v1EFL', $vZ);
    221224                        // Check if data is encrypted
    222 //                      $bE = ($aP['GPF'] && 0x0001) ? TRUE : FALSE;
     225                        //                      $bE = ($aP['GPF'] && 0x0001) ? TRUE : FALSE;
    223226                        $bE = false;
    224227                        $nF = $aP['FNL'];
     
    230233
    231234                                $aP['CRC'] = $aP1['CRC'];
    232                                 $aP['CS']  = $aP1['CS'];
     235                                $aP['CS'] = $aP1['CS'];
    233236                                $aP['UCS'] = $aP1['UCS'];
    234237
     
    252255
    253256                        if (strlen($vZ) != $aP['CS']) {
    254                           $aI['E'] = 1;
    255                           $aI['EM'] = 'Compressed size is not equal with the value in header information.';
     257                                $aI['E'] = 1;
     258                                $aI['EM'] = 'Compressed size is not equal with the value in header information.';
    256259                        } else {
    257260                                if ($bE) {
    258                                         $aI['E']  = 5;
     261                                        $aI['E'] = 5;
    259262                                        $aI['EM'] = 'File is encrypted, which is not supported from this class.';
    260263                                } else {
    261264                                        switch($aP['CM']) {
    262                                                 case 0: // Stored
     265                                                case 0 :
     266                                                        // Stored
    263267                                                        // Here is nothing to do, the file ist flat.
    264268                                                        break;
    265                                                 case 8: // Deflated
     269                                                case 8 :
     270                                                        // Deflated
    266271                                                        $vZ = gzinflate($vZ);
    267272                                                        break;
    268                                                 case 12: // BZIP2
    269                                                         if (! extension_loaded('bz2')) {
     273                                                case 12 :
     274                                                        // BZIP2
     275                                                        if (!extension_loaded('bz2')) {
    270276                                                                if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
    271                                                                   @dl('php_bz2.dll');
     277                                                                        @dl('php_bz2.dll');
    272278                                                                } else {
    273                                                                   @dl('bz2.so');
     279                                                                        @dl('bz2.so');
    274280                                                                }
    275281                                                        }
     
    277283                                                                $vZ = bzdecompress($vZ);
    278284                                                        } else {
    279                                                                 $aI['E']  = 7;
     285                                                                $aI['E'] = 7;
    280286                                                                $aI['EM'] = "PHP BZIP2 extension not available.";
    281287                                                        }
    282288                                                        break;
    283                                                 default:
    284                                                   $aI['E'] = 6;
    285                                                   $aI['EM'] = "De-/Compression method {$aP['CM']} is not supported.";
     289                                                default :
     290                                                        $aI['E'] = 6;
     291                                                        $aI['EM'] = "De-/Compression method {$aP['CM']} is not supported.";
    286292                                        }
    287                                         if (! $aI['E']) {
     293                                        if (!$aI['E']) {
    288294                                                if ($vZ === FALSE) {
    289                                                         $aI['E']  = 2;
     295                                                        $aI['E'] = 2;
    290296                                                        $aI['EM'] = 'Decompression of data failed.';
    291297                                                } else {
    292298                                                        if (strlen($vZ) != $aP['UCS']) {
    293                                                                 $aI['E']  = 3;
     299                                                                $aI['E'] = 3;
    294300                                                                $aI['EM'] = 'Uncompressed size is not equal with the value in header information.';
    295301                                                        } else {
    296302                                                                if (crc32($vZ) != $aP['CRC']) {
    297                                                                         $aI['E']  = 4;
     303                                                                        $aI['E'] = 4;
    298304                                                                        $aI['EM'] = 'CRC32 checksum is not equal with the value in header information.';
    299305                                                                }
     
    307313
    308314                        // DOS to UNIX timestamp
    309                         $aI['T'] = mktime(($aP['FT']  & 0xf800) >> 11,
    310                                                           ($aP['FT']  & 0x07e0) >>  5,
    311                                                           ($aP['FT']  & 0x001f) <<  1,
    312                                                           ($aP['FD']  & 0x01e0) >>  5,
    313                                                           ($aP['FD']  & 0x001f),
    314                                                           (($aP['FD'] & 0xfe00) >>  9) + 1980);
     315                        $aI['T'] = mktime(($aP['FT'] & 0xf800)>>11, ($aP['FT'] & 0x07e0)>>5, ($aP['FT'] & 0x001f)<<1, ($aP['FD'] & 0x01e0)>>5, ($aP['FD'] & 0x001f), (($aP['FD'] & 0xfe00)>>9) + 1980);
    315316
    316317                        //$this->Entries[] = &new SimpleUnzipEntry($aI);
    317                         $this->package['entries'][] = array(
    318                                 'data' => $aI['D'],
    319                                 'error' => $aI['E'],
    320                                 'error_msg' => $aI['EM'],
    321                                 'name' => $aI['N'],
    322                                 'path' => $aI['P'],
    323                                 'time' => $aI['T']
    324                         );
     318                        $this -> package['entries'][] = array('data' => $aI['D'], 'error' => $aI['E'], 'error_msg' => $aI['EM'], 'name' => $aI['N'], 'path' => $aI['P'], 'time' => $aI['T']);
    325319
    326320                } // end for each entries
    327321        }
     322
    328323        function getPackage() {
    329                 return $this->package;
    330         }
    331         function getEntryData( $name ) {
    332                 $dir = dirname( $name );
    333                 $name = basename( $name );
    334                 foreach( $this->package['entries'] as $entry)
    335                         if ( $entry['path'] == $dir && $entry['name'] == $name)
     324                return $this -> package;
     325        }
     326
     327        function getEntryData($name) {
     328                $dir = dirname($name);
     329                $name = basename($name);
     330                foreach ($this->package['entries'] as $entry)
     331                        if ($entry['path'] == $dir && $entry['name'] == $name)
    336332                                return $entry['data'];
    337333        }
    338         function unixstamp( $excelDateTime ) {
    339                 $d = floor( $excelDateTime ); // seconds since 1900
     334
     335        function unixstamp($excelDateTime) {
     336                $d = floor($excelDateTime);
     337                // seconds since 1900
    340338                $t = $excelDateTime - $d;
    341                 return ($d > 0) ? ( $d - 25569 ) * 86400 + $t * 86400 : $t * 86400;
    342         }
     339                return ($d > 0) ? ($d - 25569) * 86400 + $t * 86400 : $t * 86400;
     340        }
     341
    343342        function _parse() {
    344343                // Document data holders
    345                 $this->sharedstrings = array();
    346                 $this->sheets = array();
     344                $this -> sharedstrings = array();
     345                $this -> sheets = array();
    347346
    348347                // Read relations and search for officeDocument
    349                 $relations = simplexml_load_string( $this->getEntryData("_rels/.rels") );
     348                $relations = simplexml_load_string($this -> getEntryData("_rels/.rels"));
    350349                foreach ($relations->Relationship as $rel) {
    351350                        if ($rel["Type"] == SimpleXLSX::SCHEMA_OFFICEDOCUMENT) {
    352351                                // Found office document! Read relations for workbook...
    353                                 $workbookRelations = simplexml_load_string($this->getEntryData( dirname($rel["Target"]) . "/_rels/" . basename($rel["Target"]) . ".rels") );
    354                                 $workbookRelations->registerXPathNamespace("rel", SimpleXLSX::SCHEMA_RELATIONSHIP);
    355                                
     352                                $workbookRelations = simplexml_load_string($this -> getEntryData(dirname($rel["Target"]) . "/_rels/" . basename($rel["Target"]) . ".rels"));
     353                                $workbookRelations -> registerXPathNamespace("rel", SimpleXLSX::SCHEMA_RELATIONSHIP);
     354
    356355                                // Read shared strings
    357                                 $sharedStringsPath = $workbookRelations->xpath("rel:Relationship[@Type='" . SimpleXLSX::SCHEMA_SHAREDSTRINGS . "']");
    358                                 $sharedStringsPath = (string)$sharedStringsPath[0]['Target'];             
    359                                 $xmlStrings = simplexml_load_string($this->getEntryData( dirname($rel["Target"]) . "/" . $sharedStringsPath) );           
    360                                 if (isset($xmlStrings) && isset($xmlStrings->si)) {
     356                                $sharedStringsPath = $workbookRelations -> xpath("rel:Relationship[@Type='" . SimpleXLSX::SCHEMA_SHAREDSTRINGS . "']");
     357                                $sharedStringsPath = (string)$sharedStringsPath[0]['Target'];
     358                                $xmlStrings = simplexml_load_string($this -> getEntryData(dirname($rel["Target"]) . "/" . $sharedStringsPath));
     359                                if (isset($xmlStrings) && isset($xmlStrings -> si)) {
    361360                                        foreach ($xmlStrings->si as $val) {
    362                                                 if (isset($val->t)) {
    363                                                         $this->sharedstrings[] = (string)$val->t;
    364                                                 } elseif (isset($val->r)) {
    365                                                         $this->sharedstrings[] = $this->_parseRichText($val);
     361                                                if (isset($val -> t)) {
     362                                                        $this -> sharedstrings[] = (string)$val -> t;
     363                                                } elseif (isset($val -> r)) {
     364                                                        $this -> sharedstrings[] = $this -> _parseRichText($val);
    366365                                                }
    367366                                        }
     
    371370                                foreach ($workbookRelations->Relationship as $workbookRelation) {
    372371                                        if ($workbookRelation["Type"] == SimpleXLSX::SCHEMA_WORKSHEETRELATION) {
    373                                                 $this->sheets[ str_replace( 'rId', '', (string) $workbookRelation["Id"]) ] =
    374                                                         simplexml_load_string( $this->getEntryData( dirname($rel["Target"]) . "/" . dirname($workbookRelation["Target"]) . "/" . basename($workbookRelation["Target"])) );
     372                                                $this -> sheets[str_replace('rId', '', (string)$workbookRelation["Id"])] = simplexml_load_string($this -> getEntryData(dirname($rel["Target"]) . "/" . dirname($workbookRelation["Target"]) . "/" . basename($workbookRelation["Target"])));
    375373                                        }
    376374                                }
    377                                
    378                                 break;
    379                         }
    380                 }
    381                
     375
     376                                break;
     377                        }
     378                }
     379
    382380                // Sort sheets
    383                 ksort($this->sheets);
    384         }
    385     private function _parseRichText($is = null) {
    386         $value = array();
    387 
    388         if (isset($is->t)) {
    389             $value[] = (string)$is->t;
    390         } else {
    391             foreach ($is->r as $run) {
    392                 $value[] = (string)$run->t;
    393             }
    394         }
    395 
    396         return implode(' ', $value);
    397     }
     381                ksort($this -> sheets);
     382        }
     383
     384        private function _parseRichText($is = null) {
     385                $value = array();
     386
     387                if (isset($is -> t)) {
     388                        $value[] = (string)$is -> t;
     389                } else {
     390                        foreach ($is->r as $run) {
     391                                $value[] = (string)$run -> t;
     392                        }
     393                }
     394
     395                return implode(' ', $value);
     396        }
     397
    398398}
    399399?>
Note: See TracChangeset for help on using the changeset viewer.