Anzeige

COM::Excel.application

COM::Excel.application | PSD-Tutorials.de

Erstellt von Christian, 28.07.2008.

  1. Christian

    Christian verpeilt & verschallert

    Dabei seit:
    03.03.2005
    Beiträge:
    853
    Geschlecht:
    männlich
    Kameratyp:
    Canon EOS 300D
    COM::Excel.application
    Huhu,
    2 Fragen hätte ich da:
    1. Gibt es irgendwo einen Überblick der Funktionen dieses Objects? Auch nach längerem Suchen auf der MSDN LIbrary bin ich irgendwie nicht fündig geworden.
    2. Gibt es eine Möglichkeit alle Felder auszulesen, ohne eine manuelle Range anzugeben?

    (hier bisheriges Verfahren meinerseits, was ich relativ "unschön" finde:)
    PHP:
    1. <?
    2.  
    3. /**
    4.  * Class for reading Excel files (Windows && Excel && PHP5 required)
    5.  *
    6.  *
    7.  * @example $ex = new xls_reader("C:\\files\\01600.xls");
    8. $ex->set_read_range("A", "BF"); //equal to: $ex->set_read_range(1, 58);
    9. $ex->set_required_field('A'); // equal to: $ex->set_required_field(1); NOTE: This class reads until the required field is null, then stops
    10. $ex->ignore_lines(1,2,3); // ignores lines 1, 2 an d3
    11. $ex->open();
    12. print_r($ex->read());
    13.  */
    14. class xls_reader {
    15.    
    16.     /**
    17.      * filename
    18.      *
    19.      * @var string (absolute path)
    20.      */
    21.     public $file_name   = NULL;
    22.    
    23.     /**
    24.      * Worksheet ID
    25.      *
    26.      * @var mixed
    27.      */
    28.     public $w_sheet = 1;
    29.    
    30.     /**
    31.      * horizontal read range ( e.g. A -> BG )
    32.      *
    33.      * @var array
    34.      */
    35.     public $read_range  = array();
    36.    
    37.     /**
    38.      * field which is required for a line to be returned
    39.      *
    40.      * @var string
    41.      */
    42.     public $required_field  = NULL;
    43.    
    44.     /**
    45.      * lines to be ignored
    46.      *
    47.      * @var array
    48.      */
    49.     private $ignore_lines   = array();
    50.    
    51.     /**
    52.      * object of COM::Excel.application
    53.      *
    54.      * @var com Object
    55.      */
    56.     protected $xls_handler  = null;
    57.    
    58.     /**
    59.      * object of $xls_handler->Workbook->Open()
    60.      *
    61.      * @var variant Object
    62.      */
    63.     protected $Workbook     = null;
    64.    
    65.     /**
    66.      * the ABC
    67.      *
    68.      */
    69.     const abc   = 'a:26:{i:1;s:1:"A";i:2;s:1:"B";i:3;s:1:"C";i:4;s:1:"D";i:5;s:1:"E";i:6;s:1:"F";i:7;s:1:"G";i:8;s:1:"H";i:9;s:1:"I";i:10;s:1:"J";i:11;s:1:"K";i:12;s:1:"L";i:13;s:1:"M";i:14;s:1:"N";i:15;s:1:"O";i:16;s:1:"P";i:17;s:1:"Q";i:18;s:1:"R";i:19;s:1:"S";i:20;s:1:"T";i:21;s:1:"U";i:22;s:1:"V";i:23;s:1:"W";i:24;s:1:"X";i:25;s:1:"Y";i:26;s:1:"Z";}';
    70.    
    71.     /**
    72.      * Constructor.
    73.      *
    74.      * @param string [optional]$file_name
    75.      */
    76.     public function __construct( $file_name = null )
    77.     {
    78.         if( isset( $file_name ) ):
    79.             $this->file_name    = $file_name;
    80.         endif;
    81.        
    82.     }
    83.    
    84.     /**
    85.      * set filepath
    86.      *
    87.      * @param string $file_name
    88.      */
    89.     public function set_file( $file_name )
    90.     {
    91.         $this->file_name    = $file_name;
    92.     }
    93.    
    94.     /**
    95.      * Enter Range from A - ZZ OR 1 - 702
    96.      *
    97.      * @param mixed $to
    98.      * @param mixed $from
    99.      */
    100.     public function set_read_range( $from, $to )
    101.     {
    102.         $arr    = array( 'from' => $from, 'to'=>$to );
    103.        
    104.         foreach( $arr as $key=>$val ):
    105.             switch( gettype($val) ):
    106.                 case 'integer':
    107.                     $this->read_range[$key] = $val;
    108.                 break;
    109.                 case 'string':
    110.                     $this->read_range[$key] = self::field_to_int($val);
    111.                 break;
    112.             endswitch;
    113.         endforeach;
    114.     }
    115.    
    116.     /**
    117.      * read the given range until EOF
    118.      *
    119.      * @return mixed
    120.      */
    121.     public function read( )
    122.     {
    123.         $ret    = NULL;
    124.        
    125.         if( sizeof($this->read_range) != 2 ):
    126.             die(__CLASS__."::read_range not or incorrect set! (".__FILE__." Zeile: ".__LINE__.")");
    127.         endif;
    128.        
    129.        
    130.         if( $this->Workbook ):
    131.            
    132.             $wsheet = $this->Workbook->Worksheets($this->w_sheet);
    133.             $wsheet->activate;
    134.            
    135.             $value_ok   = true;
    136.             $line       = 1;
    137.            
    138.             while( $value_ok == true ):
    139.            
    140.                 if( !array_key_exists($line, $this->ignore_lines) ):
    141.                     $arrValues  = null;
    142.                
    143.                     for( $i = $this->read_range['from']; $i <= $this->read_range['to']; $i++ ):
    144.                         $field_id   = self::int_to_field( $i ).$line;
    145.                         $arrValues[]    = $wsheet->Range( $field_id )->value;
    146.                     endfor;
    147.                    
    148.  
    149.                     if( strlen( $wsheet->Range($this->required_field.$line)->value ) > 0 ){
    150.                         $ret[]  = $arrValues;
    151.                     }else{
    152.                         $value_ok = false;
    153.                     }
    154.                 endif;
    155.                
    156.                 $line++;
    157.                
    158.             endwhile;
    159.        
    160.         endif;
    161.        
    162.         $this->Workbook->Close;
    163.         unset($this->Workbook);
    164.        
    165.         return $ret;
    166.        
    167.     }
    168.    
    169.     /**
    170.      * open XLS file
    171.      *
    172.      */
    173.     public function open( )
    174.     {
    175.         if( $this->file_name ):
    176.             $this->xls_handler = new COM("Excel.application") or die(' Konnte COM::Excel.application nicht instanziieren!');
    177.             $this->Workbook = $this->xls_handler->Workbooks->Open($this->file_name) or die("Konnte {$this->file_name} nicht oeffnen!");
    178.         endif;
    179.     }
    180.    
    181.     /**
    182.      * array with lines to be ignored
    183.      *
    184.      * @param mixed $arr_lines
    185.      * @return boolean
    186.      */
    187.     public function ignore_lines( )
    188.     {
    189.         $arr_lines  = func_get_args();
    190.        
    191.         foreach( $arr_lines as $line ){
    192.             $ret[$line] = 1;
    193.         }
    194.        
    195.         $this->ignore_lines = $ret;
    196.        
    197.         return true;
    198.     }
    199.    
    200.     /**
    201.      * set a field which is required for each line to appear in the result ( string or integer )
    202.      *
    203.      * @param mixed $to
    204.      */
    205.     public function set_required_field( $to ){
    206.         switch( gettype( $to ) ):
    207.             case 'integer':
    208.                 $this->required_field   = self::int_to_field( $to );
    209.             break;
    210.             case 'string':
    211.                 $this->required_field   = $to;
    212.             break;
    213.         endswitch;
    214.     }
    215.    
    216.     /**
    217.      * Close actual XLS-file
    218.      *
    219.      */
    220.     public function close()
    221.     {
    222.         if( $this->xls_handler ):
    223.             $this->xls_handler->Workbooks->Close();
    224.         endif;
    225.     }
    226.    
    227.     /**
    228.      * Destroy COM::Excel.application object
    229.      *
    230.      */
    231.     public function __destruct()
    232.     {
    233.         if($this->xls_handler)
    234.         {
    235.             $this->xls_handler->Quit();
    236.         }
    237.         $this->xls_handler  = null;
    238.     }
    239.    
    240.     ////////////////////////////////////////////////////////////////
    241.     ///////                 PUBLIC STATICs                  ////////
    242.     ////////////////////////////////////////////////////////////////
    243.    
    244.     /**
    245.      * convert an int to a Fielddefinition
    246.      * ( from A to ZZ )
    247.      *
    248.      * @param int $int
    249.      * @return string
    250.      */
    251.     public static function int_to_field( $int )
    252.     {
    253.         if( $int > 702 ):// 26²+26=702 -> Feld ZZ
    254.             return false;
    255.         endif;
    256.        
    257.         //Buchstaben des Alphabets
    258.         $abc    = un******ize(self::abc);  
    259.         $prefix = null;
    260.        
    261.         //1. Buchstabe horizontale Auflösung
    262.         if($int > 26):
    263.             $prefix = ( floor( ($int-1) / 26 ) <= 0)?1:floor( ($int-1) / 26 );
    264.         endif;
    265.  
    266.         //2. Buchstabe horizontale Auflösung
    267.         $main_char  = ((($int%26))<=0)?26:($int%26);
    268.        
    269.         if( $prefix > 26 ):
    270.             $abc_prefix = self::int_to_field( $prefix );
    271.         endif;
    272.        
    273.         $return = null;
    274.         if( isset( $abc[$prefix] ) || isset( $abc_prefix ) ):
    275.             $return .= (isset($abc_prefix)?$abc_prefix:$abc[$prefix]);
    276.         endif;
    277.        
    278.         $return .= $abc[$main_char];#Den gibts aufjedenfall, daher auch keine isset-überprüfung
    279.        
    280.  
    281.         return $return;
    282.     }
    283.    
    284.    
    285.     /**
    286.      * Reverse to xls_reader::int_to_field
    287.      *
    288.      * @param string $field_name
    289.      * @return int
    290.      */
    291.     public static function field_to_int( $field_name )
    292.     {
    293.         $reverse_abc    = self::abc_reverse();
    294.         $field_name = preg_replace("§[^a-z]§i",'',$field_name);
    295.        
    296.         switch( true ):
    297.        
    298.             case ( strlen( $field_name ) > 2 || strlen( $field_name ) == 0 ):
    299.                 return -1;
    300.             break;
    301.            
    302.             case ( strlen( $field_name ) == 2 ):
    303.                 $high_val   = $reverse_abc[$field_name[0]]*26;
    304.                 return $high_val+$reverse_abc[$field_name[1]];
    305.             break;
    306.            
    307.             default:
    308.                 return $reverse_abc[$field_name];
    309.             break;
    310.         endswitch;
    311.     }
    312.    
    313.     /**
    314.      * reverse elements & keys from self::abc
    315.      *
    316.      * @return array
    317.      */
    318.     public static function abc_reverse( )
    319.     {
    320.         $abc    = un******ize(self::abc);
    321.        
    322.         foreach( $abc as $key => $val ):
    323.             $_temp[$val]    = $key;
    324.         endforeach;
    325.        
    326.         return $_temp;
    327.     }
    328. }
    329. ?>
    330.  
     
    #1      
x
×
×
teststefan