quinta-feira, 14 de julho de 2011

Excel em 64Bits

O que fazer quando a tecnologia avança e ficamos enroscados em sistemas já considerados mais obsoletos? Esse é o problema do desenvolvimento de aplicações, cuja solução e principal bandeira é o Genexus, não? que evolui conforme a tecnologia.

Jakarta POI ou ExcelLite

Faz certo tempo que deixei de utilizar o Windows XP e passei para um modelo mais 'evoluido' de sistema operacional com 64 bits, com desempenho melhor, melhor interface, e muitos outros melhores. O comportamento do Genexus foi exemplar, nenhum problema, mas .... Tinha um tal de Jakarta POI no meio do caminho, e vinculado a esse um J#, que combinados geravam uma bela tela amarela meio explosiva ao se tentar gerar ou ler uma planilha XLS.  

Claro que nesses momentos de grande aflição devemos agradecer às almas generosas espalhadas no mundo afora que dedicam grande esforço para disponibilizar gratuitamente soluções muito boas, e o JakartaPOI era uma dessas, que podia ser baixada e utilizada livremente no sourceforge (http://sourceforge.net/projects/jbyjsharp/files/Jakarta%20POI/).

Então, seguindo as recomendações do SAC Artech (http://www2.gxtechnical.com/main21/hscver01d.aspx?E%3B15%3B4%3B61%3B2%3B1%3BO%3B,2,19780) que já registra essa situação, chegamos ao Excel Lite (http://www.gemboxsoftware.com/spreadsheet/free-version.), e para nossa grande surpresa, ao instalar e copiar a DLL correta na pasta BIN da aplicação solucionou nossa situação ‘emergencial’.  Esse programa tem o requinte de incluir a DLL´s para todas as versões do .Net Framework.

Lendo Arquivos XLS

Então, só para não perder o costume, nos resta programarmos alguma coisa para acompanhar o tema básico que foi resolver o problema com a tal DLL.  Desta forma, programamos a leitura de um arquivo XLS, usando o tipo Genexus ExcelDocument.

A lógica muito simples consistia em ler as linhas de uma planilha até que se encontre uma linha vazia, nesse momento o processo de leitura se encerra.  Para cada linha lida na planilha realizamos o load em um Grid.

Event Start
     &Arquivo = 'planilha.xls'
EndEvent
Event 'Leitura'
     &Planilha.UseAutomation = 0
     &Planilha.Open(&Arquivo)
     if &Planilha.ErrCode <> 0
          msg(&Planilha.ErrDescription)
     else
          &linha = 2  // inicio dos dados
          do while true
              &CidadeId   = &Planilha.Cells(&linha,1).Text.ToNumeric()
              if &CidadeId.IsEmpty()
                   exit
              endif
              &CidadeNome = &Planilha.Cells(&linha,2).Text
              load
              &linha += 1
          enddo
     endif
EndEvent

Quanto a interface e as variáveis temos.

E as variáveis.


Não costumo encerrar o post com nenhuma mensagem negativa, mas desta vez não tem jeito, porque a rotina funciona que é uma maravilha caso seu ambiente seja o Windows, mas temos um pequeno problema pra resolver.  Se o sistema é Web, como o meu, a planilha deve estar fisicamente no servidor para ser lida, então, o problema não termina aqui, devemos realizar um upload da dita cuja antes de testar o processo, mas esse assunto podemos deixar pra depois né.