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

Criar tabelas no word via progress

Discussão em 'Progress 4GL' iniciado por Sergio Gonçalves, Maio 11, 2018.

  1. Sergio Gonçalves

    Sergio Gonçalves Sem Pontuação

    Boa noite.

    Alguém aqui já fez um programa progress para criar no word varias tabelas?

    Estou tentando aqui mas, sempre que adiciono uma nova tabela, a anterior some, ou seja, fica apenas uma tabela no word.

    Estou esquecendo de alguma coisa?
  2. joelscampos

    joelscampos Membro Participativo

    Para lidar com tabelas no Word, fazemos o seguinte:
    1. Temos arquivo "modelo.docx" com as tabelas nos moldes que precisamos.
    2. No Progress, abrimos duas instâncias (A e B) do mesmo "modelo.docx";
    3. A instância B é a que dará origem ao documento final, e a instância A usamos ela só para copiar os dados dela.
      • Para copiar um bloco:
        1. Selecionamos o bloco da instância A, usando este comando:
          • wrdApp-A:ActiveDocument:Tables():ITEM(2):SELECT.
        2. Copiamos o bloco selecionado, usando este comando:
          • wrdApp-A:SELECTION:COPY().
        3. Colamos na instância B, o conteúdo que está em memória:
          • wrdApp-B:SELECTION:pASTE().
    Exemplo:

    Código:
    PROCEDURE pr-monta-arquivo PRIVATE:
    
    
    
    
        /*------ Parametros de Entrada/ Saida --------------------------------------------------------------*/
        DEF OUTPUT PARAMETER arquivo-binario-par        AS MEMPTR                                   NO-UNDO.
       
    
    
           
       
    
        /*------ Variaveis locais --------------------------------------------------------------------------*/
        DEF VAR wrdApp-A                                AS COM-HANDLE                               NO-UNDO.
        DEF VAR wrdApp-B                                AS COM-HANDLE                               NO-UNDO.
        DEF VAR wordDoc-a                               AS COM-HANDLE                               NO-UNDO.
        DEF VAR wordDoc-b                               AS COM-HANDLE                               NO-UNDO.
        DEF VAR i                                       AS INT                                      NO-UNDO.
        DEF VAR nr-table-aux                            AS INT                                      NO-UNDO.
        DEF VAR nr-protocolo-aux                        AS INT                                      NO-UNDO.
        DEF VAR nm-arquivo-temporario-aux               AS CHAR                                     NO-UNDO.
       
       
       
    
       
    
    
        /*--------------------------------------------------------------------------------------------------*/
        /* Cria-se duas instâncias do Word. Inicialmente as duas instâncias recebem uma cópia do arquivo    */
        /* .docx que nos serve de modelo.                                                                   */
        /* Excluiremos algumas partes do documento na instância wrdApp-B, e, conforme for sendo necessário, */
        /* copiaremos as partes da wrdApp-A para a wrdApp-B.                                                */
        /*--------------------------------------------------------------------------------------------------*/
        CREATE "Word.Application" wrdApp-A.
        CREATE "Word.Application" wrdApp-B.
    
       
    
        wordDoc-a = wrdApp-A:Documents:Add(SEARCH("c:\tmp\modelo.docx")).
        wordDoc-b = wrdApp-B:Documents:Add(SEARCH("c:\tmp\modelo.docx")).
    
    
    
    
        /*--------------------------------------------------------------------------------------------------*/
        /* O documento(.docx) possui 4 tabelas, sendo:                                                      */
        /*  - Tabela 1, contem "Dados cadastrais";                                                          */
        /*  - Tabela 2, contem "Dados do Titular";                                                          */
        /*  - Tabela 3, contem "Dados do Dependente";                                                       */
        /*  - Tabela 4, contem a assinatura.                                                                */
        /* Os comandos abaixo apagam as tabelas 2 e 5, pois vamos adiciona-las uma-a-uma.                   */
        /*--------------------------------------------------------------------------------------------------*/
        wrdApp-B:ActiveDocument:Tables():ITEM(3):DELETE.
        wrdApp-B:ActiveDocument:Tables():ITEM(2):DELETE.
    
    
    
    
        /*--------------------------------------------------------------------------------------------------*/
        /* Preenche Operadora                                                                               */
        /*--------------------------------------------------------------------------------------------------*/
        wrdApp-B:ActiveDocument:Tables():ITEM(1):cell(1,2):Range:TEXT       = "abc def".
        wrdApp-B:ActiveDocument:Tables():ITEM(1):cell(3,1):Range:TEXT       = "xxxx xx xxx x x".
        wrdApp-B:ActiveDocument:Tables():ITEM(1):cell(3,2):Range:TEXT       = "123456".
       
       
       
    
    
    
        /*--------------------------------------------------------------------------------------------------*/
        /* Copia para a área de transferência a tabela do documento A(modelo).                              */
        /*--------------------------------------------------------------------------------------------------*/
        CASE tt-usuario.ds-parentesco:
            WHEN "Titular"      THEN wrdApp-A:ActiveDocument:Tables():ITEM(2):SELECT.    /*Seleciona o bloco "Dados do titular"*/
            WHEN "Dependente"   THEN wrdApp-A:ActiveDocument:Tables():ITEM(3):SELECT.    /*Seleciona o bloco "Dados do dependente"*/
        END CASE.
           
           
    
        /* Copia o bloco para o clipboard. */
        wrdApp-A:SELECTION:COPY().
    
    
        /*--------------------------------------------------------------------------------------------------*/
        /* Cola no documento B a tabela que está na área de transferência.                                  */
        /*--------------------------------------------------------------------------------------------------*/
        wrdApp-B:ActiveDocument:Tables():ITEM(wrdApp-B:ActiveDocument:Tables():COUNT - 1):SELECT.
        wrdApp-B:SELECTION:MoveRight().
        wrdApp-B:SELECTION:EndKey().
        wrdApp-B:SELECTION:TypeParagraph().
        wrdApp-B:SELECTION:PASTE(). /*Cola o conteudo que está no clipboard.*/
       
    
    
        /* Número da tabela corrente, a qual será preenchida logo abaixo. */
        ASSIGN nr-table-aux         = wrdApp-B:ActiveDocument:Tables():COUNT - 1.
    
    
        /*--------------------------------------------------------------------------------------------------*/
        /* Preenche a tabela campo-a-campo.                                                                 */
        /*--------------------------------------------------------------------------------------------------*/
        wrdApp-B:ActiveDocument:Tables():ITEM(nr-table-aux):cell(2,2):Range:TEXT        = "Severino Jose".          /* Nome */
        wrdApp-B:ActiveDocument:Tables():ITEM(nr-table-aux):cell(3,2):Range:TEXT        = "123456".                 /* CPF */
        wrdApp-B:ActiveDocument:Tables():ITEM(nr-table-aux):cell(4,2):Range:TEXT        = "Codigo identificacao".   /* Código de Identificação */
    
    
       
    
        wrdApp-B:SELECTION:FIND:EXECUTE("#dataHoje").
        wrdApp-B:SELECTION:TypeText(STRING(DAY(TODAY)) + " de " +
                                    ENTRY(MONTH(TODAY), "janeiro,fevereiro,março,abril,maio,junho,julho,agosto,setembro,outubro,novembro,dezembro")
                                    + " de " + STRING(YEAR(TODAY)) ).
    
    
        ASSIGN i = 0.
        DO ON ERROR UNDO, RETRY:
    
    
            IF RETRY
            THEN DO:
                ASSIGN i = i + 1.
                IF i > 2    /*Só exibe esta mensagem 2 vezes.*/
                THEN
                    RETURN.
                MESSAGE
                    "O arquivo PDF está aberto. Feche-o para que o programa possa prosseguir."   SKIP(2)
                    SESSION:TEMP-DIR + "Declaracao_Carteira_" + STRING(cd-carteira-inteira-aux,"9999999999999") + ".pdf" SKIP(2)
                    "--------------------------------------------------------------------------" SKIP
                    ERROR-STATUS:GET-MESSAGE(1)
                    VIEW-AS ALERT-BOX.
            END.
       
    
            ASSIGN nm-arquivo-temporario-aux        = SESSION:TEMP-DIR + "Declaracao_" + STRING(cd-carteira-inteira-aux,"9999999999999") + ".pdf".
    
            /*--------------------------------------------------------------------------------------------------*/
            /* Saves a document as PDF or XPS format.                                                           */
            /*--------------------------------------------------------------------------------------------------*/
            wrdApp-B:ActiveDocument:ExportAsFixedFormat(nm-arquivo-temporario-aux, /*OutputFileName*/
                                                        17,       /*ExportFormat(17-PDF format)*/
                                                        (IF THIS-PROCEDURE:PERSISTENT THEN FALSE ELSE TRUE),    /*OpenAfterExport*/
                                                        0,        /*Specifies whether to optimize for screen or print(0-Print).*/
                                                        0,        /*Range*/
                                                        1,        /*From*/
                                                        1,        /*To*/
                                                        0,        /*Item(0-Exports the document without markup.*/
                                                        TRUE,     /*IncludeDocProps*/
                                                        TRUE,     /*KeepIRM*/
                                                        0,        /*CreateBookmarks*/
                                                        TRUE,     /*DocStructureTags*/
                                                        TRUE,     /*BitmapMissingFonts*/
                                                        FALSE     /*UseISO19005_1*/
                                                        ) NO-ERROR.
       
            IF     ERROR-STATUS:ERROR
                OR ERROR-STATUS:NUM-MESSAGES    > 0
            THEN
                UNDO, RETRY.
    
    
            /* Ajusta a variavel MEMPTR conforme o tamanho do arquivo */
            FILE-INFO:FILE-NAME             = nm-arquivo-temporario-aux.
            SET-SIZE(arquivo-binario-par)   = FILE-INFO:FILE-SIZE.
    
            /* Carrega o arquivo para o parametro de saida. */
            INPUT FROM VALUE(nm-arquivo-temporario-aux) BINARY NO-MAP NO-CONVERT.
            IMPORT arquivo-binario-par.
            INPUT CLOSE.
    
    
            /* Se for uma chamada persistente, apaga o arquivo temporario. */
            IF THIS-PROCEDURE:PERSISTENT
            THEN
                OS-DELETE VALUE(nm-arquivo-temporario-aux).
    
           
        END. /* DO ON ERROR */
    
    
        FINALLY:
    
            /*--------------------------------------------------------------------------------------------------*/
            /* Fecha o Word, sem salva-lo.                                                                      */
            /*--------------------------------------------------------------------------------------------------*/
            wrdApp-A:VISIBLE = FALSE.
            wrdApp-B:VISIBLE = FALSE.
            wordDoc-a:Close(False).
            wordDoc-b:Close(False).
            wrdApp-A:Quit().
            wrdApp-B:Quit().
    
        END FINALLY.
    
    
    END PROCEDURE. /* pr-monta-arquivo */
    
  3. Sergio Gonçalves

    Sergio Gonçalves Sem Pontuação

    O problema estava relacionado ao uso correto do metodo Range(), agora estou conseguindo criar as tabelas.
    Crio as tabelas em tempo de execução, formatando linhas e colunas conforme a necessidade.

    Mas, a estratégia de copiar e colar deve poupar tempo de processamento.

    Obrigado.
  4. JGSilva

    JGSilva Sem Pontuação

    Olá Joelscampos, teria o exemplo deste docx para me disponibilizar?
    Estou tentando criar esta rotina e com seu docx de exemplo seria mais produtivo.

    grato.

Compartilhe esta Página