Ferramentas de Usuário

Ferramentas de Site


revistaprogramar_arquivo:18_edicao:python-msoffice

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.

Requisitos

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 simles, 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()

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

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
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:

Resultado da Execução do Script

Ler um Excel

A leitura de um Excel efectua-se com a mesma simplicidade com que se efectua a escrita. Para uma melhor exemplificação da potencialidade da interacção, este exemplo contém algumas diferenças em relação ao anterior. Assim, neste exemplo, o Excel não é tornado visível, ou seja, a aplicação executa mas a janela nunca é visível para o utilizador. Mesmo que o utilizador possua um documento Excel aberto, o documento lido pelo script nunca é tornado visível. No entanto, o comando de terminar a aplicação é executado e o Excel será fechado.

O comando de término da aplicação fará com que o Excel termine e feche todos os documentos abertos, mesmo que sejam documentos abertos pelo utilizador.

O script fica em espera caso a aplicação necessite de interacção por parte do utilizador, como por exemplo se o Excel questiona o utilizador se este pretende guardar alterações a um documento. Caso se pretenda que a aplicação não seja terminada, então o comando de término da aplicação não deve ser executado. Também neste exemplo, as referências a alguns objectos do documento Excel serão feitas pelo seu nome, ao contrário do que aconteceu no exemplo anterior onde essas referências eram efectuadas através dos seus indicies. Tal é possível porque o modelo suporta estas duas formas de referência para alguns dos objectos.

Eis o exemplo completo da leitura do documento Excel criado no exemplo acima. Este exemplo irá ler o documento e mostrará na shell os valores presentes no documento. De novo, o exemplo encontra-se comentado por forma a ser mais fácil acompanhar o código.

De novo, o exemplo começa por efectuar a ligação ao Excel e de seguida abre o documento.

# -*- coding: iso-8859-15 -*-
from win32com.client import Dispatch
 
# Efectuar ligação ao Excel 
xlApp = Dispatch("Excel.Application")
 
# Abre o documento
xlWbook = xlApp.Workbooks.Open('C:excel-python-pap.xls')

A folha é seleccionada através do seu nome, em detrimento da sua posição.

# Seleccionar a primeira folha de nome 'Exemplo'
xlWbook.Sheets('Exemplo').Select()
xlSheet = xlWbook.ActiveSheet

A leitura dos valores presentes nas células faz-se de forma bastante simples, sendo o seu valor mostrado na consola.

# Ler o cabeçalho
print xlSheet.Cells(1,1).Value
 
# Ler a versão
print xlSheet.Cells(2,1).Value, xlSheet.Cells(2,2).Value 
 
# Ler as datas
print xlSheet.Cells(3,1).Value, str(xlSheet.Cells(3,2).Value)[0:8]
print xlSheet.Cells(4,1).Value, xlSheet.Cells(4,2).Value

Por fim, o documento é fechado sem guardar alterações e a ligação ao Excel é terminada.

# Fechar sem guardar alterações 
xlApp.ActiveWorkbook.Close(SaveChanges=0)
 
# Terminar aplicação
xlApp.Quit()
 
# Limpar memória
del xlApp

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

Resultado da leitura do Excel

Controlo Total

Os exemplos anteriores ilustram a simplicidade com que se interage com o Excel a partir de Python. Esta simplicidade está presente mesmo em tarefas menos comuns quando se automatizam operações de manipulação de documento como a leitura e escrita e informação. O exemplo seguinte ilustra como é possível imprimir informação de forma automática e, por brincadeira, interagir com o sintetizador de fala do sistema.

Este exemplo requer que o sistema possua o sintetizador de fala e uma impressora correctamente instalados. Em certas condições, o Excel questionará se pretende instalar o sintetizador de fala, pelo que é necessário responder afirmativamente de forma a ouvir a frase "Python rules!"

Como sempre, o exemplo começa por efectuar a ligação ao Excel e de seguida abre o documento.

# -*- coding: iso-8859-15 -*-
from win32com.client import Dispatch
 
# Efectuar ligação ao Excel 
xlApp = Dispatch("Excel.Application")
xlApp.Visible = 1
 
# Abre o documento
xlWbook = xlApp.Workbooks.Open('C:excel-python-pap.xls')

A folha é seleccionada por nome e não por índice.

# Seleccionar a folha de nome 'Exemplo'
xlWbook.Sheets('Exemplo').Select()
xlSheet = xlWbook.ActiveSheet

A selecção da área a utilizar na impressão é efectuada através das coordenadas da folha, seguindo-se o comando de impressão do conteúdo dessa área.

# Seleccionar a informação a imprimir
xlSheet.PageSetup.PrintArea = "A1:B4"
 
# Imprimir as células seleccionadas
xlSheet.PrintOut()

De seguida é dada indicação para usar o motor de fala, uma funcionalidade um pouco menos comum.

# Falar
xlApp.Speech.Speak("Python rules!")

Por fim, a ligação ao Excel é finalizada sem que o documento seja actualizado.

# Fechar sem guardar alterações 
xlApp.ActiveWorkbook.Close(SaveChanges=0)
 
# Terminar aplicação
xlApp.Quit()
 
# Limpar memória
del xlApp

Interacção com Outras Aplicações

Os exemplos deste artigo centram-se na interacção com o Excel, mas é possível interagir com outras aplicações, como é o caso do Word e do Outlook. Essas interacções ficam como exercício lúdico para o leitor. :)

./M6

revistaprogramar_arquivo/18_edicao/python-msoffice.txt · Última modificação em: 2018/05/14 21:37 (edição externa)