Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

The_Fury

Exportando para um arquivo Excel

Recommended Posts

Boa tarde galera!

 

Dei uma pesquisada no fórum sobre exportações para excel utilizando o PHP e achei várias coisas, mas em todos os casos gera-se um arquivo xls/csv/etc.

 

O que eu quero? Gostaria de saber como abrir um arquivo do excel pelo php, que já tenha coisas escritas, e escrever em células que eu especifique.

 

Eu quero fazer isso direto de um formulário html!

 

Desde já agradeço a quem puder me ajudar!

 

(Eu sou novato no php)

 

Abração

Compartilhar este post


Link para o post
Compartilhar em outros sites

Suba o arquivo para o seu servidor através de um campo file.

 

move_uploaded_file()

 

http://br2.php.net/manual/en/function.move-uploaded-file.php

 

Utilize a função para abrir o arquivo

 

fopen()

 

http://br2.php.net/manual/en/function.fopen.php

 

Utilize a função para ler conteído do arquivo, ou retornar as linhas

 

fread()
fgets()

 

http://br2.php.net/manual/en/function.fread.php

 

http://br2.php.net/manual/en/function.fgets.php

 

Utilize a função para fechar o arquivo

 

fclose()

 

http://br2.php.net/manual/en/function.fclose.php

 

E se quiser, a função para excluir o arquivo do seu servidor depois de lido.

 

unlink()

 

http://br2.php.net/manual/en/function.unlink.php

 

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem.. o que eu entendi é que essa é a parte que eu consigo usar um arquivo que já tenha coisas dentro dele (e já, já vou testar).

 

Mas como eu faço pra escrever numa célula específica do excel?

 

Agradeço aí pela resposta. ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ver se intendi, você quer usar um formulário para exportar um arquivo excel isso?

 

Então você faz uma pageX.php com um formulário com action para a pageY.php

 

No header da pageY.php você escreve o seguinte:

 

<?php
header('Content-type: application/Octet-stream');
header('Content-Disposition: attachment; filename="nomedoarquivo.csv"');
?>

 

Use extensão CSV para o excel interpetrar que a cada ; ele deverá mudar de celula.

 

o que vem seguinte é o conteúdo que você quer escrever.

 

Exemplo

 

<?php
$line = "Nome;".$_POST['nome']."\n"; // use \n para pular linha
echo $line;
?>

 

Isso ira imprimir no A1 "Nome" e no B1 "nomePassadoPorParametro";

 

Nada de impede de botar o line dentro de um foreach ou até de usar uma conexão de banco.

Com esse cabeçalho, todo o echo vai aparecer no arquivo.

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peço perdão pela demora na resposta.

 

Meu amigo, espero que você não fique com raiva de mim se eu ainda perguntar assim: Existe algum meio de eu escolher a célula exata em que eu queira escrever?

 

Por exemplo, colocar uma linha de código em que eu possa escrever diretamente "nomedapessoa" na célula F22.

 

Pelo que eu entendi.. com esse código aqui:

<?php
$line = "Nome;".$_POST['nome']."\n"; // use \n para pular linha
echo $line;
?>

 

Eu teria que colocar vários "\n" se eu quisesse chegar na linha 22, por exemplo.

 

E a cada ";" ele muda de coluna num arquivo CSV? (É isso?)

 

Agradeço aí mais uma vez a ajuda e peço desculpas (de novo) pela demora na resposta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo,

 

sem problemas. Não sei se existe um jeito mais facil mas esse é um jeito que eu sei que funciona.

 

Eu teria que colocar vários "\n" se eu quisesse chegar na linha 22, por exemplo.

 

E a cada ";" ele muda de coluna num arquivo CSV? (É isso?)

 

Exatamente, com 22 "\n" você chega na linha 22, e com 7 ";" na linha H. Mas porque 7 e não 8? porque funciona assim:

 

A1;B1;C1;D1;E1;F1;G1;H1\n
A2;B2;C2;D2;E2;F2;G2;H2\n
A3;B3;C3;D3;E3;F3;G3;H3\n
.
.
.

 

 

espero ter ajudado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahh.. sim! Legal, legal! :grin:

 

E eu disse antes do formulário.. mas acho que não me expressei muito bem.

 

Uma pessoa qualquer vai entrar no site fazer seu cadastro e clicar no botão "enviar".

 

Eu sei como colocar o php pra fazer um envio de texto comum para um email, mas com um arquivo em anexo não imagino como. Poderia me ajudar?

 

Bom.. essa aqui eu achei no próprio fórum:

 

Link: http://forum.imasters.com.br/topic/440892-anexo-vazio-em-funcao-mail/

 

Código:

