Do not download when exporting to Xls using PHP

Asked

Viewed 69 times

-1

I always use a script to export data to xls with PHP. It served me a lot, but in this case I just need to generate the xls and attach in the email.

I spent much of the morning trying to make the script just generate the spreadsheet, without forcing the download, but, if I take the "Content-Disposition: Attachment", gives error on the page.

Follows the script:

<?php
	include("php/phpmailer/PHPMailerAutoload.php");	
	
	// Trazendo as informações da tabela: 
	$header = "";
	$dados  = "";
		
	$header .= utf8_decode('Serviço'. "\t");
	$header .= utf8_decode('Projeto nº'. "\t");
	$header .= utf8_decode('Cliente'. "\t");
	$header .= utf8_decode('Processo'. "\t");
	$header .= utf8_decode('Vencimento'. "\t");

	// Select dos processos para fazer o lembrete
	$sql_2 = mysqli_query($config, "SELECT ps.data_vencimento_limite, ps.id_processo, IFNULL(NULL, ps.num_processo), ps.descricao, c.nome_razao FROM tb_processos_servicos ps LEFT JOIN tb_processos AS p ON (ps.id_processo = p.id_processo) LEFT JOIN tb_agenda AS c ON (p.cliente = c.id) WHERE ps.data_vencimento_limite <> '0000-00-00' AND ps.data_vencimento_limite <= '$data_atual_db' ORDER BY ps.data_vencimento_limite DESC") or die(mysqli_error($config));
	
	if(@mysqli_num_rows($sql_2) <= 0){
		echo "";
	}else{
		while($r_sql_2 = mysqli_fetch_array($sql_2)){
			$vencimento_limite = date("d/m/Y", strtotime($r_sql_2[0]));
			$id_processo       = $r_sql_2[1];
			$num_processo      = $r_sql_2[2];
			$descricao_sel     = utf8_decode($r_sql_2[3]);
			$cliente_sel       = utf8_decode($r_sql_2[4]);	

			// Insere a linha	
			$line = '';
			$value = '"' ."$descricao_sel". '"' . "\t";
			$value .= '"' ."$id_processo". '"' . "\t"; 
			$value .= '"' ."$cliente_sel". '"' . "\t"; 
			if(empty($num_processo)){
				$value .= '""' . "\t";
			}else{
				$value .= '"' ."'$num_processo". '"' . "\t";
			}
			$value .= '"' ."$vencimento_limite". '"' . "\t";
			$line .= strtr($value,"","") ;				

			// O trim retira os espaços encontrados no começo e no final de cada linha encontrada. 
			$dados .= trim($line)."\n";

			// Substituindo todas as quebras de linha ao final de cada registro, que por padrão seria \r por uma valor em branco, para que a formatao fique legível
			$dados = str_replace("\r","",$dados);

			// Caso não encontre nenhum registro, mostra esta mensagem. 
			if ($dados== "") {
				$dados = "\n Nenhum registro encontrado!\n"; 
			} 				
		}

		// O trim retira os espaços encontrados no começo e no final de cada linha encontrada. 
		$dados .= trim($line)."\n";

		// Substituindo todas as quebras de linha ao final de cada registro, que por padrão seria \r por uma valor em branco, para que a formatao fique legível
		$dados = str_replace("\r","",$dados);			

		// Cabeçalhos e instruções para geração e download do arquivo:
		header("Content-type: application/x-msexcel");

		// Este cabeçalho abaixo, indica que o arquivo deve ser gerado para download.
    // Se eu tirar ele salva o arquivo na pasta, mas dá erro na página
		header("Content-Disposition: attachment; filename=$nome_arquivo");

		// No cache, ou seja, não guarda cache, pois é gerado dinamicamente 
		header("Pragma: no-cache");

		// Não expira 
		header("Expires: 0");

		// E aqui geramos o arquivo com os dados mencionados acima! 
		print "$header\n$dados";	

		file_put_contents("anexos/".$nome_arquivo,$dados);	

    //Aqui será enviado o e-mail.		
		
	}

	mysqli_close($config);
?>

I don’t know is it possible to just generate the xls with this script, but it is so practical that I will make one last attempt.

In this case it saves in the "attachments" folder, but opens the browser box to download.

  • Where is header("Content-Disposition: attachment; filename=$nome_arquivo"); change to header("Content-Disposition: inline");

  • With this change you printed everything on the screen, instead of generating the xls.

1 answer

0

I believe the error is in the content direction, if you try to change to simply generate the file without touching the page header, and also adding the relative path should solve.

Note that in your print code is going to the current buffer and not to a target file, maybe this is influencing

Browser other questions tagged

You are not signed in. Login or sign up in order to post.