Você sabia que pode gerar relatórios Excel sem Windows ou Office e usando o Progress? Não? Então se liga nessa dica!
Antes de tudo, preciso dizer que essa é uma necessidade de mercado que surgiu, entre outros fatores, porque várias empresas trabalham com o servidor e cliente Linux/Unix, que não comporta o pacote Office. Assim, não permite extrair as informações em Excel, por exemplo.
Para conseguir isso, uma das alternativas utilizadas geralmente é fazer primeiro a exportação desses dados em CSV e manualmente importar para o Excel. No entanto, leva muito tempo para formatar o arquivo e entregar para o usuário de forma interpretável.
SAIBA MAIS: CONSUMIR WEBSERVICE REST UTILIZANDO PROGRESS
Como o Excel (pacote Office na verdade) tem compatibilidade com o padrão XML, tanto para salvar, quando para abrir, minha dica é utilizar uma include que faz essa mágica para nós e, assim, gerar relatórios “Excel” sem Windows ou Office.
Estou falando da excel_xml.i. Eu a utilizo há muito tempo e abaixo vou mostrar um exemplo de como essa include pode ser utilizada.
Exemplo de como gerar relatórios Excel sem Windows ou Office
{excel_xml.i} run Planilha('c:\Relatorios\kbase.xml'). /*arquivo de saída*/ PROCEDURE Planilha: def input param arq as char. def var i as int. Excel-Begin(arq, ''). run Estilos. /*Carrega Estilos*/ Excel-Begin-Sheet('Aba1', /*Cria Aba1*/ '100;200;250;70;40;80;80', /*Define Tamanho das Colunas*/ 'LEFT=;CENTER=TESTE DE PLANILHA EXCEL' + ';RIGHT=;HEADER-ROWS=4', '', ''). Excel-Merge(2). /*Merge Colunas A1+B1*/ Excel-Cell-Char('Kbase', 'Cabec1'). /*Escreve ‘Kbase’ na célula usando o Estilo Cabec1*/ Excel-Merge(5). Excel-Cell-Char('Relatório' + /*Escreve ‘Relatório + mês/Ano’ na célula usando */ string(month(today),'99') + '/' + /*o Estilo Cabec2*/ string(year(today),'9999'), 'Cabec2'). Excel-Merge(7). Excel-Cell-Char('','Cabec2'). Excel-Merge(3). Excel-Cell-Char('Elaborado por: Kbase', 'Cabec'). Excel-Merge(4). Excel-Cell-Char('Emitido em ' + string(today,'99/99/9999') + ' ' + string(time,'HH:MM:SS'), 'Cabec3'). /*Define cabeçalhos*/ &scoped-define labels 'CNPJ,Nome,Endereco,Emissao,Qtde,Valor Unit.,Valor' /*Escreve o cabeçalho dos campos que serão listados*/ do i = 1 to num-entries({&labels}): Excel-Cell-Char(entry(i, {&labels}), 'Label'). end. /*para esse teste vamos mostrar 100 linhas com valores aleatórios*/ do i = 1 to 100: Excel-Cell('99.999.999/9999-99'). /*imprime texto*/ Excel-Cell(trim(fill('Teste ', random(1,5)))). Excel-Cell(trim(fill('Teste ', random(3,6)))). Excel-Cell-Date(today + i, ''). /*imprime data*/ Excel-Cell-Int(random(1,10), 'NumInt'). /*Formata número inteiro*/ Excel-Cell-Dec(dec(random(10, 100)), ''). /*Formata número decimal*/ Excel-Cell-Full('Number', 'Formula:RC[-2]*RC[-1]', ''). /*Fórmula Col E * Col F*/ end. Excel-End-Sheet(true, 95). /*Fecha Aba1*/ Excel-Begin-Sheet('Aba2', /*Cria Aba2*/ '40;80;80', 'LEFT=;CENTER=Teste1' + ';RIGHT=;HEADER-ROWS=4', '', ''). Excel-Merge(2). Excel-Cell-Char('Kbase', 'Cabec1'). Excel-Merge(5). Excel-Cell-Char('Relatorio de Testes (aba2) ' + string(month(today),'99') + '/' + string(year(today),'9999'), 'Cabec2'). Excel-Merge(7). Excel-Cell-Char('','Cabec2'). Excel-Merge(3). Excel-Cell-Char('Elaborado por: Kbase', 'Cabec'). Excel-Merge(4). Excel-Cell-Char('Emitido em ' + string(today,'99/99/9999') + ' ' + string(time,'HH:MM:SS'), 'Cabec3'). &scoped-define labels ',Qtde,Valor Unit.,Valor' do i = 1 to num-entries({&labels}): Excel-Cell-Char(entry(i, {&labels}), 'Label'). end. do i = 1 to 100: Excel-Cell-Int(random(1,10), 'NumInt'). Excel-Cell-Dec(dec(random(10, 100)), ''). Excel-Cell-Full('Number', 'Formula:RC[-2]*RC[-1]', ''). end. Excel-End-Sheet(true, 95). /*Fecha Aba2*/ Excel-End(). /*Fecha o Excel*/ END PROCEDURE. /*Cria Estilos Utilizados*/ PROCEDURE Estilos: Style-Font('Default','Calibri', 10, '000000', false, false). Style-Border('Default','',1). Style-Font('Data','Calibri', 10, '000000', false, true). Style-Font('NumInt','Calibri', 10, '000000', false, true). /*Cria Estilos Cabec com fundo 87CEEB, fonte Calibri, tamanho 10, cor preto (000000), o primeiro false/true é itálico e o segundo negrito e alinhado a direita*/ Style-Add('Cabec'). Style-Interior('Cabec','87CEEB'). /*Fundo*/ Style-Font('Cabec','Calibri',10,'000000',false,true). /*Fonte,tamanho,cor,itálico,negrito*/ Style-Align('Cabec','Left','Bottom',false). /*Texto alinhado à direita*/ Style-Copy('Cabec','Cabec1'). Style-Font('Cabec1','Calibri',12,'000000',true,FALSE). Style-Copy('Cabec','Cabec2'). Style-Align('Cabec2','Left','Bottom',false). Style-Font('Cabec2','Verdana',15,'000000',true,false). Style-Border('Cabec','Bottom',1). Style-Copy('Cabec','Cabec3'). Style-Align('Cabec3','Right','Bottom',false). Style-Copy('Default','Label'). Style-Interior('Label','DDDDDD'). Style-Align('Label','Center','Center',true). Style-Border('Label','Bottom',1). /*Definição de borda*/ END PROCEDURE.
/*Resultado No diretório de saída*/
/*Print do Relatório Aba1*/
/*Fórmula*/
/*Print do Relatório Aba2*/
O que percebo e posso trazer para vocês, é que dentro desse formato de geração de Excel se consegue uma agilidade expressiva. Isto porque o arquivo é criado como se fosse um “txt”. Já vi casos de arquivos Excel (gerados e formatados dinamicamente) demorarem muito tempo para serem gerados. Assim, constatei que a formatação coluna a coluna, linha a linha, causava uma lentidão na geração do arquivo. Dessa forma, ao alterar o programa para gerar o relatório utilizando essa include, pude observar que reduzia muito o tempo para que essa tarefa fosse concluída. Além de poder gerar no servidor sem utilizar Windows ou Office.
Dessa forma, posso dizer que ao adotar esta ferramenta, o usuário teve o mesmo relatório sendo gerado em tempo muito menor. Com o tempo melhor aproveitado, foi possível automatizar a geração no servidor.
Outro exemplo de uso da include, é a alteração que permite ela receber qualquer tabela temporária como parâmetro e gerar o relatório totalmente dinâmico. Mas isso é conversa para um outro artigo.
Finalmente, para você ver como isso acontece e explorar outras possibilidades, disponibilizo um exemplo para download juntamente com a include. Baixe aqui o modelo: http://kbase.com.br/excel-sem-windows.
Artigo escrito por Alexandre dos Santos, analista de sistemas da Kbase.