{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n",
"===================================\n",
"2ª edi\u00e7\u00e3o, revisada e ampliada\n",
"-----------------------------------\n",
"\n",
"Ap\u00eandice E: BrOffice.org\n",
"=============================\n",
"_____________________________\n",
"[BrOffice.org](http://www.broffice.org/) \u00e9 um conhecido pacote de automa\u00e7\u00e3o de escrit\u00f3rios de c\u00f3digo aberto, que inclui editor de textos, planilha e outros aplicativos. Al\u00e9m disso, o BrOffice.org tamb\u00e9m suporta Python (entre outras linguagens):\n",
"\n",
"+ Como linguagem de macro, permitindo a automatiza\u00e7\u00e3o de tarefas.\n",
"+ Para a constru\u00e7\u00e3o de extens\u00f5es (*add ons*).\n",
"+ Em um servi\u00e7o para atender conex\u00f5es, atrav\u00e9s de uma API chamada UNO (*Universal Network Objects*).\n",
"\n",
"Exemplo de macro:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# A macro deve ser executada a partir do\n",
"# BrOffice.org Calc\n",
"\n",
"def plan():\n",
" \"\"\"\n",
" Preenche uma planilha\n",
" \"\"\"\n",
"\n",
" # Obt\u00eam o documento para o contexto de script\n",
" doc = XSCRIPTCONTEXT.getDocument()\n",
"\n",
" # A primeira planilha do documento\n",
" sheet = doc.getSheets().getByIndex(0)\n",
"\n",
" col = lin = 0\n",
" a = ord('A')\n",
"\n",
" # Cria uma linha com os t\u00edtulos para as colunas\n",
" for titulo in ('Jan', 'Fev', 'Mar', 'Total'):\n",
"\n",
" col += 1\n",
" sheet.getCellByPosition(col, lin).setString(titulo)\n",
"\n",
" # E coloca uma f\u00f3rmula com somat\u00f3rio na \u00faltima linha\n",
" coluna = chr(a + col)\n",
" formula = '=SUM(%s2:%s6)' % (coluna, coluna)\n",
" sheet.getCellByPosition(col, lin + 6).setFormula(formula)\n",
"\n",
" for lin in xrange(1, 6):\n",
"\n",
" # Numera as linhas\n",
" sheet.getCellByPosition(0, lin).setValue(lin)\n",
"\n",
" # Coloca somat\u00f3rios no fim de cada linha\n",
" formula = '=SUM(B%d:D%d)' % (lin + 1, lin + 1)\n",
" sheet.getCellByPosition(4, lin).setFormula(formula)\n",
" \n",
" # Preenche os dados\n",
" for col in (1, 2, 3):\n",
" sheet.getCellByPosition(col, lin).setFormula('=10*RAND()')\n",
"\n",
" # Substitui a f\u00f3rmula pelo valor\n",
" val = sheet.getCellByPosition(col, lin).getValue()\n",
" sheet.getCellByPosition(col, lin).setValue(val)\n",
"\n",
" return None"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sa\u00edda:\n",
"\n",
"![BrOffice.org](files/broffice.png)\n",
"\n",
"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\u00e7\u00e3o do BrOffice.org.\n",
"\n",
"Exemplo de gera\u00e7\u00e3o de relat\u00f3rio em PDF atrav\u00e9s do editor de texto (Writer), atrav\u00e9s da Python UNO Bridge:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Para iniciar o BrOffice.org como servidor:\n",
"# swriter.exe -headless\n",
"# \"-accept=pipe,name=py;urp;StarOffice.ServiceManager\"\n",
"\n",
"import os\n",
"import uno\n",
"from com.sun.star.beans import PropertyValue\n",
"\n",
"# Dados...\n",
"mus = [('Artista', 'Faixa'),\n",
" ('King Crimson', 'Starless'), ('Yes', 'Siberian Khatru'),\n",
" ('Led Zeppellin', 'No Quarter'), ('Genesis', 'Supper\\'s Ready')]\n",
"\n",
"# Obt\u00eam o n\u00famero e o tamanho dos registros\n",
"rows = len(mus)\n",
"cols = len(mus[0])\n",
"\n",
"# Inicio do \"Boiler Plate\"...\n",
"\n",
"# Contexto de componente local\n",
"loc = uno.getComponentContext()\n",
"\n",
"# Para resolver URLs\n",
"res = loc.ServiceManager.createInstanceWithContext(\n",
" 'com.sun.star.bridge.UnoUrlResolver', loc)\n",
"\n",
"# Contexto para a URL\n",
"con = res.resolve('uno:pipe,name=py;urp;StarOffice.ComponentContext')\n",
"\n",
"# Documento corrente\n",
"desktop = con.ServiceManager.createInstanceWithContext(\n",
" 'com.sun.star.frame.Desktop', con)\n",
"\n",
"# Fim do \"Boiler Plate\"...\n",
"\n",
"# Cria um documento novo no Writer\n",
"doc = desktop.loadComponentFromURL('private:factory/swriter',\n",
" '_blank', 0, ())\n",
"\n",
"# Cursor de texto\n",
"cursor = doc.Text.createTextCursor()\n",
"\n",
"# Muda as propriedades do texto\n",
"cursor.setPropertyValue('CharFontName', 'Verdana')\n",
"cursor.setPropertyValue('CharHeight', 20)\n",
"cursor.setPropertyValue('CharWeight', 180)\n",
"\n",
"# Insere o texto no documento\n",
"doc.Text.insertString(cursor, 'M\u00fasicas favoritas\\n', 0)\n",
"\n",
"# Cria tabela\n",
"tab = doc.createInstance('com.sun.star.text.TextTable')\n",
"tab.initialize(rows, cols)\n",
"doc.Text.insertTextContent(cursor, tab, 0)\n",
"\n",
"# Preenche a tabela\n",
"for row in xrange(rows):\n",
" for col in xrange(cols):\n",
" cel = chr(ord('A') + col) + str(row + 1)\n",
" tab.getCellByName(cel).setString(mus[row][col])\n",
"\n",
"# Propriedades para exportar o documento\n",
"props = []\n",
"p = PropertyValue()\n",
"p.Name = 'Overwrite'\n",
"p.Value = True # Sobrescreve o documento anterior\n",
"props.append(p)\n",
"\n",
"p = PropertyValue()\n",
"p.Name = 'FilterName'\n",
"p.Value = 'writer_pdf_Export' # Writer para PDF\n",
"props.append(p)\n",
"\n",
"# URL de destino, no qual o arquivo PDF ser\u00e1 salvo\n",
"url = uno.systemPathToFileUrl(os.path.abspath('musicas.pdf'))\n",
"\n",
"# Salva o documento como PDF\n",
"doc.storeToURL(url, tuple(props))\n",
"\n",
"# Fecha o documento\n",
"doc.close(True)"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sa\u00edda (arquivo PDF):\n",
"\n",
"![BrOffice.org](files/broffice2.png)\n",
"\n",
"A API do BrOffice.org \u00e9 bastante completa e simplifica v\u00e1rias atividades que s\u00e3o lugar comum em programas para ambiente desktop."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
""
],
"output_type": "pyout",
"prompt_number": 1,
"text": [
""
]
}
],
"prompt_number": 1
}
],
"metadata": {}
}
]
}