Python para Desenvolvedores

2ª edição, revisada e ampliada

Apêndice E: BrOffice.org


BrOffice.org é um conhecido pacote de automação de escritórios de código aberto, que inclui editor de textos, planilha e outros aplicativos. Além disso, o BrOffice.org também suporta Python (entre outras linguagens):

  • Como linguagem de macro, permitindo a automatização de tarefas.
  • Para a construção de extensões (add ons).
  • Em um serviço para atender conexões, através de uma API chamada UNO (Universal Network Objects).

Exemplo de macro:

In [ ]:
# A macro deve ser executada a partir do
# BrOffice.org Calc

def plan():
    """
    Preenche uma planilha
    """

    # Obtêm o documento para o contexto de script
    doc = XSCRIPTCONTEXT.getDocument()

    # A primeira planilha do documento
    sheet = doc.getSheets().getByIndex(0)

    col = lin = 0
    a = ord('A')

    # Cria uma linha com os títulos para as colunas
    for titulo in ('Jan', 'Fev', 'Mar', 'Total'):

        col += 1
        sheet.getCellByPosition(col, lin).setString(titulo)

        # E coloca uma fórmula com somatório na última linha
        coluna = chr(a + col)
        formula = '=SUM(%s2:%s6)' % (coluna, coluna)
        sheet.getCellByPosition(col, lin + 6).setFormula(formula)

    for lin in xrange(1, 6):

        # Numera as linhas
        sheet.getCellByPosition(0, lin).setValue(lin)

        # Coloca somatórios no fim de cada linha
        formula = '=SUM(B%d:D%d)' % (lin + 1, lin + 1)
        sheet.getCellByPosition(4, lin).setFormula(formula)
        
        # Preenche os dados
        for col in (1, 2, 3):
            sheet.getCellByPosition(col, lin).setFormula('=10*RAND()')

            # Substitui a fórmula pelo valor
            val = sheet.getCellByPosition(col, lin).getValue()
            sheet.getCellByPosition(col, lin).setValue(val)

    return None

Saída:

BrOffice.org

Para que o BrOffice.org possa identificar o script escrito em Python como um arquivo de macro, ele precisa estar na pasta para scripts em Python, que no Windows fica em Basis\share\Scripts\python, dentro da pasta de instalação do BrOffice.org.

Exemplo de geração de relatório em PDF através do editor de texto (Writer), através da Python UNO Bridge:

In [ ]:
# Para iniciar o BrOffice.org como servidor:
# swriter.exe -headless
#   "-accept=pipe,name=py;urp;StarOffice.ServiceManager"

import os
import uno
from com.sun.star.beans import PropertyValue

# Dados...
mus = [('Artista', 'Faixa'),
    ('King Crimson', 'Starless'), ('Yes', 'Siberian Khatru'),
    ('Led Zeppellin', 'No Quarter'), ('Genesis', 'Supper\'s Ready')]

# Obtêm o número e o tamanho dos registros
rows = len(mus)
cols = len(mus[0])

# Inicio do "Boiler Plate"...

# Contexto de componente local
loc = uno.getComponentContext()

# Para resolver URLs
res = loc.ServiceManager.createInstanceWithContext(
    'com.sun.star.bridge.UnoUrlResolver', loc)

# Contexto para a URL
con = res.resolve('uno:pipe,name=py;urp;StarOffice.ComponentContext')

# Documento corrente
desktop = con.ServiceManager.createInstanceWithContext(
    'com.sun.star.frame.Desktop', con)

# Fim do "Boiler Plate"...

# Cria um documento novo no Writer
doc = desktop.loadComponentFromURL('private:factory/swriter',
    '_blank', 0, ())

# Cursor de texto
cursor = doc.Text.createTextCursor()

# Muda as propriedades do texto
cursor.setPropertyValue('CharFontName', 'Verdana')
cursor.setPropertyValue('CharHeight', 20)
cursor.setPropertyValue('CharWeight', 180)

# Insere o texto no documento
doc.Text.insertString(cursor, 'Músicas favoritas\n', 0)

# Cria tabela
tab = doc.createInstance('com.sun.star.text.TextTable')
tab.initialize(rows, cols)
doc.Text.insertTextContent(cursor, tab, 0)

# Preenche a tabela
for row in xrange(rows):
    for col in xrange(cols):
        cel = chr(ord('A') + col) + str(row + 1)
        tab.getCellByName(cel).setString(mus[row][col])

# Propriedades para exportar o documento
props = []
p = PropertyValue()
p.Name = 'Overwrite'
p.Value = True # Sobrescreve o documento anterior
props.append(p)

p = PropertyValue()
p.Name = 'FilterName'
p.Value = 'writer_pdf_Export' # Writer para PDF
props.append(p)

# URL de destino, no qual o arquivo PDF será salvo
url = uno.systemPathToFileUrl(os.path.abspath('musicas.pdf'))

# Salva o documento como PDF
doc.storeToURL(url, tuple(props))

# Fecha o documento
doc.close(True)

Saída (arquivo PDF):

BrOffice.org

A API do BrOffice.org é bastante completa e simplifica várias atividades que são lugar comum em programas para ambiente desktop.

In [1]:
 
Out[1]: