_Blog_

Blog

Gerar relatórios Excel sem Windows ou Office? Sim, nós podemos!

Tags:, , , , , , , , , , Artigos, Destaque, Sem categoria
featured image

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*/

Relatórios Excel sem Windows ou Office4

Relatórios Excel sem Windows ou Office5

 

/*Fórmula*/

Relatórios Excel sem Windows ou Office5

/*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.

Fonte: https://support.office.com/pt-br/article/vis%C3%A3o-geral-do-xml-no-excel-f11faa7e-63ae-4166-b3ac-c9e9752a7d80.

Artigo escrito por Alexandre dos Santos, analista de sistemas da Kbase.

Related Posts

  • Indústria 4.0
  • Tecnologia da Informação
  • Sites híbridos ou PWA
  • usabilidade e produtividade em TI