Como ler aquivos do excel com php

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);  

Publicado por

adlerdias

Oi! Sou Adler Dias, 30, programador, trabalho com desenvolvimento de sistemas há 10 anos. Apaixonado pela minha namorada Alyne. Meu principal hobby é a corrida, já corri uma são silvestre e...

51 comentários em “Como ler aquivos do excel com php”

  1. olá,
    eu fiz passo a passo os códigos mas na hora de aparecer em pagina html ele não imprime a tabela só fica mostrando os códigos, o que pode ser que fiz errado?

          1. Boa tarde,
            Você instalou a bliblioteca utilizando o composer?

            Caso já tenha instalado, troque a linha:
            require_once “vendor/autoload.php”;

            por:
            require_once DIR . ‘/vendor/autoload.php’;

          2. mudei, mas continua dando esse erro(erro abaixo traduzido)
            Aviso: require_once (C: xampp htdocs / vendor / autoload.php): falha ao abrir fluxo: Nenhum arquivo ou diretório em C: xampp htdocs import.php na linha 2

            Erro fatal: require_once (): Falha na abertura necessária ‘C: xampp htdocs / vendor / autoload.php’ (include_path = ‘C: xampp php PEAR’) em C: xampp htdocs import.php on linha 2

          3. Bom dia,
            o seu arquivo import.php está dentro da pasta vendor, e deve estar uma pasta acima. A não ser que você esteja desenvolvendo alguma aplicação compatível com a PSR, você raramente vai adicionar algum arquivo manualmente dentro da pasta vendor.

          4. Bom dia,
            Tanto o arquivo composer.json quanto a pasta vendor não existem nesse diretório, por isso não estão sendo encontrados.

          5. bom dia,
            o arquivo que você está tentando abrir não existe, no caso cliente.xml. Porém, essa biblioteca é utilizada para arquivos xls/xlsx e etc. O php possui funções nativas para xml.

          6. ah sim, mas não tem aquela linha que identifica automaticamente o tipo de tabela que é?

          7. Boa Tarde, não teria como arrumar isso não, para que aparecesse a tabela toda certinha?

          8. Boa Tarde, essa pagina não está disponível, teria outra para me passar, que faça melhor isso ?

          9. Boa tarde,
            não encontrei uma informação que fique clara, como irei fazer isso, poderia fazer um tutorial completo?
            Complementando esse seu que é ótimo, só falta ensinar a como imprimir a tabela adequadamente na pagina.

            Grata !!

          10. Boa tarde,
            Não é possível fazer um tutorial tão genérico, pois vai depender de cada arquivo do excel. Afinal cada arquivo do excel vai se tornar um array diferente.
            Por exemplo:
            “teste 1”, “numero”=>7.50 , “id”=>15],
            [“title”=>”teste 2”, “numero”=>4.30 , “id”=>25],
            [“title”=>”teste 3”, “numero”=>3.15 , “id”=>7]
            ];
            ?>

            &lt;?php echo implode('', $row); ?&gt;

          11. Bom Dia,

            Será que teria outras maneiras de imprimir uma tabela excel em html, de uma forma mais fácil, sem precisar mexer com os arrays?

          12. Bom dia,

            tente algo assim:

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

            $fileName = "teste.xlsx";

            $excelReader = PHPExcel_IOFactory::createReaderForFile($fileName);

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

            $objWriter = PHPExcel_IOFactory::createWriter($excelObj, 'HTML');
            $objWriter->writeAllSheets();
            $objWriter->save('php://output');

            não se esqueça de mudar o conteúdo da variável $fileName para o nome do seu arquivo.

          13. No php pra ter um grid desse jeito teria que ser programando mesmo, não ficaria pronto “magicamente” como no dotnet

          14. Boa Tarde,
            agora ele apresenta erro nessa linha aqui:
            require_once “vendor/autoload.php”;

    1. Boa Tarde,

      Usei o Datagridview.
      Coloquei desde o começo para você entender direitinho…
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      using System.IO;
      using System.Data.OleDb;

      namespace projeto2

      {
      public partial class Form1 : Form
      {
      public Form1()
      {
      InitializeComponent();

      }

      private string Excel03ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'";
      private string Excel07ConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'";
      private object dt;

      private void Form1_Load(object sender, EventArgs e)
      {

      }

      private void btnselect_Click(object sender, EventArgs e)
      {
      openFileDialog1.ShowDialog();
      }

      private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
      {
      string filePath = openFileDialog1.FileName;
      string extension = Path.GetExtension(filePath);
      string header = rbdsim.Checked ? "YES" : "NO";
      string conStr, sheetName;

      conStr = string.Empty;
      switch (extension)
      {

      case ".xls": //Excel 97-03
      conStr = string.Format(Excel03ConString, filePath, header);
      break;

      case ".xlsx": //Excel 07
      conStr = string.Format(Excel07ConString, filePath, header);
      break;
      }

      //Get the name of the First Sheet.
      using (OleDbConnection con = new OleDbConnection(conStr))
      {
      using (OleDbCommand cmd = new OleDbCommand())
      {
      cmd.Connection = con;
      con.Open();
      DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
      sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
      con.Close();
      }
      }

      //Read Data from the First Sheet.
      using (OleDbConnection con = new OleDbConnection(conStr))
      {
      using (OleDbCommand cmd = new OleDbCommand())
      {
      using (OleDbDataAdapter oda = new OleDbDataAdapter())
      {
      DataTable dt = new DataTable();
      cmd.CommandText = "SELECT * From [" + sheetName + "]";
      cmd.Connection = con;
      con.Open();
      oda.SelectCommand = cmd;
      oda.Fill(dt);
      con.Close();

      //Populate DataGridView.
      dataGridView1.DataSource = dt;
      }
      }
      }
      }

      Ai no caso eu queria fazer um button para verificar a existência de linhas iguais na coluna código como tinha te informado, ai na hora que o usuário apertasse esse button ele imitisse tipo um messagem.box informando que existe a linha duplicada e em qual item ela se encontra

      1. Boa tarde,

        tenta algo assim mulher


        for (int linhaAtual = 0; linhaAtual < dataGridView1.Rows.Count - 1; linhaAtual++)
        {
        DataGridViewRow rowToCompare = dataGridView1.Rows[linhaAtual];
        for (int proximaLinha = linhaAtual + 1; proximaLinha < dataGridView1.Rows.Count; proximaLinha++)
        {
        DataGridViewRow row = dataGridView1.Rows[proximaLinha];

        if (!rowToCompare.Cells[&quot;OBRIGATORIO&quot;].Value.Equals(row.Cells[&quot;OBRIGATORIO&quot;].Value))
        {
        break;
        }

        rowToCompare.DefaultCellStyle.BackColor = Color.Yellow;
        rowToCompare.DefaultCellStyle.ForeColor = Color.Black;
        row.DefaultCellStyle.BackColor = Color.Yellow;
        row.DefaultCellStyle.ForeColor = Color.Black;
        }

        }

          1. Bom Dia,
            Acho que não ira precisar, pois funcionou o seu código, só tem mais uma coisinha que eu gostaria de ajudar, e se você poder ajudar ficarei muito grata .]

            É o seguinte o negocio da cor funcionou bacana, só que além da cor eu precisava que emitisse um messagemBox.Show dizendo qual produto(descrição), ncm, naladi e a referencia se repetem e se não houvesse valores iguais que aparecesse um mensagem dizendo que não há duplicadas na tabela referente . Como Ficaria isso ? https://uploads.disquscdn.com/images/469159a71f5b6115f8a1ca6e0a79483b4e16fecf7566a3b6419d3538b60bedf1.png

          2. Bom Dia,

            Por Favor da uma olhada porque eu coloquei aqui mais linhas repetidas e ele não ficou amarelo, segue um print que mostra melhor isso..
            Codigo do button….
            private void btndublicidade_Click(object sender, EventArgs e)
            {
            for (int linhaAtual = 0; linhaAtual < dataGridView1.Rows.Count – 1; linhaAtual++)
            {
            DataGridViewRow rowToCompare = dataGridView1.Rows[linhaAtual];
            for (int proximaLinha = linhaAtual + 1; proximaLinha < dataGridView1.Rows.Count; proximaLinha++)
            {
            DataGridViewRow row = dataGridView1.Rows[proximaLinha];

            bool duplicateRow = true;
            if (!rowToCompare.Cells["NCM"].Value.Equals(row.Cells["NCM"].Value))
            {
            break;

            }

            rowToCompare.DefaultCellStyle.BackColor = Color.Green;
            rowToCompare.DefaultCellStyle.ForeColor = Color.Black;
            row.DefaultCellStyle.BackColor = Color.Yellow;
            row.DefaultCellStyle.ForeColor = Color.Black;

            }
            }

            }

          3. Bom Dia,

            Tenta assim, o código abaixo está sem a asinatura do método, então é só o corpo do método


            for (int linhaAtual = 0; linhaAtual < dataGridView1.Rows.Count - 1; linhaAtual++)
            {
            bool duplicateRow = false;
            System.Text.StringBuilder linhasDuplicadas = new System.Text.StringBuilder();

            DataGridViewRow rowToCompare = dataGridView1.Rows[linhaAtual];
            for (int proximaLinha = linhaAtual + 1; proximaLinha &lt; dataGridView1.Rows.Count; proximaLinha++)
            {
            DataGridViewRow row = dataGridView1.Rows[proximaLinha];

            if (!rowToCompare.Cells[&quot;NCM&quot;].Value.Equals(row.Cells[&quot;NCM&quot;].Value))
            {
            rowToCompare.DefaultCellStyle.BackColor = Color.Green;
            rowToCompare.DefaultCellStyle.ForeColor = Color.Black;
            break;
            }
            duplicateRow = true;
            linhasDuplicadas.AppendLine(rowToCompare.Cells[&quot;NCM&quot;].Value);
            rowToCompare.DefaultCellStyle.BackColor = Color.Yellow;
            rowToCompare.DefaultCellStyle.ForeColor = Color.Black;
            row.DefaultCellStyle.BackColor = Color.Yellow;
            row.DefaultCellStyle.ForeColor = Color.Black;
            }
            if (duplicateRow)
            {
            MessageBox.Show(linhasDuplicadas.ToString());
            }

            }

          4. Bom Dia,
            Faltou o .ToString(). rowToCompare.Cells[“NCM”].Value.ToString()


            for (int linhaAtual = 0; linhaAtual < dataGridView1.Rows.Count - 1; linhaAtual++)
            {
            bool duplicateRow = false;
            System.Text.StringBuilder linhasDuplicadas = new System.Text.StringBuilder();

            DataGridViewRow rowToCompare = dataGridView1.Rows[linhaAtual];
            for (int proximaLinha = linhaAtual + 1; proximaLinha &lt; dataGridView1.Rows.Count; proximaLinha++)
            {
            DataGridViewRow row = dataGridView1.Rows[proximaLinha];

            if (!rowToCompare.Cells[&quot;NCM&quot;].Value.Equals(row.Cells[&quot;NCM&quot;].Value))
            {
            rowToCompare.DefaultCellStyle.BackColor = Color.Green;
            rowToCompare.DefaultCellStyle.ForeColor = Color.Black;
            break;
            }
            duplicateRow = true;
            linhasDuplicadas.AppendLine(rowToCompare.Cells[&quot;NCM&quot;].Value.ToString());
            rowToCompare.DefaultCellStyle.BackColor = Color.Yellow;
            rowToCompare.DefaultCellStyle.ForeColor = Color.Black;
            row.DefaultCellStyle.BackColor = Color.Yellow;
            row.DefaultCellStyle.ForeColor = Color.Black;
            }
            if (duplicateRow)
            {
            MessageBox.Show(linhasDuplicadas.ToString());
            }

            }

          5. Boa Tarde,
            Tudo funcionando ok, Muito Obrigada !!!
            Agora vou pra outra parte do projeto qualquer coisa peço sua ajuda de novo, pois ela foi de grande valia

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax