Mudança nos relatórios Excel para Office e LibreOffice

Recentemente a empresa onde trabalho passou por umas mudanças onde algumas filiais tiveram o Office da Microsoft trocado pelo LibreOffice que atende muito bem as necessidades.

O problema é que todos os relatórios nos últimos dois anos foram feitos para serem gerados em Excel seguindo as dicas postadas nesses posts:

Ao tentar gerar os mesmos relatórios no Calc do LibreOffice surge um erro dizendo que a aplicação não está devidamente registrada no servidor.

Hoje trabalhamos com sistema Totvs e felizmente eles disponibilizaram uma integração onde podemos gerar o mesmo relatório tanto para Excel quanto para Calc fazendo pequenas mudanças no código.

Mais dados desta integração podem ser acessados aqui.

Vou lista-las abaixo:

Declarações dos objetos: Nas declarações dos objetos que vão instanciar o Excel devemos alterar da seguinte maneira

DEFINE VARIABLE chExcelApp  AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE chWorkBook  AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE chWorkSheet AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE chRange     AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE chChart     AS COM-HANDLE NO-UNDO.

para

DEFINE VARIABLE chExcelApp  AS office.iface.excel.ExcelWrapper NO-UNDO.
DEFINE VARIABLE chWorkBook  AS office.iface.excel.WorkBook     NO-UNDO.
DEFINE VARIABLE chWorkSheet AS office.iface.excel.WorkSheet    NO-UNDO.
DEFINE VARIABLE chRange     AS office.iface.excel.Range        NO-UNDO.
DEFINE VARIABLE chChart     AS office.iface.excel.Chart        NO-UNDO.

Instancia do Excel: O comando que instancia o Excel no objeto chExcelApp vai ser trocado pela include, ao contrario do comando CREATE que pode ser executado várias vezes dentro do programa a include deve ser instanciada uma unica vez.

CREATE "Excel.Application" chExcelApp.

para

{office/office.i Excel chExcelApp}

O parâmetro VALUE que insere valor na célula agora só recebe valores do tipo carácter, se não desejar alterar o tipo para carácter use a função setValue()

chWorkSheet:Range("A4"):VALUE = "Teste".
chWorkSheet:Range("B4"):SetValue(1433000).
chWorkSheet:Range("C4"):SetValue("Também funciona").

O parâmetro MERGE virou uma função MERGE()

Para gráficos o tipo de gráfico mudou de chChart:Type  para chChart:ChartType

E alguns parâmetros passam a ser tratados como função assim como Borders:LineStyle que agora deve informar parenteses no fim Borders():LineStyle

Importante: Relatórios que abrem no MS Office não costuma dar erro más no LibreOffice se o relatório for executado mais de uma vez na mesma tela aberta pode gerar um erro de handle já existente, uma solução é gravar nulo nas variáveis criadas antes da instanciação:

    assign
        chExcelApp  = ?
        chWorkBook  = ?
        chWorkSheet = ?.

    {office/office.i Excel chExcelApp}

 

5 thoughts on “Mudança nos relatórios Excel para Office e LibreOffice

  1. Bom dia,
    As dicas são ótimas. Obrigado pelo conteúdo.
    Tenho uma dúvida, no caso para tabela dinamica, como ficaria?

    Usei:
    activesheet:pivotTables(“tabela dinamica1”):pivotcache:refresh

    Mas da erro que não esta encontrando o elemento pivottable na classe office.iface.excel

    1. Infelizmente parece que o desenvolvimento desta API foi abandonado pela Totvs e muitas funções ficaram de fora.
      pelo diagrama disponibilizado pela Totvs neste link o recurso pivotTables não foi implementado.

      Na verdade, apenas recursos básicos foram implementados.

  2. Muito obrigado pelo retorno ;). Vou abrir chamado na TOTVS, para ver se tem alguma previsão de melhorias para esta API.

  3. Bom dia!

    Muito boa as dicas me ajudou muito, tenho uma duvida é possivel utilizar modelo? utilizava no excel mas quando foi para o LibreOffice não consigo utilizar os modelos já tentei alterar o tipo do arquivo modelo mas não funciona.

    Comando utilizado no excel: chWorkBook = chExcel:workbooks:open(modelo).

  4. Boa tarde.
    Estou tentando gerar uma planilha no LibreOficce, mas gera em branco, quando gero em um servidor que contem excel gera normalmente. Estou em um ambiente cloud .
    define variable chExcel AS office.iface.excel.ExcelWrapper NO-UNDO.
    define variable chWBook AS office.iface.excel.Workbook NO-UNDO.
    DEFINE VARIABLE chWSheet AS office.iface.excel.WorkSheet NO-UNDO.
    define variable chwsheetrange as component-handle no-undo.
    chWSheet:Range(“A” + string(v_cont_lin)):SetValue(‘ORDEM COMPRA’) .
    chWSheet:Range(“A” + string(v_cont_lin)):font:bold=true.
    chWSheet:Range(“A” + string(v_cont_lin)):HorizontalAlignment = {&xlleft} /*{&xlcenter}*/ .
    Alguem saberia me ajudar com este problema.
    Grato
    Reinaldo

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.