Interacção Python-MS Office

Interagir de forma automática com as aplicações Excel e Word da Microsoft é algo que permite eliminar tarefas repetitivas e aborrecidas ao mesmo tempo que aumenta a produtividade e reduz a possibilidade de erro humano. Interagir com estas aplicações através de Python é bastante simples, basta algumas linhas de código para ler ou escrever informação nesses documentos.

Antes de mais, é necessário termos o Office da Microsoft correctamente instalados no Windows. De seguida, basta ter o Python 2.6 e a extensão Python Python Win32 Extensions para a versão 2.6. À data deste artigo a extensão está disponível para várias versões de Python, até à versão 2.6, pelo que se estiver a usar versões mais antigas de Python é provável que a extensão a suporte. Espera-se uma versão para Python 3.0 para breve.

Interacção

Uma vez tudo instalado é necessário compreender o modelo de funcionamento da interacção envolvida. A interacção a partir de um script de Python efectua-se através da tecnologia COM e do Office Object Model, que permite simular a utilização da aplicação por parte de um utilizador humano. Tal facto implica algumas restrições. Dado que a interacção simula um utilizador, é necessário que haja um utilizador com sessão aberta no sistema e que o utilizador não interaja com as aplicações enquanto o script Python faz a sua tarefa, dado que as aplicações serão abertas durante a operação.

Uma vez compreendido o modelo de interacção, a codificação da interacção é bastante simples. Os exemplos seguintes seguem uma ordem lógica apenas por motivos de melhor compreensão do artigo.

Para iniciar a interacção, é necessário recorrer à extensão que foi previamente instalada. Tal obtém-se carregando a biblioteca win32com.client:

from win32com.client import Dispatch

Para invocar a aplicação recorre-se ao objecto Dispatch, importado no exemplo anterior, tendo como argumento a aplicação que se pretende manipular e recebe-se um handler que contém a ligação à aplicação.

xlApp = Dispatch("Excel.Application")

Para podermos observar a janela, é necessário torná-la visível, para tal atribui-se o valor 1 à propriedade Visible. Afectar o valor 0 à propriedade torna a janela invisível.

xlApp.Visible = 1

Para terminar a aplicação recorre-se ao método Quit(), sendo assim fechada a aplicação.

xlApp.Quit()

Por fim, liberta-se o handler que mantinha a ligação:

del xlApp

Exemplo

O exemplo seguinte abre o Excel, torna-o visível e por fim termina a aplicação. Para executar o exemplo, garante que não tem o Excel aberto. Provavelmente a execução do exemplo será tão rápido que o Excel quase não será visível no ecrã.

from win32com.client import Dispatch

xlApp = Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Quit()
del xlApp

Manipular um Excel

O Excel Object Model indica quais os objectos, propriedades e métodos que se encontram disponíveis para efectuar a manipulação de um documento Excel. De forma simples, Application refere a aplicação, Workbook refere um documento, Worksheet refere uma página, Cell refere uma célula e Range refere um conjunto de células.

Assim, para criar um novo documento, basta dizer à aplicação que esta deve adicionar um novo Workbook:

xlApp.Workbooks.Add()

Criar uma nova folha ao documento é bastante simples, recorrendo ao documento activo, referenciado por ActiveWorkbook, adiciona-se uma nova folha ao mesmo:

xlSheet = xlApp.ActiveWorkbook.Worksheets.Add()

Atribuir ou ler valores às células de um folha é igualmente simples, basta referir a célula pela sua coordenada e atribuir-lhe o valor pretendido, ou requisitar o valor actual:

# Atribuir valor
xlSheet.Cells(1,1).Value = 'Exemplo'
# Ler valor
print xlSheet.Cells(1,1).Value

Escrever um Excel

Eis um exemplo completo da criação de um documento Excel de nome excel-python-pap.xls na raiz do disco C:. O exemplo encontra-se comentado por forma a ser mais fácil acompanhar o código.

Antes de mais, é necessário efectuar uma ligação do Python ao Excel.

# -*- coding: iso-8859-15 -*-
from win32com.client import Dispatch
import datetime
import sys

# Efectuar ligação ao Excel 
xlApp = Dispatch("Excel.Application")
xlApp.Visible = 1

De seguida trabalhamos com o documento de forma a ficarmos apenas com uma única folha, cujo nome é modificado.

# Adicionar um novo documento
xlWbook = xlApp.Workbooks.Add()

# Eliminar todas as folhas excepto a primeira
for i in range(xlWbook.Sheets.Count, 1, -1): 
xlWbook.Sheets(i).Delete()

# Seleccionar a primeira folha
xlWbook.Sheets(1).Select()
xlSheet = xlWbook.ActiveSheet

# Alterar o nome da folha para "Exemplo"
xlSheet.Name = "Exemplo"

Passando às células, é fácil a atribuição de valores de vários tipos, desde texto a datas ou até fórmulas do Excel.

# Atribuir strings
xlSheet.Cells(1,1).Value = 'Revista Portugal-a-Programar'
xlSheet.Cells(2,1).Value = 'Python'
xlSheet.Cells(3,1).Value = 'Criada Em'
xlSheet.Cells(4,1).Value = 'Modificada Em'

# Atribuir valor numérico
xlSheet.Cells(2,2).Value = str(sys.version_info[0]) + "." + str(sys.version_info[1])

# Atribuir uma data
xlSheet.Cells(3,2).Value = datetime.date.today()

# Atribuir uma fórmula
xlSheet.Cells(4,2).Formula = '=Now()'

As funcionalidades de formatação estão também disponíveis, permitindo uma visualização mais atractiva ao documento.

# Toque artistico para o título :)
xlSheet.Cells(1,1).Font.Bold = True
xlSheet.Cells(1,1).Font.ColorIndex = 5
xlSheet.Range("A1:B1").Merge()

# Ajustar tamanhos das colunas
for i in range(1,3):
xlSheet.Columns(i).Autofit

Por fim, o documento é guardado e a ligação ao Excel é finalizada.

# Gravar o documento
xlWbook.SaveAs ('C:\\excel-python-pap.xls')

# Terminar aplicação
xlApp.Quit()

# Limpar memória
del xlApp

Nota: Note-se que a execução consecutiva deste script fará com que a segunda execução apareça a janela de confirmação de sobrescrita do documento, uma vez que este já existe.

Após a execução do script o documento gerado terá o seguinte aspecto:

Python/MS Office: criar documento Excel

Publicado na edição 18 (PDF) da Revista PROGRAMAR.