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):
Exemplo de macro:
# 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:
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:
# 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):
A API do BrOffice.org é bastante completa e simplifica várias atividades que são lugar comum em programas para ambiente desktop.