<?php
/**
*  Enviar e-mails com ou sem anexos
*  PHP >= 5.3.0, PECL fileinfo >= 0.1.0
*  @param array $contents Um array associativo com as informações
*  @example:
*  <code>
*  send_mail( 
*      array( 
*          'from' => 'fulano@hotmail.com',
*          'to' => array( 
*              'ciclano@hotmail.com', 
*              'amigo1@gmail.com' 
*          ),
*          'message' => 'test message',
*          'subject' => 'test subject',
*          'bcc' => array( 
*              'amigo2@gmail.com', 
*              'amigo3@gmail.com' 
*          ),
*          'cc' => array( 
*              'amigo4@hotmail.com', 
*              'amigo5@gmail.com' 
*          ),
*          'attachment' => array( 
*              'test.html',
*              'test.php'
*          ),
*          'content-type' => 'text/html',
*          'charset' => 'iso-8859-1',
*          'priority' => 5
*      )
*  );
*  </code>
*  @return boolean true Em caso de sucesso
*/
function send_mail( array $contents )
{
   $ini_set = array( 
               'from'         => null,
               'to'           => array( ),
               'message'      => 'message',
               'subject'      => 'subject',
               'bcc'          => array( ),
               'cc'           => array( ),
               'attachment'   => array( ),
               'content-type' => 'text/html',
               'charset'      => 'iso-8859-1',
               'priority'     => 3
                  );
   $contents     = array_merge( $ini_set, $contents );
   $content_type = $contents[ 'content-type' ];
   $charset      = $contents[ 'charset' ];
   $priority     = ( int ) $contents[ 'priority' ];
   $from         = ( string ) $contents[ 'from' ];
   $subject      = $contents[ 'subject' ];
   $to           = implode( ', ', $contents[ 'to' ] );
   $cc           = implode( ', ', $contents[ 'cc' ] );
   $bcc          = implode( ', ', $contents[ 'bcc' ] );
   $msg          = $contents[ 'message' ];
   $headers      = null;
   $message      = null;
   $headers     .= sprintf( 'Date: %s%s', date( "D, d M Y H:i:s O" ), PHP_EOL );
   $headers     .= sprintf( 'Return-Path: %s%s', $from, PHP_EOL );
   $headers     .= sprintf( 'To: %s%s', $to, PHP_EOL );
   $headers     .= sprintf( 'From: %s%s', $from, PHP_EOL );
   $headers     .= sprintf( 'Cc: %s%s',  $cc, PHP_EOL );
   $headers     .= sprintf( 'Bcc: %s%s',  $bcc, PHP_EOL );
   $headers     .= sprintf( 'Reply-To: %s%s', $from, PHP_EOL );
   $headers     .= sprintf( 'Message-ID: <%s@%s>%s', md5( uniqid( rand( ), true ) ), $_SERVER[ 'HTTP_HOST' ], PHP_EOL );
   $headers     .= sprintf( 'X-Priority: %d%s', $priority, PHP_EOL );
   $headers     .= sprintf( 'X-Mailer: PHP/%s%s', phpversion( ), PHP_EOL );
   $headers     .= sprintf( 'Disposition-Notification-To: %s%s', $from, PHP_EOL );
   $headers     .= sprintf( 'MIME-Version: 1.0%s', PHP_EOL );    
   if( ( empty( $contents[ 'attachment' ] ) ) or ( ! is_array( $contents[ 'attachment' ] ) ) )
   {
       $headers .= sprintf( 'Content-Transfer-Encoding: 8bit%s', PHP_EOL );
       $headers .= sprintf( 'Content-Type: %s; charset="%s"%s', $content_type, $charset, PHP_EOL );
       $message .= $msg;
   }
   else
   {
       $boundary = md5( uniqid( rand( ), true ) );
       $headers .= sprintf( 'Content-Type: multipart/mixed; boundary="%s"%s', $boundary, PHP_EOL );
       $message .= sprintf( '--%s%s', $boundary, PHP_EOL );
       $message .= sprintf( 'Content-Transfer-Encoding: 8bit%s', PHP_EOL );
       $message .= sprintf( 'Content-Type: %s; charset="%s"%s', $content_type, $charset, PHP_EOL );
       $message .= sprintf( '%s%s', $msg, PHP_EOL );
       $message .= sprintf( '--%s%s', $boundary, PHP_EOL );        
       for( $i = 0; $i < count( $contents[ 'attachment' ] ); $i++ )
       {
           $attachments = $contents[ 'attachment' ] [ $i ];
           $file        = fopen( $attachments, 'r' );
           $attachment  = fread( $file, filesize( $attachments ) );
           $attachment  = chunk_split( base64_encode( $attachment ) );
           $finfo       = finfo_open( FILEINFO_MIME_TYPE );
           $filetype    = finfo_file( $finfo, realpath( $attachments ) );
           $filename    = basename( $attachments );
           $message    .= sprintf( 'Content-Type: %s; name="%s"%s', $filetype, $filename, PHP_EOL );
           $message    .= sprintf( 'Content-Transfer-Encoding: base64%s', PHP_EOL );
           $message    .= sprintf( 'Content-Disposition: attachment; filename="%s"%s%s', $filename, PHP_EOL, PHP_EOL ); 
           $message    .= sprintf( '%s%s', $attachment, PHP_EOL );
           $message    .= sprintf( '--%s%s%s', $boundary, ( ( ( $i + 1 ) == count( $contents[ 'attachment' ] ) ) ? '--' : '' ), PHP_EOL );    
           fclose( $file );
           finfo_close( $finfo );                        
       }
   }
   return @mail( null, $subject, $message, $headers );
}
?>

 

Vou testar ainda, mas é o seguinte.. teria como me explicar melhor a parte onde está o envio de emails com anexo nesse código?

 

Ou então me mandar um mais simples?

 

Um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha.. eu achei esse aqui que parece ser mais simples.

 

Link: http://www.webartz.com.br/php/php-e-mail-com-anexo-usando-a-funcao-mail/

 

<?
// Aqui vamos configurar o cabeçalho (header) do e-mail, formatos, remetentes, destinatários de cópias
$headers = "MIME-Version: 1.0\n";  
// Abaixo estabelecemos o Remetente do E-mail com o From:
$headers.= "From: roberto.carlos@gmail.com\r\n";
// Caso se queira especificar o e-mail de Resposta, utilizamos o Reply-To:, caso você não queira, basta excluir a linha abaixo
$headers.= "Reply-To: roberto.carlos@gmail.com\r\n";
// Se desejar enviar cópia para outro e-mail utiliza-se o Bcc:, especificando o e-mail de destino, se não quiser mandar essa cópia, basta remover a linha abaixo
$headers.= "Bcc: roberto_carlos@hotmail.com\r\n";
// Nesta linha abaixo, configuramos o "limite" ou boundary em inglês que é necessário para o arquivo em anexo.
$boundary = "XYZ-" . date("dmYis") . "-ZYX";
// Especificamos o tipo de conteúdo do e-mail
$headers.= "Content-type: multipart/mixed; boundary=\"$boundary\"\r\n";  
$headers.= "$boundary\n"; 

// Aqui abaixo, vamos colocar o corpo da mensagem, como vamos utilizar padrão HTML, teremos de utilizar tags HTML abaixo
$corpo_mensagem = "<html>
<head>
  <title>Teste de Envio</title>
</head>
<body>
<font face=\"Arial\" size=\"2\" color=\"#333333\">
<br />
Nome: <b>Roberto Carlos</b><br />
E-mail: <b>roberto.carlos@gmail.com</b>
</font>
</body>
</html>";

// Agora vem a parte própriamente dita do arquivo anexo. 
// Aqui verificamos se foi enviado pelo formulário o arquivo. Lembrando que o nome do campo no formulário terá de ser "arquivo", caso você queira usar outro, terá de mudar aqui abaixo.
// Caso não tenha sido enviado um arquivo, ele desconsidera e envia o e-mail normalmente, mas sem nada anexado.
if(file_exists($arquivo["tmp_name"]) and !empty($arquivo)){
// Nesta linha abaixo, abrimos o arquivo enviado.
   $fp = fopen($_FILES["arquivo"]["tmp_name"],"rb"); 
// Agora vamos ler o arquivo aberto na linha anterior
   $anexo = fread($fp,filesize($_FILES["arquivo"]["tmp_name"]));            
// Codificamos os dados com MIME para o e-mail 
   $anexo = base64_encode($anexo);
// Fechamos o arquivo aberto anteriormente
fclose($fp); 
   // Nesta linha a seguir, vamos dividir a variável do arquivo em pequenos pedaços para podermos enviar
$anexo = chunk_split($anexo);
// Nas linhas abaixo vamos passar os parâmetros de formatação e codificação, juntamente com a inclusão do arquivo anexado no corpo da mensagem.
   $mensagem = "--$boundary\n"; 
   $mensagem.= "Content-Transfer-Encoding: 8bits\n"; 
   $mensagem.= "Content-Type: text/html; charset=\"ISO-8859-1\"\n\n";
   $mensagem.= "$corpo_mensagem\n"; 
   $mensagem.= "--$boundary\n"; 
   $mensagem.= "Content-Type: ".$arquivo["type"]."\n";  
   $mensagem.= "Content-Disposition: attachment; filename=\"".$arquivo["name"]."\"\n";  
   $mensagem.= "Content-Transfer-Encoding: base64\n\n";  
   $mensagem.= "$anexo\n";  
   $mensagem.= "--$boundary--\r\n"; 
}

// Cconfiguramos o e-mail do destinatário
$destinatario = "fulano@gmail.com";
// Definimos o assuntos do nosso e-mail
$assunto = "Teste de Envio de Anexo";

// Após ter configurado tudo que é necessário, vamos fazer o envio propriamente dito
mail($destinatario, $assunto, $mensagem, $headers);  
?>

 

Mas por aqui quando você clica em "enviar" ele te manda o formulário todo em anexo. Teria como eu fazer aquele esquema de usar um arquivo com coisas já escritas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.