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

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 progamaçã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) \\guaratuba\PRSC
$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]."\n\r";
} 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 imbutido 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 inicar 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).

É claro que esta biblioteca pode fazer muito mais do que estou apresentando aqui, porém esta não é a idéia deste post.

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

Sds,

2 Comentários so far »

  1. Rodrigo said

    am julho 16 2008 @ 15:15

    Boa tarde, eu estou tentando fazer exatamente o que está escrito neste post, porém têm dado um erro, será que poderias me ajudar? Segue o erro abaixo:

    Fatal error: Uncaught exception ‘com_exception’ with message ‘Source: Microsoft Office ExcelDescription: ‘\\acswid3\app\sistema\mapeamento_fiscalizacao\excel\test.xls’ could not be found. Check the spelling of the file name, and verify that the file location is correct. If you are trying to open the file from your list of most recently used files on the File menu, make sure that the file has not been renamed, moved, or deleted.’ in E:\App\Sistema\Mapeamento_Fiscalizacao\excel\exc.php:47 Stack trace: #0 E:\App\Sistema\Mapeamento_Fiscalizacao\excel\exc.php(47): variant->Open(‘\\acswid3\app\s…’) #1 {main} thrown in E:\App\Sistema\Mapeamento_Fiscalizacao\excel\exc.php on line 47

  2. Eduardo Mendes said

    am agosto 9 2009 @ 01:15

    Olá Rodrigo said comentei umas linhas do código e modifiquei apenas pra teste e deu certo. Uma observação: coloquei o caminho apenas com aspas simples porque testei local.
    Espero que te ajude no entendimento

    Application->DisplayAlerts = False;
    // Abre a Planilha Basa_de_Dados.xls do endereço de rede (padrão Win32) \\guaratuba\PRSC
    $obj->Workbooks->Open( ‘C:\xampp\htdocs\com\planilha.xls’);
    $i = 1;
    //do
    //{
    // Pega o valor da celula que está na linha $i+3, coluna 7
    $a[$i] = trim($obj->ActiveSheet->Cells(2, 2)->Value);//$i+
    //$i++;
    print “Valor: “.$a[$i].”\n\r”;
    //} while (!empty($a[$i-1]));
    ?>

    Não conheço bem o COM mas estou pesquisando porque pretendo criar umas aplicações que manipulem e gerem arquivos .doc e .xls

    no phpbrasil tem um artigo interessante:
    http://phpbrasil.com/artigo/nxbI3qmFsukd/ampliando-as-possibilidades-do-php-com-componentes-com

    Ainda não achei nada a respeito de como realmente manipular os métodos das ‘api’s’ do word, se souber de alguma coisa, por favor me avise por email – obrigado!

Comment RSS · TrackBack URI

Deixe um comentário

Nome: (Required)

eMail: (Required)

Website:

Comment: