The_Fury 0 Denunciar post Postado Janeiro 19, 2012 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
surfboy.le 0 Denunciar post Postado Janeiro 19, 2012 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
The_Fury 0 Denunciar post Postado Janeiro 20, 2012 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
surfboy.le 0 Denunciar post Postado Janeiro 20, 2012 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
The_Fury 0 Denunciar post Postado Janeiro 23, 2012 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
surfboy.le 0 Denunciar post Postado Janeiro 23, 2012 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
The_Fury 0 Denunciar post Postado Janeiro 23, 2012 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
The_Fury 0 Denunciar post Postado Janeiro 23, 2012 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