PHP – Integração com o VBA (COM)

dev_banner

Vivemos em um mundo onde:

  • 90% das informações que temos estão em uma planilha em Excel;
  • 8% em algum arquivo Word e
  • 2% em um Banco de Dados (dos quais 50% são arquivos MDB ) 😉

Como então aproveitar todos estes arquivos e ainda trabalhar com PHP?

PHP e COM

O PHP possui uma biblioteca (só funciona em máquinas Windows) chamada COM (Component Object Model). Ela é uma camada orienta à objeto que define chamadas padronizadas que permitem em qualquer linguagem chamadas para um código escrito em outra linguagem.
Como nosso foco é a programação em VBA junto com o PHP, segue abaixo uma parte de um código que chama um arquivo Excel e executa algumas funções dentro dele:

// Inicia o Excel na máquina
$obj = new COM( "excel.application" ) or die( "unable to start MSExcel" );
// Função do VBA que desabilita as mensagens de alerta
$obj->Application->DisplayAlerts = False;
// Abre a Planilha Basa_de_Dados.xls do endereço de rede (padrão Win32) \guaratubaPRSC
$obj->Workbooks->Open( "\guaratuba\PRSC\Base_de_Dados.xls");
$i = 1;
do
{
// Pega o valor da celula que está na linha $i+3, coluna 7
$a[$i] = trim($obj->ActiveSheet->Cells($i+3, 7)->Value);
$i++;
print $i."- Valor 1: ".$a[$i]."nr";
} while (!empty($a[$i-1]));

Para quem conhece um pouco de VBA já deve ter percebido que na verdade estamos chamando os seguintes comando:


Application.DisplayAlerts = False
Workbooks.Open("\guaratuba\PRSC\Base_de_Dados.xls")
a(i) = ActiveSheet.Cells(i+3, 7).Value

A adaptação do código é direta e não exige quase nenhuma alteração.
Este tipo de biblioteca é MUITO útil quando se deseja importar planilhas extensas e que possuam dados armazenados em comentário, em cores ou em um formato que deve ser tratado antes embutido no PHP.

Outro ponto que é interessante é reutilizar macros escritas em VBA de dentro do PHP. Tal artifício permite que trabalhos antigos sejam reutilizados, acelerando o desenvolvimento. Para tanto, basta chamar a função como de costume:

$obj = new COM( "excel.application" ) or die( "unable to start MSExcel" );
$obj->Application->DisplayAlerts = False;
// Planilha que possui a macro 'processa_dados()' definida.
$obj->Workbooks->Open( "\guaratuba\PRSC\Base_de_Dados.xls");
// Chamada à função VBA definida dentro do arquivo Base_de_Dados.xls
$obj->processa_dados()

Para que esta técnica funciona, você deve ter certeza o usuário que está chamando o PHP tenha configurado o MS Excel para rodar macros sem perguntar caso contrário o código simplesmente fica congelado. Vale lembrar que se a chamada for feita de dentro do Apache, será necessário iniciar o serviço do Apache com um usuário normal, configurado na máquina (caso utilize esta técnica, a tauscheck.com recomenda que seja criado um usuário específico e que apenas arquivos conhecidos sejam chamados. JAMAIS permita que um usuário indique que arquivo deve ser processado).

Caso tenham dúvidas, comentários e/ou dicas à serem incluídas aqui, é só postar.