Integrando con otros proyectos
—
archivado en:
Python,
Open Office
Este es un ejemplo donde combinamos el poder del bridge con otros modulos poderosos como SQLAlchemy para conectarnos a bases de datos externas e integrarla a nuestro documento.
Este pequeño programa invocara SQLAlchemy y llenar los campos de OpenOffice.org. Tambien puedes cambiar el nombre de la base de datos, de las tablas y finalmente los nombres de los campos.
"""Este programa adquireen los registros desde sqlalchemy y reemplaza los campos de la plantilla OpenOffice.org
Copyright Lukasz Szybalski szybalski@gmail.com
Licencia: GNU General Public License 2 (GPL2)"""
#A continuacion si estamos importado un archivo, o configurandolo con uncronjob. Esto cambiara a donde .py se localiza.
import os
workfolder=os.path.dirname(__file__)
if workfolder:
print __file__
os.chdir(workfolder)
#Comienza el error de registro
import logging
logging.basicConfig()
#Configura el config
log = logging.getLogger("MyApp")
log.setLevel(logging.DEBUG) #set verbosity to show all messages of severity >= DEBUG
#log.setLevel(logging.INFO) #set verbosity to show all messages of severity >= DEBUG
log.info("Starting my app")
import sqlalchemy
#Mysql
e = sqlalchemy.create_engine('mysql://user:pass@hostname/db_name')
#Postgres
#e = sqlalchemy.create_engine('postgres://user:pass@hostname/db_name')
#Mssql
#e = sqlalchemy.create_engine("mssql://user:pass@hostname:1433/db_name?driver=TDS&odbc_options='TDS_Version=8.0'")
#e.echo=True
e.echo=False
metadata=sqlalchemy.MetaData(e)
log.info('Connection Set')
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=e, autoflush=True, autocommit=False)
session = Session()
#Conecctando a una base de datos
log.info("Connected to a Database")
#----Definicion de tabla en el objeto Python que mapea a esto-------
from sqlalchemy.orm import mapper
#Addressbook master File
addressbookrecords_table = sqlalchemy.Table('Addressbook', metadata, autoload=True)
#Python Object
class AddressbookRecords(object):
pass
#Mapper
mapper(AddressbookRecords,addressbookrecords_table)
log.info('Connected to a database, and have all the field names')
#---------Comienzo de la seccion OpenOffice.org------------
"""Este programa hara un busqueda y reemplazo y enviara a un documento diferente"""
#Load necessary items
import uno
import sys
#You need to set few variables when using OpenOffice
local = uno.getComponentContext()
resolver = local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local)
#Una de las variables en contexto el cual conecta a OpenOffice.org. Probamos si OpenOffice.org esta escuchando,
#si no lo comenzamos
try:
#Soy una tabla para conectar?
context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
log.debug('Connecting to OpenOffice')
except Exception ,e :
#Si tengo un error
if 'connect to socket' in str(e):
import os
#Comienzo
os.system('''/usr/bin/openoffice -accept="socket,host=localhost,port=2002;urp;"''')
import time
#Espera 3 segundos para cargar el openoffice.org
time.sleep(3)
#Ver si lo podemos conectar de nuevo.
context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
log.debug('OpenOffice was not opened. I have openned it and connected')
#Resto de las variables necesarias.
desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)
log.debug('Done Setting up all OpenOffice Variables')
#----------Start manipulating openoffice document--------
import string
#Usaremos esta funcion para buscar y reemplazar cosas en la hoja
def findandreplace(document=None,search=None,find=None,replace=None):
"""This function searches and replaces. Create search, call function findFirst, and finally replace what we found."""
#Que buscar
search.SearchString = unicode(find)
#search.SearchCaseSensitive = True
#search.SearchWords = True
found = document.findFirst( search )
if found:
#log.debug('Found %s' % find)
pass
while found:
found.String = string.replace( found.String, unicode(find),unicode(replace))
found = document.findNext( found.End, search)
#Este sera nuestra mini definicion de archivo. Aqui podemos especificar el campo que se reemplaza.
from datetime import datetime
def replace_data(record=None):
"""Key and Value for replacement. Keys are defined by you values come from sqlalchemy. Here we define what $FirstName in odt file will be replaced with."""
data={}
data['$FirstName']=record.FIRSTNAME
data['$LastName']=record.LASTNAME
data['$Address']=record.ADDRESS_1
data['$City']=record.CITY.strip()
data['$State']=record.STATE
data['$Zipcode']=record.ZIP_CODE
data['$TodaysDate']=datetime.now().date()
data['$User']=record.USER_NO
data['$CaseID']=str(record.CASE_NUMBER)
return data
#Importaremos un salto de linea ya que haremos un loop
from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER
#vamos a crear un documento (document2 and cursor2) que usaremos para usar nuestras herramientas de reemplazo.
document2 = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ())
cursor2 = document2.Text.createTextCursor()
#Guarda el documento
document2.storeAsURL("file:///home/lucas/ReminderPages.odt",())
log.info('Created New Document: ReminderPages.odt')
#Selecciona una fecha para mi carta. Todos los registros creados hace 35 dias.
from datetime import timedelta
days35=timedelta(days=35)
day35=datetime.now().date()-days35
import time
day35a=time.strftime('%Y%m%d',day35.timetuple())
#Selecciona un registro de la base de datos.
allrecords=session.query(AddressbookRecords).filter(AddressbookRecords.CASE_OPEN_DATE==day35a).order_by(AddressbookRecords.USER_NO).all()
#Imprime cuantos registros tenemos
log.info('We have %s Records from the database.' % len(allrecords))
#Vamos a comenzar el loop
log.debug('Starting to Loop Through Records')
for record in allrecords:
#Carga la plantilla del archivo
document = desktop.loadComponentFromURL("file:///home/lucas/ReminderPagesTemplate.odt" ,"_blank", 0, ())
#No necesitamos un cursor ya que solo estamos reemplazando el contenido
#cursor = document.Text.createTextCursor()
#Crear un descriptor de seleccion
search = document.createSearchDescriptor()
#Pass in a sqlalchemy record to our recplace_data which will fill in the values for each field we want. We will use these values to replace inside the odt.
data=replace_data(record)
#Do a loop of the data and replace the content.We pass in a dictionary data which has keys and values. We find keys and replace them with values.
for find,replace in data.items():
findandreplace(document,search,unicode(find),unicode(replace))
log.debug(str(find)+','+str(replace))
#Save replaced document as a temporary file.
#Trying to find out how to skip this part but for now we do it.
document.storeAsURL("file:///home/lucas/temp.odt",())
#Close File
document.dispose()
#We now append our temp file to our document that will hold all pages.
cursor2.gotoEnd(False)
cursor2.BreakType = PAGE_BEFORE
cursor2.insertDocumentFromURL("file:///home/lucas/temp.odt", ())
document2.store()
#2nd copie
#cursor2.gotoEnd(False)
#cursor2.BreakType = PAGE_BEFORE
#cursor2.insertDocumentFromURL("file:///home/lucas/temp.odt", ())
#document2.store()
#Exit
document2.dispose()
log.info('Done.I am exiting')

Anterior: Modificando el contenido
