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}
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
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.
Muito obrigado pelo retorno ;). Vou abrir chamado na TOTVS, para ver se tem alguma previsão de melhorias para esta API.
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).
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