Com o crescente advento da tecnologia da informação cada vez mais vemos a possibilidade de automatizar tarefas repetitivas e maçantes. A busca por soluções automatizadas pode trazer inúmeros benefícios, tais como: melhor padronização dos resultados e aumento da produtividade. Os funcionários deixam de gastar seu tempo em tarefas tediosas e time-consuming e podem se concentrar em atividades de mais alto nível.

Uma das principais demandas nos diversos setores da economia é a automatização da geração e manipulação de documentos. Imagine o seguinte cenário: uma grande indústria faz avaliações semanais e precisa gerar gráficos para mostrar o desempenho dos seus indicadores de produção. Todos os dados necessários para a geração dos gráficos estão disponíveis no sistema MES da empresa, mas, ainda assim, toda semana um funcionário precisa coletar esses dados, preencher uma planilha e montar os gráficos para a apresentação. Além desse funcionário perder um tempo considerável executando esta tarefa, o resultado está sujeito a erros banais, como de digitação, e cada funcionário pode executar a tarefa da maneira que desejar, levando a resultados sem padronização.

Não há motivos para que um cenário como este seja mantido nos dias de hoje! Diversas ferramentas estão disponíveis para auxiliar a implementação de aplicações capazes de realizar tarefas complexas relacionadas com a geração e manipulação de documentos. Neste post vamos nos concentrar especificamente na manipulação de documentos OpenXML utilizando a linguagem de programação Java.

Mas por que OpenXML e Java?

OpenXML , também conhecido como Office Open XML ou OOXML, é um padrão desenvolvido pela Microsoft para geração de documentos office baseado na linguagem XML. Além de ser um padrão aberto, ele é suportado por inúmeras aplicações, fazendo com que documentos nesse formato tenham alta interoperabilidade e permitindo uma fácil manipulação dos arquivos. O padrão também possui extensa documentação e foi adotado pela ISO (ISO 29500). Para trabalhar com OpenXML em qualquer linguagem tudo o que você precisa é de uma biblioteca capaz de abrir e salvar arquivos zip e de um XML parser. Isso porque os documentos no padrão OpenXML nada mais são do que vários arquivos XML compactados em um arquivo zip. Se falta mais alguma coisa pra te convencer da relevância do OpenXML, vale destacar que este é o atual padrão de geração dos pacotes do Microsoft Office, principal suíte de aplicativos para escritório.

Por ter sido desenvolvido pela Microsoft é de se esperar que exista uma API para auxiliar a criação de aplicações .NET capazes de manipular arquivos OpenXML. O Open XML SDK  é um kit de desenvolvimento que traduz os documentos em um modelo de dados amigável, facilitando o desenvolvimento das aplicações. O mais interessante é que as funções das bibliotecas do Open XML SDK traduzem os principais comandos das ferramentas do Microsoft Office. Ou seja, um desenvolvedor acostumado com o pacote Microsoft Office vai encontrar certa facilidade no desenvolvimento da aplicação, pois a tarefa de implementação será mais intuitiva. Porém, uma das principais vantagens do padrão OpenXML é permitir que a manipulação dos documentos não seja tão amarrada às ferramentas da Microsoft então vamos agora explorar a manipulação desses documentos utilizando Java que é atualmente a linguagem de programação mais popular no mundo

Usando Java para resolver o problema da geração dos relatórios semanais

Voltando ao nosso cenário: vamos imaginar que aquela empresa use os pacotes Microsoft Office e tenha seus sistemas desenvolvidos em Java. Como o problema da geração dos relatórios semanais pode ser resolvido? Uma possível abordagem é a criação de templates das planilhas do Excel e das apresentações do Power Point e a aplicação seria responsável pela leitura desses templates, manipulação e geração de novos arquivos baseados nos modelos.

Para isso, a aplicação tem que ser capaz de ler arquivos OpenXML e executar operações em cima deles tais como: cópia de sheets do Excel e slides do Power Point, inserção de valores em células das planilhas, criação de planilhas, linhas e células, manipulação de tabelas e muitas outras tarefas de diversos níveis de complexidade.

Apache POI

