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: