Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/10/2012, 15:36
Avatar de portalmana
portalmana
 
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Información [APORTE] Convertir Excel a un Array

Les dejo una clase que sirve para convertir un archivo Excel en un arreglo que podremos manipular.
Si bien no deberían ir en esta clase la parte de manejos de Arreglos se los dejo aqui para que tengan una mejor idea de como se puede utilizar.

Consideraciones:
Tener en cuenta que como carga el Excel a un Arreglo no es recomendable para archivos excel de muchos datos.
Los datos deben comenzar en la Columna A – Fila 1
El archivo excel deberá contener en la primera fila los encabezados o títulos y de ser posible se deberá otorgar una columnas en donde sus datos sean únicos (no se repitan), que serán usados como claves.
La mas importante de todas es que hace uso de la Libreria PHPExcel de Codeplex, por lo cual deberan hacer los requiere correspondientes.

Ahora un poco de codigo:
Código PHP:
Ver original
  1. <?php
  2. // Lanza todos los errores
  3. error_reporting(E_ALL  | E_STRICT);
  4. // Tiempo ilimitado para el script
  5.  
  6. require_once 'PHPExcel/Classes/PHPExcel.php';
  7. require_once 'PHPExcel/Classes/PHPExcel/IOFactory.php';
  8.  
  9. class ExcelToArray
  10. {
  11.     /**
  12.      * Contiene Las Extenciones Permitidas para Excel.
  13.      * @var Array
  14.      */
  15.     private $_tipoExcel = array('xlsx'  => 'Excel2007',
  16.                                 'xls'   => 'Excel5');
  17.    
  18.     /**
  19.      * Contiene la Cantidad de Columnas del Archivo Excel.
  20.      * @var integer
  21.      */
  22.     private $_columnas  = 0;
  23.    
  24.     /**
  25.      * Contiene la Cantidad de Filas del Archivo Excel.
  26.      * @var integer
  27.      */
  28.     private $_filas     = 0;
  29.    
  30.     /**
  31.      * Contiene el Titulo que sera el Identificador.
  32.      * @var string
  33.      */
  34.     private $_id;
  35.    
  36.     /**
  37.      * Contiene el Arreglo Generado a partir del Excel.
  38.      * @var array
  39.      */
  40.     private $_excel     = array();
  41.    
  42.     /**
  43.      * Contiene los Encabezados del Archivo Excel.
  44.      * @var array
  45.      */
  46.     private $_titulos   = array();
  47.    
  48.     /**
  49.      * Contiene la ruta y nombre del Archivo.
  50.      * @var type
  51.      */
  52.     private $_file;
  53.    
  54.     /**
  55.      * Contiene el Tipo del Archivo Excel para PHPExcel.
  56.      * @var string
  57.      */
  58.     private $_tipoPHPExcel;
  59.    
  60.     /**
  61.      * Constructor de Clase.
  62.      * @param   string  $file   Ruta y nombre del Archivo.
  63.      * @throws  Exception       Lanza exepcion si el archivo no existe o si,
  64.      *                          no es de una extencion valida.
  65.      */
  66.     public function __construct($file)
  67.     {
  68.         if (!file_exists($file)) {
  69.             throw new Exception('Error : El archivo no pudo ser Encontrado');
  70.         }
  71.        
  72.         $this->_file= $file;
  73.         $ext        = substr(strrchr($file, '.'), 1);
  74.        
  75.         if (!isset($this->_tipoExcel[$ext])) {
  76.             throw new Exception('Error : El archivo no es de un tipo Valido');
  77.         }
  78.         $this->_tipoPHPExcel    = $this->_tipoExcel[$ext];
  79.        
  80.     }
  81.  
  82.     /**
  83.      * Carga la Hoja Excel y Retorna el Arreglo.
  84.      * @param string $id    Contiene el nombre del encabezado que sera tomado como Id.
  85.      *                      Si no se proporciona o no existe sera la primera columnas.
  86.      * @return array
  87.      */
  88.     public function loadExcel($id = '')
  89.     {
  90.         // Creo un objeto de Lectura con el tipo de Archivo Correcto Excel20007(xlsx), Excel5(xls)
  91.         $objReader  = PHPExcel_IOFactory::createReader($this->_tipoPHPExcel);
  92.         // Configuro que sera solo para leer el archivo
  93.         $objReader  ->setReadDataOnly(true);
  94.         // Cargo el Archivo
  95.         $objPHPExcel    = $objReader->load($this->_file);
  96.         $objWorksheet   = $objPHPExcel->getActiveSheet();
  97.         $this->_columnas= PHPExcel_Cell::columnIndexFromString($objWorksheet->getHighestColumn());
  98.         $this->_filas   = $objWorksheet->getHighestRow();
  99.    
  100.         // Extraigo los Titulos
  101.         for ($i=0; $i<= $this->_columnas-1; $i++) {
  102.             $this->_titulos[$i] = $objWorksheet->getCellByColumnAndRow($i, 1)->getCalculatedValue();
  103.         }
  104.         // Verifica el Campo Identificador
  105.         $this->_id      = (in_array($id, $this->_titulos))? $id : $this->_titulos[0];
  106.        
  107.         // Levanto todos los Datos
  108.         for ($fila = 2; $fila <= $this->_filas; $fila++) {
  109.             $dFilas = array();
  110.             for ($columna = 0; $columna <= $this->_columnas-1; $columna++) {
  111.                 $dFilas[$this->_titulos[$columna]] =
  112.                         $objWorksheet->getCellByColumnAndRow($columna, $fila)->getCalculatedValue();
  113.             }
  114.             $this->_excel[$dFilas[$this->_id]] = $dFilas;
  115.         }
  116.        
  117.         return $this->_excel;
  118.     }
  119.    
  120.     /**
  121.      * Retorna el Campo seleccionado como Identificador.
  122.      * @return string
  123.      */
  124.     public function getId()
  125.     {
  126.         return $this->_id;
  127.     }
  128.    
  129.     /**
  130.      * Retorna la Cantidad de Columnas del Archivo Excel.
  131.      * @return integer
  132.      */
  133.     public function countColumns()
  134.     {
  135.         return $this->_columnas;
  136.     }
  137.    
  138.     /**
  139.      * Retorna la Cantidad de Filas del Archivo Excel.
  140.      * @return integer
  141.      */
  142.     public function countRows()
  143.     {
  144.         return $this->_filas;
  145.     }
  146.    
  147.     /**
  148.      * Retorna si una Columna Existe o no.
  149.      * @param   string  $nombreColumna  Nombre de la columna.
  150.      * @return  boolean
  151.      */
  152.     public function isColumn($nombreColumna)
  153.     {
  154.         return isset($this->_titulos[$nombreColumna]);
  155.     }
  156.    
  157.     /**
  158.      * Retorna el Arreglo Generado.
  159.      * @return array
  160.      */
  161.     public function getArray()
  162.     {
  163.         return $this->_excel;
  164.     }
  165.    
  166.     /**
  167.      * Retorna el registro para el id establecido.
  168.      * @param   string  $id     Nombre del Identificador.
  169.      * @return  array
  170.      */
  171.     public function findId($id)
  172.     {
  173.         $retorno    = false;
  174.         if (isset($this->_excel[$id])) {
  175.             $retorno = $this->_excel[$id];
  176.         }
  177.        
  178.         return $retorno;
  179.     }
  180.    
  181.     /**
  182.      * Retorna un arreglo con el valor buscado en la columna indicada.
  183.      * Busqueda Exacta.
  184.      * @param   string  $titulo     Titulo de la Columna
  185.      * @param   string  $valor      Valor a buscar
  186.      * @return  array
  187.      */
  188.     public function findByColumn($titulo, $valor)
  189.     {
  190.        return $this->_search($this->_excel, $titulo, $valor);
  191.     }
  192.    
  193.     /**
  194.      * Extraida de :
  195.      * @link http://php.net/manual/es/function.array-search.php
  196.      */
  197.     private function _search($array, $key, $value)
  198.     {
  199.         $results = array();
  200.         if (is_array($array)) {
  201.             if (isset($array[$key]) && $array[$key] == $value ) {
  202.                 $results[] = $array;
  203.             }  
  204.             foreach ($array as $subarray) {
  205.                 $results = array_merge($results, $this->_search($subarray, $key, $value));
  206.             }  
  207.         }
  208.         return $results;
  209.     }  
  210.  
  211.     /**
  212.      * Retorna un arreglo con el valor buscado en la columna indicada o no y la cantidad
  213.      * de veces que aparece el valor en las columnas si no se indica la misma.
  214.      * La busqueda es por valor aproximado.
  215.      * @param   string  $buscar     Valor a Buscar
  216.      * @param   string  $calve      Titulo de La columna donde se buscara o nada por Cualquiera.
  217.      * @return  array
  218.      */
  219.     public function findByCount($buscar, $titulo = null)
  220.     {
  221.         return $this->_recursiveArraySearchAll($this->_excel, $buscar, $titulo);
  222.     }
  223.    
  224.     /**
  225.      * Extraida de :
  226.      * @link http://php.net/manual/es/function.array-search.php
  227.      */        
  228.     private function _recursiveArraySearchAll($haystack, $needle, $index = null)
  229.     {
  230.         $arrIterator    = new RecursiveArrayIterator($haystack);
  231.         $recIterator    = new RecursiveIteratorIterator($arrIterator);
  232.         $resultkeys     = array();
  233.                      
  234.         while($recIterator->valid()) {
  235.             if (!is_array($recIterator->current())) {
  236.                 if ((isset($index) AND $recIterator->key() == $index  AND strpos($recIterator->current(), $needle) !== false )
  237.                     OR (!isset($index) AND strpos($recIterator->current(), $needle) !== false)) {
  238.                    
  239.                     $resultkeys[$arrIterator->key()] = isset($resultkeys[$arrIterator->key()])?  $resultkeys[$arrIterator->key()] + 1 : 1;
  240.                 }
  241.             }            
  242.             $recIterator->next();
  243.         }
  244.         arsort($resultkeys);
  245.         return $resultkeys;              
  246.     }    
  247.    
  248.    
  249.     /**
  250.      * Metodo ordenar.
  251.      * Ordena los resultados de acuerdo a la clave elegida.
  252.      * @param   string  $clave  Clave por la cual se quiere ordenar(titulo de columna).
  253.      * @param   boolean $asc    true para ascendente, false para descendente.
  254.      * @return  array
  255.      */
  256.     public function sort($campo = 'name', $asc = true)
  257.     {
  258.         if (empty($this->_excel)) {
  259.             throw new Exception('Primero debe usar la funcion loadExcel');
  260.         }
  261.  
  262.         $ordenarPor = (in_array($campo, $this->_titulos))? $campo : $this->_id;
  263.         $ascDesc    = ($asc)? SORT_ASC : SORT_DESC;
  264.         $caracter   = 0;
  265.  
  266.         foreach ($this->_excel as $ordenado) {
  267.             $tmpArray[] = $ordenado[$ordenarPor];
  268.             $caracter   = is_string($ordenado[$ordenarPor])? $caracter+1 : $caracter;
  269.         }
  270.        
  271.         $numero     = ($caracter)? SORT_STRING : SORT_NUMERIC;
  272.  
  273.         array_multisort($tmpArray, $ascDesc, $numero, $this->_excel);
  274.         return $this->_excel;
  275.     }      
  276. }
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp