Ler arquivos do Excel com PHP pode ser complicado, mas felizmente há uma grande biblioteca que torna essa tarefa muito mais fácil: PHPExcel. Nesse post vamos ver como utilizar o PHPExcel para converter as planilhas do excel em arrays e usar os dados em PHP.

Instalando o PHPExcel

O primeiro passo para trabalhar com documentos do Excel no PHP será instalar a biblioteca PHPExcel. Eu vou fazer isso utilizando o composer. Se você ainda não está familiarizado com composer, você definitivamente deve ter um olhar para ele e usá-lo para gerenciar as dependências do seu projeto. O arquivo composer.json é extremamente simples:

{
 "require":
   {
      "phpoffice/phpexcel": "dev-develop"
   }
}

Então você precisa para instalar as dependências com o composer, o que pode demorar alguns segundos para completar:

composer install  

Você vai notar que a biblioteca foi baixada e instalada no diretório project_root/vendor/phpoffice/phpexcel juntamente com o diretório project_root/vendor/composer e um arquivo project_root/vendor/autoload.php que foi gerado automaticamente para gerenciar o autoloading das classes para a biblioteca.

Carregando o arquivo no PHPExcel

Há duas maneiras básicas para carregar o arquivo no PHPExcel. Você pode especificar um dos tipos de arquivos suportados manualmente ou você pode deixar a biblioteca determinar o tipo de arquivo automaticamente com base no arquivo que você fornece. Aqui está o código necessário para ambos e uma lista dos tipos de arquivos suportados que você pode escolher se você decidir definir explicitamente o tipo de arquivo:

<?php  
require_once "vendor/autoload.php";

$fileName = "exemplo.xlsx";

/** detecta automaticamente o tipo de arruivo que será carregado */
$excelReader = PHPExcel_IOFactory::createReaderForFile($fileName);

/** Definindo manualmente.
// $inputFileType = 'Excel5';
// $inputFileType = 'Excel2007';
// $inputFileType = 'Excel2003XML';
// $inputFileType = 'OOCalc';
// $inputFileType = 'SYLK';
// $inputFileType = 'Gnumeric';
// $inputFileType = 'CSV';
$excelReader = PHPExcel_IOFactory::createReader($inputFileType);
*/

Definir as opções de leitura

Não vou entrar em muitos detalhes sobre as diferentes opções que você pode usar, porque eles são muito poucos, mas é importante exemplificar as mais comuns e úteis.

//Se não precisarmos de formatação
$excelReader->setReadDataOnly();

//carregar apenas algumas abas
$loadSheets = array('aba1', 'aba2');
$excelReader->setLoadSheetsOnly($loadSheets);

//o comportamente padrão é carregar todas as abas
$excelReader->setLoadAllSheets();

Estes são bastante simples. Certifique-se que você só carregar as abas de que você precisa para usar uma vez que a biblioteca pode usar uma grande quantidade de memória especialmente para arquivos grandes. Além disso, o método setReadDataOnly ajuda a acelerar as coisas um pouco por carregar apenas os dados das células, sem qualquer formatação especial do excel. Você tem que estar ciente de que embora qualquer formatação de data será perdida se você usar essa opção e as datas serão carregados como números, sem formatação.

Carregar e exibir os dados

O passo final é para carregar os dados do Excel para o PHP.

$excelObj = $excelReader->load($fileName);

Isto produzirá um objeto PHPExcel, mas, a fim de modificar e transformar os dados para atender às nossas necessidades o seu melhor para convertê-lo em um array facilmente.

$excelObj->getActiveSheet()->toArray(null, true,true,true);

Tenha em mente que PHPExcel só vai exibir as informações sobre a folha ativa no momento, que é o último a ser carregado. No entanto, você pode alternar manualmente entre as folhas e obter o seu conteúdo ou você pode automatizar o processo e obter todas as folhas como um array:

//Pega os nomes das abas
$worksheetNames = $excelObj->getSheetNames($fileName);
$return = array();
foreach($worksheetNames as $key => $sheetName){  
//define a aba ativa
$excelObj->setActiveSheetIndexByName($sheetName);
//cria um array com o nome da aba como índice
$return[$sheetName] = $excelObj->getActiveSheet()->toArray(null, true,true,true);
}
//exibe o array
var_dump($return);