Lendo dados do Excel via DDE no Java \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 03 Horas 

 05 Min 

 23 Seg 

   Tempo restante da oferta: 03 05 23 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Lendo dados do Excel via DDE no Java  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

# Lendo dados do Excel via DDE no Java

 Aprenda como ler dados do Excel via DDE no Java, utilizando a biblioteca JDDE da Pretty Tools.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 6 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/lendo-dados-do-excel-via-dde-no-java.png)  

Todos os nossos cursos possuem suporte e os instrutores sempre procuram auxiliar os alunos, mesmo quando a dúvida não é relacionada ao conteúdo do curso (claro que isso é feito na medida do possível). Esses dias um aluno perguntou como poderia trabalhar com DDE no [Java](https://www.treinaweb.com.br/blog/o-que-e-e-como-comecar-com-java/). O DDE é uma tecnologia de comunicação entre programas considerada legada, mas que ainda é muito utilizada em certos ambientes.

Por ser algo legado, este tópico não se encaixa em nenhum dos cursos, mas para auxiliar o aluno, estudei sobre a tecnologia e vou abordá-la nesta artigo para que possa auxiliar outros que também necessitam fazer uso da mesma.

[  ![Java - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/java.svg)   Curso Java - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/java-fundamentos)

## O que é DDE?

Dynamic Data Exchange, também conhecido como DDE, é uma tecnologia de comunicação de aplicações criada pela Microsoft em 1987. O objetivo desta tecnologia é permitir que aplicações do Windows compartilhem dados dinâmicos.

Por exemplo, o valor de uma célula do Excel pode ser vinculado a um valor de outra aplicação. Quando a aplicação alterar este valor, a célula da planilha também é modificada.

O inverso também é possível, vincular uma aplicação à uma célula do Excel. Quando a célula for modificada, a aplicação será notificada e poderá ler o novo dado dela.

Apesar de ainda ser funcional, atualmente o DDE é considerado um recurso legado, geralmente sendo substituído por tecnologias mais atuais, como OLE (Object Linking and Embedding) e COM (Component Object Model). Mas devido a sua simplicidade e facilidade, ainda é muito utilizado para criar planilhas dinâmicas do Excel.

## Criando um cliente DDE em Java

Para compreender a simplicidade do DDE, vamos ver um exemplo simples de leitura de dados de uma planilha do Excel. Para isso, será necessário fazer uso da biblioteca [JDDE da Pretty Tools](http://jdde.pretty-tools.com/).

Antes de criar um projeto é importante ressaltar que esta biblioteca não é disponibilizada via [Maven](https://www.treinaweb.com.br/blog/o-que-e-gerenciador-de-dependencias/). Para utilizá-la é necessário adicionar manualmente o arquivo jar no classpath ou adicioná-la em um repositório local. Também é importante que seja adicionado ao PATH, as dlls fornecidas pela biblioteca.

Ao fazer este processo, será possível ler os dados de uma planilha com o código abaixo:

```java
import com.pretty_tools.dde.DDEException;
import com.pretty_tools.dde.DDEMLException;
import com.pretty_tools.dde.client.DDEClientConversation;

public class App 
{
    public static void main( String[] args )
    {
        try
        {
            final DDEClientConversation conversation = new DDEClientConversation();

            conversation.connect("Excel", "Planilha1");
            try
            {
                System.out.println("A1: " + conversation.request("R1C1"));
                conversation.execute("[close()]");
            }
            finally
            {
                conversation.disconnect();
            }
        }
        catch (DDEMLException e)
        {
            System.out.println("DDEMLException: 0x" + Integer.toHexString(e.getErrorCode())
                            + " " + e.getMessage());
        }
        catch (DDEException e)
        {
            System.out.println("DDEException: " + e.getMessage());
        }
        catch (Exception e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

```

Note que inicialmente é indicado que a conexão será realizada com o arquivo do Excel aberto e será lido os dados da planilha nomeada como “Planilha1”.

Caso houver mais de um arquivo do Excel aberto, o arquivo que será lido deve ser indicado:

```java
conversation.connect("Excel", "C:\Planilha.xlsx");

```

Neste caso, será lido os dados da primeira planilha do arquivo, mas é possível especificar outra:

```java
conversation.connect("Excel", "C:\\[Planilha.xlsx]Planilha2");

```

Com a conexão realizada, solicitamos os dados da primeira linha e primeira coluna:

```java
System.out.println("Célula A1: " + conversation.request("R1C1"));

```

Note que a solicitação segue o padrão “Row1 Column 1”. Assim, caso deseje ler todos os dados de uma coluna, basta especificar apenas o seu número:

```java
System.out.println("Coluna 1: " + conversation.request("C1"));

```

Para escrever algo em uma célula, pode ser utilizado o método `poke`:

```java
conversation.poke("R1C1", "Nova informação!");

```

Após ler ou escrever no arquivo, a conexão precisa ser fechada executando o comando `close()`:

```java
conversation.execute("[close()]");

```

Evitando assim qualquer problema.

## Criando um ouvinte DDE em Java

Uma área que ainda faz muito uso do DDE são instituições financeiras que operam em bolsa de valores. Neste ambiente, segundos podem significar milhões de reais, então ter os dados o quanto antes faz muita diferença. Desta forma, com o DDE “traders” conseguem criar planilhas dinâmicas, para sempre ter dados atualizados e podem tomar as decisões mais acertivas.

Neste cenário, com as células de uma planilha podendo mudar a todo momento, podemos criar um ouvinte que será informado quando os dados forem alterados:

```java
import com.pretty_tools.dde.DDEException;
import com.pretty_tools.dde.client.DDEClientConversation;
import com.pretty_tools.dde.client.DDEClientEventListener;
import com.pretty_tools.dde.DDEMLException;

public class App 
{
    public static void main( String[] args )
    {
        try
        {
            final DDEClientConversation conversation = new DDEClientConversation();

            conversation.setEventListener(new DDEClientEventListener()
            {
                public void onDisconnect()
                {
                    System.out.println("onDisconnect()");
                }

                public void onItemChanged(String topic, String item, String data)
                {
                    System.out.println("onItemChanged(" + topic + "," + item + "," + data.trim() + ")");
                }
            });

            System.out.println("Connecting...");
            conversation.connect("Excel", "Planilha1");
            try
            {
                conversation.startAdvice("R1C1");

                System.out.println("Precione qualquer tecla para finalizar!");
                System.in.read();

                conversation.stopAdvice("R1C1");
            }
            finally
            {
                conversation.disconnect();
            }
        }
        catch (DDEMLException e)
        {
            System.out.println("DDEMLException: 0x" + Integer.toHexString(e.getErrorCode())
                            + " " + e.getMessage());
            e.printStackTrace();
        }
        catch (DDEException e)
        {
            System.out.println("DDEException: " + e.getMessage());
        }
        catch (Exception e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

```

Note que a forma de conexão não muda, entretanto agora é definido um ouvinte:

```java
conversation.setEventListener(new DDEClientEventListener()
{
    public void onDisconnect()
    {
        System.out.println("onDisconnect()");
    }

    public void onItemChanged(String topic, String item, String data)
    {
        System.out.println("onItemChanged(" + topic + "," + item + "," + data.trim() + ")");
    }
});

```

Que sempre será chamado quando a célula da linha 1 e coluna 1 for modificada:

```java
 conversation.startAdvice("R1C1");

```

## Criando o seu servidor DDE

[  ![Android - Criação de aplicativos para SmartWatch com o Android Wear](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/android.svg)   Curso Android - Criação de aplicativos para SmartWatch com o Android Wear Conhecer o curso ](https://www.treinaweb.com.br/curso/desenvolvimento-de-aplicativos-para-smartwatch-com-android-wear-completo)

Caso deseje fornecer dados para outras aplicações via DDE, a biblioteca também permite a criação de um servidor. Para isso, basta estender a classe abstrata `DDEServer`:

```java
import com.pretty_tools.dde.ClipboardFormat;
import com.pretty_tools.dde.DDEException;
import com.pretty_tools.dde.DDEMLException;
import com.pretty_tools.dde.server.DDEServer;

import java.util.Arrays;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

public class App 
{
    private static final String SERVICE = "TreinaServer";
    private static final String TOPIC = "TopicoExemplo";
    private static final String MY_ADVISE_ITEM = "MeuAdvise";
    private static final String MY_REQUEST_ITEM = "MinhaRequisicao";
    private static final String MY_POKE_ITEM = "MeuPoke";
    private static final List ITEMS = Arrays.asList(MY_ADVISE_ITEM, MY_REQUEST_ITEM, MY_POKE_ITEM);

    public static void main( String[] args )
    {
        try
        {
            // Evento para esperar pela disconexão
            final CountDownLatch eventStop = new CountDownLatch(1);
            final AtomicInteger num = new AtomicInteger(1);

            final DDEServer server = new DDEServer(SERVICE) {
                @Override
                protected boolean isTopicSupported(String topicName)
                {
                    return TOPIC.equalsIgnoreCase(topicName);
                }

                @Override
                protected boolean isItemSupported(String topic, String item, int uFmt)
                {
                    return isTopicSupported(topic)
                           && ITEMS.contains(item)
                           && (uFmt == ClipboardFormat.CF_TEXT.getNativeCode() || uFmt == ClipboardFormat.CF_UNICODETEXT.getNativeCode());
                }

                @Override
                protected boolean onExecute(String command)
                {
                    System.out.println("onExecute(" + command + ")");

                    if ("stop".equalsIgnoreCase(command))
                        eventStop.countDown();

                    return true;
                }

                @Override
                protected boolean onPoke(String topic, String item, String data)
                {
                    System.out.println("onPoke(" + topic + ", " + item + ", " + data + ")");

                    return true;
                }

                @Override
                protected boolean onPoke(String topic, String item, byte[] data, int uFmt)
                {
                    System.out.println("onPoke(" + topic + ", " + item + ", " + data + ", " + uFmt + ")");

                    return false; // Não suportado
                }

                @Override
                protected String onRequest(String topic, String item)
                {
                    System.out.println("onRequest(" + topic + ", " + item + ")");

                    return item + " data " + num;
                }

                @Override
                protected byte[] onRequest(String topic, String item, int uFmt)
                {
                    System.out.println("onPoke(" + topic + ", " + item + ", " + uFmt + ")");

                    return null; // Não suportado
                }
            };

            System.out.println("Iniciando...");
            server.start();

            final Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run()
                {
                    num.incrementAndGet();
                    try {
                        System.out.println("Notificando clientes");
                        server.notifyClients(TOPIC, MY_ADVISE_ITEM);
                    } catch (DDEException e) {
                        System.out.println("DDEClientException: " + e.getMessage());
                        cancel();
                    }
                }
            }, 1000L, 500L);

            System.out.println("Esperando para parar...");
            eventStop.await();
            System.out.println("Parando...");
            timer.cancel();
            server.stop();
            System.out.println("Finalizando");
        }
        catch (DDEMLException e)
        {
            System.out.println("DDEMLException: 0x" + Integer.toHexString(e.getErrorCode())
                            + " " + e.getMessage());
            e.printStackTrace();
        }
        catch (DDEException e)
        {
            System.out.println("DDEException: " + e.getMessage());
        }
        catch (Exception e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

```

Note que a classe `DDEServer` requer a implementação de métodos que serão executados quando o cliente solicitar um dado (`onRequest`) e quando ele requerer uma atualização (`onPoke`). A implementação de cada método irá depender das regras de negócio da aplicação.

O servidor acima pode ser testado utilizando os exemplos anteriores, bastando informar os dados de conexão dele:

```java
conversation.connect("TreinaServer", "TopicoExemplo");

```

Mesmo ainda estando funcional, o DDE só deve ser utilizado quando não for fornecida outras formas de comunicação. Atualmente existem várias opções de comunicação entre aplicações mais seguras que o DDE.

Por hoje é só. Até a próxima!

- [ #Java ](https://www.treinaweb.com.br/blog/tag/java)
- [ #DDE ](https://www.treinaweb.com.br/blog/tag/dde)
- [ #Excel ](https://www.treinaweb.com.br/blog/tag/excel)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/12/14174401/capa-BI-400x280.png)  [ Tecnologia ](https://www.treinaweb.com.br/blog/categoria/tecnologia) 

     7 anos atrás

    ##  [ Business Intelligence (BI): o que é e para que serve? ](https://www.treinaweb.com.br/blog/business-intelligence-bi-o-que-e-e-para-que-serve) 

     Confira neste artigo como o BI pode trazer benefícios para as empresas.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/02/18160141/MANIPULANDO-ARQUIVOS-PYTHON-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     7 anos atrás

    ##  [ Manipulando arquivos com Python ](https://www.treinaweb.com.br/blog/manipulando-arquivos-com-python) 

     Saber trabalhar com arquivos é essencial para qualquer desenvolvedor e é certo que em sua vida como desenvolvedor, em algum momento você terá que lidar com esta situação. Por isso, veremos neste artigo como manipular arquivos com Python.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2024/01/como-lidar-sobrecarga-informacoes-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     3 anos atrás

    ##  [ Como lidar com a sobrecarga de informações no mundo da tecnologia? ](https://www.treinaweb.com.br/blog/como-lidar-com-a-sobrecarga-de-informacoes-no-mundo-da-tecnologia) 

     Confira nesse artigo algumas dicas para que você não tenha uma sobrecarga de informações e consiga extrair o que realmente é necessário.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/03/dicionario-programador-iniciante-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     4 anos atrás

    ##  [ Dicionário básico para quem está iniciando na programação ](https://www.treinaweb.com.br/blog/dicionario-basico-para-quem-esta-iniciando-na-programacao) 

     Você está iniciando na programação e está perdido nos termos e siglas que você lê ou ouve falar por aí? Confira neste artigo um guia rápido para você começar a se familiarizar com esse universo da TI.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/07/DICA-CODIGO-JAVA-1-400x280.jpg)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     3 anos atrás

    ##  [ Dica de Código: Programação Assíncrona com CompletableFuture no Java ](https://www.treinaweb.com.br/blog/dica-de-codigo-programacao-assincrona-com-completablefuture-no-java) 

     Domine a programação assíncrona com CompletableFuture no Java e impulsione o desempenho de sua aplicação. Leia agora!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/GUIA-INTRODUÇÃO-PROGRAMAÇÃO-400x280.png)  [ Algoritmos ](https://www.treinaweb.com.br/blog/categoria/algoritmos) 

     6 anos atrás

    ##  [ Guia de introdução à programação ](https://www.treinaweb.com.br/blog/guia-de-introducao-a-programacao) 

     Entenda os conceitos fundamentais para iniciar seus estudos na área de desenvolvimento neste guia de introdução a programação.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/09/guia-termos-comuns-seguranca-400x280.png)  [ Guias ](https://www.treinaweb.com.br/blog/categoria/guias) 

     3 anos atrás

    ##  [ Guia de termos comuns de segurança ](https://www.treinaweb.com.br/blog/guia-de-termos-comuns-de-seguranca) 

     Neste guia de segurança veremos alguns dos principais ataques que podem acontecer na web.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/03/o-que-e-fastapi-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     5 anos atrás

    ##  [ O que é FastAPI? ](https://www.treinaweb.com.br/blog/o-que-e-fastapi) 

     Neste artigo vamos falar um pouco sobre o funcionamento, história e quais as principais características do framework web FastAPI.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/técnicas-acessibilidade-web-400x280.png)  [ Acessibilidade e User Experience (UX) ](https://www.treinaweb.com.br/blog/categoria/acessibilidade-e-user-experience-ux) 

     6 anos atrás

    ##  [ Técnicas de acessibilidade para deixar o seu site mais inclusivo ](https://www.treinaweb.com.br/blog/tecnicas-de-acessibilidade-para-deixar-o-seu-site-mais-inclusivo) 

     Conheça as principais ferramentas e técnicas de acessibilidade para web. Veja também tipos de dificuldades e deficiências atendidas por elas.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/03/iterators-php-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Generators no PHP ](https://www.treinaweb.com.br/blog/generators-no-php) 

     Saiba o que são Iterators e Generators, bem como os seus casos de uso.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/06/11140050/sockets-redes-tcp-udp-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Programação de Sockets em PHP ](https://www.treinaweb.com.br/blog/programacao-de-sockets-em-php) 

     Neste artigo veremos uma introdução à programação de sockets com o PHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/09/27171418/loiane-groner-400x280.png)  [ Entrevistas ](https://www.treinaweb.com.br/blog/categoria/entrevistas) 

     8 anos atrás

    ##  [ TW Entrevista 12: Loiane Groner ](https://www.treinaweb.com.br/blog/tw-entrevista-12-loiane-groner) 

     Fizemos uma série de entrevistas chamada "TW Entrevista". A entrevistada de hoje é a Loiane Groner, que já escreveu diversos livros publicados internacionalmente e possui os títulos GDE (Google Developer Expert) e Microsoft MVP (Most Valuable Professional).

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **03h 05min 23s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
