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?
Para lidar com tabelas no Word, fazemos o seguinte: Temos arquivo "modelo.docx" com as tabelas nos moldes que precisamos. No Progress, abrimos duas instâncias (A e B) do mesmo "modelo.docx"; 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: Selecionamos o bloco da instância A, usando este comando: wrdApp-A:ActiveDocument:Tables():ITEM(2):SELECT. Copiamos o bloco selecionado, usando este comando: wrdApp-A:SELECTION:COPY(). Colamos na instância B, o conteúdo que está em memória: wrdApp-B:SELECTIONASTE(). 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 */
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.
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.