1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

[RESOLVIDO] Progress x Excel

Discussão em 'EMS , HCM e Totvs 11' iniciado por Claudia_Melo, Novembro 9, 2015.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. berriel

    berriel Membro Participativo

    Olá Reissobr, tudo bem e com você?
    Estou achando que nosso caso é bem parecido com o seu, pois também estamos em Cloud e com o banco de desenvolvimento em testes do LibreOffice. Também temos vários programas customizados que geram documentos do office e que são utilizados internamente. Meu programa de impressão de notas fiscais, por exemplo, pode simplesmente gerar as notas em xlsx, imprimi-las, gerar pdf e envia-las por e-mail. Tenho absoluta certeza de que se formos passar para Libreoffice, iremos enfrentar uma série de problemas, sem contar com o imenso trabalho de recodificação dos programas.
    Vocês utilizam as APIs do produto para gerar as planilhas ou fazem como eu e trabalham a planilha de dentro do programa progress?
    No caso de vocês continuarem a utilizar o office, como fica a questão das licenças de uso do office, já que o produto está em Cloud?

    Grande abraço.
  2. reissobr

    reissobr Membro Participativo

    @berriel,
    Não utilizamos as API's para a geração de planilhas e PDF.
    Pelo que você descreveu, fazemos da mesma forma que voce, usamos a automação do Excel, e geramos a planilha dentro do progress.
    Algumas poucas populamos, mas na maioria dos casos, temos um modelo, gravamos um CSV, e dentro do progress, abrimos o modelo e importamos o CSV.
    Quanto a questão da licença, podemos conversar para trocar umas ideias.
    O nosso maior problema é o numero de usuários nominais no Cloud, que temos uma "limitação" no ambiente Ms-Office, e tinhamos a promessa de nominais ilimitados, no ambiente LibreOffice.
    Os acessos simultâneos não mudaria, somente haveria a liberaçao de nominais, o que é uma pequena vantagem, mas que para nós nao justifica a migração.
  3. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Pessoal, eu utilizo uma classe que acessa o excel via dll, acredito que seja como vcs fazem, sem usar a API, tudo usando handle-com e tal, se vcs tiverem documentação do libreoffice e puderem me passar, me interessa muito isso, infelizmente não consigo ajudar vcs por causa do Cloud, eu não uso.

    No meu caso, eu só terei que ajustar a classe para entender os comandos do libreoffice e tudo deve sair funcionando, já que não uso comandos de acesso ao excel diretamente nos programas.
  4. reissobr

    reissobr Membro Participativo

    @bootstrapmaster, valeu pela classe.
    Não fazemos pela API, estou colocando um resumo do código que usamos.
    E em virtude de outros projetos que estouraram como urgentes aqui na empresa, nem fui atras da automaçao para o libre office.
    Mas vou ver se consigo alguma informaçao, e compartilho por aqui.

    Código:
    /*--  Variaveis do tipo com-handle para acesso ao Ms-Excel  --*/
    
    def var chExcelApplication          as com-handle no-undo.
    def var chWorkSheet                 as com-handle no-undo.
    def var chWorkBook                  as com-handle no-undo.
    DEF VAR chQueryTable                AS COM-HANDLE NO-UNDO.
    
    
    
    
    /*--------------------------------------------*/
    /*  Cria a Planilha Excel e carrega o modelo  */
    /*--------------------------------------------*/
    
    CREATE "excel.application" chExcelApplication.
    chExcelApplication:visible = false.
    chworkbook = chExcelApplication:workbooks:add(w-modelo).
    
    
    /*---------------------------------------------*/
    /*    Carrega Dados - arq txt da Aba Resumo    */
    /*---------------------------------------------*/
    
    chExcelApplication:Sheets("Resumo"):Select.
    ASSIGN w-temporario  = w-path-temp + "ESCS013Res.txt".
    chExcelApplication:range("C1"):VALUE = String(w-temporario).
    
    
    
    
  5. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    tá. esse ai é pro acesso excel, eu uso na classe, agora se souber os comandos pro libre-office é só adaptar, dá uma olhada, tem um .p de teste que mostra mais ou menos como usar, como os metodos da classe foram criados com nomes que eu entendi como sendo uteis, pra libre-office, basta eu mudar o codigo de cada metodo, e nos programas que usam, não muda nada.

    Arquivos Anexados:

    reissobr curtiu isso.
  6. rlfritz

    rlfritz Membro Ativo

    Tenho um código aqui... (um pouco antigo) para gerar planilha no calc (antigo open office). Acho que usei uma vez para testar, não cheguei a aprofundar o uso.


    Código:
    /************************************************************* * ************
    O CODIGO ABAIXO CRIA UM NOVO ARQUIVO NO CALC DA SUITE OPEN OFFICE E
    DEMONSTRA ALGUMAS FORMATA€åES BµSICAS
    ************************************************************ *************/
    
    DEFINE VARIABLE chOpenOffice AS COM-HANDLE.
    DEFINE VARIABLE chWorkBook AS COM-HANDLE.
    DEFINE VARIABLE chDesktop AS COM-HANDLE.
    DEFINE VARIABLE chWorkSheet AS COM-HANDLE.
    DEFINE VARIABLE chCell AS COM-HANDLE.
    DEFINE VARIABLE cc AS raw.
    DEFINE VARIABLE dd AS RAW.
    
    DEF VAR c-arquivo AS CHAR.
    
    DEF VAR i-linha AS INT.
    DEF VAR i-teste AS INT.
    
    /* CRIA UMA CONEXÇO COM O SERVIDOR OLE, A REFERÒNCIA "com.sun.star.ServiceManager"  O NOME DO OPEN OFFICE NO REGISTRO DO WINDOWS (regedit) */
    CREATE "com.sun.star.ServiceManager" chOpenOffice.
    
    /* INICIALIZA A SUÖTE OPEN OFFICE */
    chDesktop = chOpenOffice:createInstance("com.sun.star.frame.Desktop").
    
    /* INICIA O CALC E CRIA UM ARQUIVO NOVO */
    chWorkBook= chDesktop:loadComponentFromURL("private:factory/scalc","_blank",0,cc).
    
    /* SELECIONA A PRIMEIRA PLANILHA "PLAN1" */
    chWorkSheet = chWorkbook:Sheets:getByIndex(0).
    
    ASSIGN i-teste = 0.
    
    /***** O ENDERE€AMENTO DE LINHAS E COLUNAS INICIA A PARTIR DE ZERO *****/
    
    
    /* INSERE TEXTO NA COLUNA B E LINHA 1 */
    chWorkSheet:GetCellByPosition(1,0):STRING = 12/31/2005.
    /* INSERE VALORES NA COLUNA C E LINHA 1 */
    chWorkSheet:GetCellByPosition(3,0):VALUE = 1000.
    
    /* INSERE VALORES NA COLUNA C E LINHA 2 */
    chWorkSheet:GetCellByPosition(3,1):VALUE = 1000.
    
    /* INSERE FORMULA NA COLUNA C E LINHA 3 */
    chWorkSheet:GetCellByPosition(3,2):formula = "=sum(D1:D2)".
    
    DO i-linha = 0 TO 36:
        ASSIGN i-teste = i-teste + 1.
        chWorkSheet:GetCellByPosition(0,i-linha):VALUE = 12/31/2005.
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "NumberFormat", i-teste  ). /* FORMATOS*/
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "HoriJustify", 2).  /* CENTRALIZA NA CLULA */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharHeight", 12).  /* TAMANHO DE FONTE */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharColor", 32768).  /* COR DA FONTE */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CellBackColor", 65535).  /* COR DE FUNDO DA CLULA */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharWeight",200). /* TEXTO EM NEGRITO */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharPosture", 2). /* TEXTO EM ITµLICO */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharFontName", "Courier"). /* NOME DA FONTE */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharUnderline", 1). /* SUBLINHADO */
    END.
    
    /* -------------- coloca as bordas nas celulas ------------ */
    DEF VAR oBorda AS COM-HANDLE NO-UNDO.
    DEF VAR oLinBorda AS COM-HANDLE NO-UNDO.
    DEF VAR oExtensao AS COM-HANDLE NO-UNDO.
    
    oBorda = chWorkSheet:getPropertyValue("TableBorder").
    oLinBorda = chWorkSheet:getPropertyValue("TopBorder").
    
    /* define a espessura da borda */
    oLinBorda:OuterLineWidth = 30.
    
    /* coloca borda nas celulas selecionadas */
    DO i-linha = 0 TO 36:
       chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue("TopBorder", oLinBorda).
       chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue("RightBorder", oLinBorda).
       chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue("LeftBorder", oLinBorda).
       chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue("BottomBorder", oLinBorda).
    END.
    /* ---------------------------------------------------------- */
    
    /* DEFINE O CAMINHO E O ARQUIVO DE SAÖDA */
    c-arquivo = "file:///c:/temp/teste-calc.ods".
    
    /* SALVA O ARQUIVO COM O NOME E CAMINHO ESPECIFICADO */
    chWorkbook:storeAsUrl(c-arquivo ,dd ).
    
    /* FINALIZA E DESCONECTA CONEXÇO OLE */
    chWorkbook:dispose().
    chDesktop:TERMINATE().
            
    RELEASE OBJECT chOpenOffice.
    RELEASE OBJECT chWorkbook.
    RELEASE OBJECT chDesktop.
    RELEASE OBJECT chWorksheet.
    
    
    /*
    /* INICIA O CALC COM ARQUIVO MODELO */
    chWorkBook= chDesktop:loadComponentFromURL("file:///c:/temp/teste.ots","_blank",0,cc).
    
    */
    
    
    /*
    /************************************************************* * ************
    O CODIGO ABAIXO CRIA UM NOVO ARQUIVO NO CALC DA SUITE OPEN OFFICE E
    DEMONSTRA ALGUMAS FORMATA€åES BµSICAS
    ************************************************************ *************/
    
    DEFINE VARIABLE chOpenOffice AS COM-HANDLE.
    DEFINE VARIABLE chWorkBook AS COM-HANDLE.
    DEFINE VARIABLE chDesktop AS COM-HANDLE.
    DEFINE VARIABLE chWorkSheet AS COM-HANDLE.
    DEFINE VARIABLE chCell AS COM-HANDLE.
    DEFINE VARIABLE cc AS raw.
    DEFINE VARIABLE dd AS RAW.
    
    DEF VAR c-arquivo AS CHAR.
    
    DEF VAR i-linha AS INT.
    DEF VAR i-teste AS INT.
    
    /* CRIA UMA CONEXÇO COM O SERVIDOR OLE, A REFERÒNCIA "com.sun.star.ServiceManager"  O NOME DO OPEN OFFICE NO REGISTRO DO WINDOWS (regedit) */
    CREATE "com.sun.star.ServiceManager" chOpenOffice.
    
    /* INICIALIZA A SUÖTE OPEN OFFICE */
    chDesktop = chOpenOffice:createInstance("com.sun.star.frame.Desktop").
    
    /* INICIA O CALC E CRIA UM ARQUIVO NOVO */
    chWorkBook= chDesktop:loadComponentFromURL("private:factory/scalc","_blank",0,cc).
    
    /* SELECIONA A PRIMEIRA PLANILHA "PLAN1" */
    chWorkSheet = chWorkbook:Sheets:getByIndex(0).
    
    ASSIGN i-teste = 0.
    
    /***** O ENDERE€AMENTO DE LINHAS E COLUNAS INICIA A PARTIR DE ZERO *****/
    
    
    /* INSERE TEXTO NA COLUNA B E LINHA 1 */
    chWorkSheet:GetCellByPosition(1,0):STRING = 12/31/2005.
    /* INSERE VALORES NA COLUNA C E LINHA 1 */
    chWorkSheet:GetCellByPosition(3,0):VALUE = 1000.
    
    /* INSERE VALORES NA COLUNA C E LINHA 2 */
    chWorkSheet:GetCellByPosition(3,1):VALUE = 1000.
    
    /* INSERE FORMULA NA COLUNA C E LINHA 3 */
    chWorkSheet:GetCellByPosition(3,2):formula = "=sum(D1:D2)".
    
    DO i-linha = 0 TO 36:
        ASSIGN i-teste = i-teste + 1.
        chWorkSheet:GetCellByPosition(0,i-linha):VALUE = 12/31/2005.
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "NumberFormat", i-teste  ). /* FORMATOS*/
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "HoriJustify", 2).  /* CENTRALIZA NA CLULA */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharHeight", 12).  /* TAMANHO DE FONTE */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharColor", 32768).  /* COR DA FONTE */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CellBackColor", 65535).  /* COR DE FUNDO DA CLULA */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharWeight",200). /* TEXTO EM NEGRITO */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharPosture", 2). /* TEXTO EM ITµLICO */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharFontName", "Courier"). /* NOME DA FONTE */
        chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue( "CharUnderline", 1). /* SUBLINHADO */
    END.
    
    /* -------------- coloca as bordas nas celulas ------------ */
    DEF VAR oBorda AS COM-HANDLE NO-UNDO.
    DEF VAR oLinBorda AS COM-HANDLE NO-UNDO.
    DEF VAR oExtensao AS COM-HANDLE NO-UNDO.
    
    oBorda = chWorkSheet:getPropertyValue("TableBorder").
    oLinBorda = chWorkSheet:getPropertyValue("TopBorder").
    
    /* define a espessura da borda */
    oLinBorda:OuterLineWidth = 30.
    
    /* coloca borda nas celulas selecionadas */
    DO i-linha = 0 TO 36:
       chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue("TopBorder", oLinBorda).
       chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue("RightBorder", oLinBorda).
       chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue("LeftBorder", oLinBorda).
       chWorkSheet:GetCellByPosition(0,i-linha):setPropertyValue("BottomBorder", oLinBorda).
    END.
    
    /* seleciona um grupo de celulas */
    oExtensao = chWorkSheet:getCellRangeByPosition(1, 0, 3, 36).
    
    /* coloca borda no contorno das celulas selecionadas */
    oBorda:TopLine = oLinBorda.
    oBorda:BottomLine = oLinBorda.
    oBorda:RightLine = oLinBorda.
    oBorda:LeftLine = oLinBorda.
    oBorda:IsTopLineValid = True.
    oBorda:IsBottomLineValid = True.
    oBorda:IsRightLineValid = True.
    oBorda:IsLeftLineValid = True.
    oExtensao:setPropertyValue("TableBorder", oBorda).
    
    /* ---------------------------------------------------------- */
    
    /* DEFINE O CAMINHO E O ARQUIVO DE SAÖDA */
    c-arquivo = "file:///c:/temp/teste-calc.ods".
    
    /* SALVA O ARQUIVO COM O NOME E CAMINHO ESPECIFICADO */
    chWorkbook:storeAsUrl(c-arquivo ,dd ).
    
    /* FINALIZA E DESCONECTA CONEXÇO OLE */
    chWorkbook:dispose().
    chDesktop:TERMINATE().
            
    RELEASE OBJECT chOpenOffice.
    RELEASE OBJECT chWorkbook.
    RELEASE OBJECT chDesktop.
    RELEASE OBJECT chWorksheet.
    
    */
    
    reissobr curtiu isso.
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página