Ir para conteúdo


Foto

Grid Exportar para o excel


  • Por favor, faça o login para responder
3 respostas neste tópico

#1 murilopz

murilopz

    Member Avançado

  • Membros
  • PipPipPip
  • 39 posts
  • LocationBotucatu

Postado 31 August 2009 - 15:19


Bom dia pessoal,

Posto aqui meu primeiro exemplo que desenvolvi com ext.

Achei as grids que o ext tem sensacional e queria dar uma opção para exportar o resultado da grid para o excel, ao invés de só ficar andando com o resultado p/lá e p/cá. A grande chave está que será exportada para o excel apenas as colunas visíveis do usuário, ou seja oque ele vê na tela.

Não irei me atentar aqui a passar a grid.

Passo 1 - Criar um botão na toolbar da grid para a função do excel

tbar: ['-',{
        text: 'Excel',
	tooltip: 'exportar para excel',
        handler: exportaExcel,
	iconCls:'excel',   
      },'-']

Passo 2 - Criar função do exportaExcel

function exportaExcel(){

     //precisa saber primeiro o numero de colunas
     var numero_de_colunas = grid.getColumnModel().getColumnCount();
     var col_campos = []; // dataIndex -campos para o SQL
     var col_names = [] // header - título


       // faz um laço para passar por todas as colunas pegando o estado da coluna atual
      // se a coluna estiver visivel na tela, ele pega o header/dataindex
      // e joga os valores para as arrays criadas acima

	for(var i = 0; i < numero_de_colunas; i++){
		var isHid = grid.getColumnModel().isHidden(i);
		if (isHid == false) {	//se a coluna estiver visivel
			//adiciona os valores das colunas
			col_campos.push(grid.getColumnModel().getDataIndex(i));
			col_names.push(grid.getColumnModel().getColumnHeader(i));
		}
		
	}

//Neste ajax.requeste mando todos os campos p/o arquivo.
Ext.Ajax.request({   
		    	waitMsg: 'Por favor, aguarde ...',
				url: 'json/excel.php',
			    method: 'POST',
				params: {
					task: "EXCEL", 	// primaryKey: 'id_car', idkey: '2', 
                                        tabela: "nome_da_tabela",
					col_width: Ext.encode(col_width),
					col_campos: Ext.encode(col_campos),
					col_names: Ext.encode(col_names)
				},
		 success: function(response){              
          var result=eval(response.responseText);
          switch(result){
          case 1:
            win =  window.open('json/excel.php','titulo','height=400,width=700,resizable=1,scrollbars=1, menubar=0');
            //win.print();
			Ext.MessageBox.alert('Uh hu...','Deu certo.....');
            break;
          default:
            Ext.MessageBox.alert('Uh hu...','Erro ao gerar excel!');
            break;
          }  
        },
        failure: function(response){
          var result=response.responseText;
          Ext.MessageBox.alert('error','Impossível conectar ao BD parar gerar eXCEL');      
        }            
			});
} //fecha a função


Passo 3 - Arquivo json/excel.php

<php
//conecta ao banco de dados
mysql_connect("localhost", "root", "senha") or die("Could not connect: " . mysql_error());
mysql_select_db("tabela");

//recebe os campos do extjs
$tabela = $_POST['tabela'];
$col_campos= json_decode(stripslashes($col_campos));
$col_names= json_decode(stripslashes($col_names));

//transforma os campos da coluna para deixar certo no SELECT
for ($i=0; $i <sizeof($col_campos)-1; $i++) {
	$campos_nome .= $col_campos[$i].",";
}
$campos_nome .= $col_campos[sizeof($col_campos)-1];

$query = "SELECT $campos_nome FROM $tabela";
$result = mysql_query($query);
$nbrows = mysql_num_rows($result); //rstSocnsulta == result
$fields = mysql_num_fields($result);
$fields = $nomes_arr;

//Recuperando os nomes dos campos. Eles também serão os nomes dos campos da planilha:
//Esse é o header do js
for ($i = 0; $i < sizeof($col_names); $i++) {
$header .= $col_names[$i] . "\t";
}

//Traz as informações encontradas em cada linha de registro do banco:
while($row = mysql_fetch_row($result)) {
$line = '';
foreach($row as $value) {
if ((!isset($value)) OR ($value == "")) {
$value = "\t";
} else {
$value = str_replace('"', '""', $value);
$value = '"' . $value . '"' . "\t";
}
$line .= $value;
}

// retira os espaços encontrados no começo e no final de cada linha encontrada.
$dados .= trim($line)."\n";
}
// substitui todas as quebras de linha ao final de cada registro, que por padrão seria \r por uma valor em branco, para que a formatação fique legível
$dados= str_replace("\r","",$dados);

//Quinto passo - Tratamento básico de erro:
// Caso não encontre nenhum registro, mostra esta mensagem.
if ($dados== "") {
$dados = "\n Nenhum registro encontrado!\n";
//$dados .= "$query_rstConsulta";
} 

//Cabeçalhos e instruções para geração e download do arquivo:
header("Content-type: application/octet-stream");
// este cabeçalho abaixo, indica que o arquivo deverá ser gerado para download (parâmetro attachment) e o nome dele será o contido dentro do parâmetro filename.
header("Content-Disposition: attachment; filename=relatorio_excel.xls");
// 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";

echo '1';
?>


Acho que é isso.... Ainda tem umas implementações que gostaria de fazer mas como sou iniciante em ext a coisa anda devagar e queria compartilhar isso logo.

Se alguém quizer complementar, "just feel free". Também estou trabalhando num para exportar para pdf que está mais incrivel que o do excel. No do pdf ele calcula o width de cada coluna e gera uma tabela no pdf proporcional ao que estava na tela.

Implementações futuras

1 - Ele abre na janela o mesmo arquivo que ele gerou. Vou fazer ele abrir direto no excel
2 - Ao invés do window.open (popup) quero fazer ele abrindo uma janela do próprio ext. Uma vez vi um exemplo onde dentro ele chama o arquivo, mas não achei até agora.
3 - Para a função do pdf, antes do export ele vai pedir do usuário se é Retrato/Paisagem

Acho que é isso e espero que gostem. Dá mais funcionalidade ao grid


#2 Perfect Lion

Perfect Lion

    Member Avançado

  • Administrators
  • 492 posts
  • LocationBrasil/SBC

Postado 31 August 2009 - 18:11

Opa murilopz não precisa postar em varios forum quanto a isso.. que quando o pessoal quiser um exemplo eles virão para essa parte do forum viu ;)

eu aqui tbm ;)
Ajude a manter o fórum organizado.
Sempre que um tópico for resolvido clique no botão MARCAR COMO RESOLVIDO localizado ao lado do botão RESPONDER.

Fazer um CMS num é mole não.. ainda mais sozinho XD Ajude-me :P


#3 murilopz

murilopz

    Member Avançado

  • Membros
  • PipPipPip
  • 39 posts
  • LocationBotucatu

Postado 31 August 2009 - 18:20

é que a sala do Ajuda foi de grande ajuda para fazer isso. era mais empolgação quanto a minha primeira contribuição

abçs

#4 rafaelks

rafaelks

    Novato

  • Membros
  • PipPip
  • 29 posts
  • LocationTaquara - RS

Postado 30 December 2009 - 09:33

Pra ti fazer abrir em uma janela no Próprio Ext, basta tu criar um iframe.




0 usuário(s) está(ão) lendo este tópico

0 membros, 0 visitantes, 0 membros anônimos