{ "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": {} } ] }