A primeira solução que vem em mente é procurar uma API, que assim como o OpenXML SDK da Microsoft, nos permita realizar a manipulação dos arquivos utilizando classes de alto nível. A solução campeã de indicações neste caso certamente será a utilização do pacote de bibliotecas Apache POI. O Apache POI é um projeto open source gerenciado pela Apache Software Foundation e puramente implementado utilizando Java. Ele suporta a manipulação de arquivos OpenXML desde a versão 3.5, lançada em 2009. Além da própria página do projeto trazer uma documentação completa, tutoriais e exemplos de aplicação, você consegue encontrar diversas referências em uma rápida busca no Google.

Problema resolvido? Infelizmente não. Assim como qualquer solução, esta possui limitações e, neste caso, as limitações batem de frente com as nossas necessidades. A principal barreira é que as funções de cópia de sheets e slides não copiam os objetos presentes nesses elementos como imagens e gráficos, e isso nos leva a buscar outras soluções.

Macros + JACOB

A segunda solução analisada é a manipulação baseada em macros. Podemos salvar macros nos templates que executem as operações de manipulações a serem usadas e invocar essas macros utilizando Java. E para isso é possível utilizarmos JACOB (JAva-COm Bridge). JACOB permite que programas em Java façam chamadas nativas do sistema. Embora o acesso a referências e documentação não seja tão fácil quando comparado à POI, esta é uma ferramenta poderosa e muito versátil, que não se aplica somente ao nosso problema. Utilizando JACOB é possível abrir a planilha de dados dentro do executável do próprio Excel permitindo acesso direto (via código) aos comandos que o usuário pode executar com um simples clique, tal qual duplicar uma planilha ou, no nosso caso, executar as macros criadas.  Mas, além da alta complexidade de manipulação dos arquivos nesta solução, para que ela funcione é necessário “distribuir” alguns arquivos no sistema. Por exemplo, uma DLL precisa estar em um caminho específico ou uma variável de ambiente precisa ser adicionada. Isso pode levar a problemas, por exemplo, na migração da aplicação para outro servidor.

OpenXML

Também podemos considerar trabalhar de uma forma mais baixo nível e utilizar apenas uma biblioteca de compactação/descompactação de arquivos zip e um JAR de manipulação XML. Porém, tarefas como duplicar objetos e alterar referências tem uma complexidade muito elevada. Além disso, é preciso dar uma atenção especial à codificação (UTF-8, ISO) dos arquivos, pois uma codificação errada pode comprometer o documento.

Web Service

Além das opções já citadas também é possível se render às ferramentas da Microsoft, desenvolver uma aplicação em .NET que lide com a manipulação dos arquivos e disponibilizar os serviços para sua solução Java através de um web service. Mas, além de elevar a complexidade arquitetural da aplicação, estaríamos nos rendendo e apenas contornando o problema ao invés de encontrar uma solução que se desprenda da Microsoft.

A melhor solução para o caso: Apache POI + OpenXML 

E afinal, após avaliar as ferramentas disponíveis, qual a solução mais adequada para o problema da geração dos relatórios semanais da empresa? Pela facilidade de utilização e extensa documentação seria muito bom poder usar as bibliotecas do Apache POI, mas, como podemos contornar as limitações levantadas?

Com a POI também é possível acessar e manipular diretamente os arquivos XML que compõe os documentos e seus objetos, o que nos permite juntar a praticidade que ela nos oferece para executar as operações mais macro utilizando suas classes pré-implementadas com a versatilidade da manipulação mais baixo nível que conseguimos atingir fazendo modificações diretamente no XML.

Sendo assim, nossa aplicação Java pode utilizar os métodos da POI para ler os templates e executar algumas operações como a criação, cópia e exclusão de sheets do Excel e a manipulação do XML nos permite contornar as limitações e executar tarefas complexas e particulares da nossa solução que não são cobertas pelos métodos da POI, como a exclusão de uma série ou um item de legenda em um gráfico.

Agora sim! Chega de perder tempo gerando gráficos e apresentações semanais. Com um clique a aplicação pode trazer para o usuário os arquivos, poupando tempo e garantindo um padrão de qualidade dos documentos.

Este é apenas um exemplo de utilização da manipulação de documentos OpenXML via Java mas vimos aqui que existem diversas abordagens possíveis. Uma delas pode ser ideal para construir a sua solução. Tem alguma dúvida? Entre em contato com a gente.

 

Por: Olívia Coelho
Revisão: Jéssica Saliba