Páginas

lunes, 20 de julio de 2015

Python para Excel: Como insertar hipervinculos

El objeto "Sheet" del modelo de objetos de Excel, tiene una propiedad Hyperlinks. Hyperlinks tiene un metodo llamado Add, que acepta 5 parametros, de los cuales solo uso 3, los que no utilizo los dejo en blanco con comillas.

En este ejemplo, en mi hoja de calculo tengo una columna donde quiero insertar hipervinculos y poner como referencia la palabra "documents"

import os, re, traceback
from win32com import client
try:
    #Rutas de archivos y posiciones de referencia
    pathServidor = '//servidor/'
    pathReporte= 'C:/reporte.xls'
    columaPedidos = "C" #en que columna se encuentran los numeros de pedido
    primeraFilaPedidos = "8" #la primera fila de los pedidos

    #crear listado con los numeros de pedido (solo el primer PL en caso de haber multiples)
    pedidos = []
    xl = client.Dispatch("Excel.Application")
    #itera por cada hoja del reporte
    for sheetNumber in range(1,5):
        reporte = xl.workbooks.open(pathReporte)
        lastRow = reporte.Sheets(sheetNumber).usedrange.rows.count #ultima fila del reporte
        for c in reporte.Sheets(sheetNumber).Range(columaPedidos+primeraFilaPedidos, columaPedidos+str(lastRow)): #itera por cada celda de pedidos
            pedido = unicode(c.value)
            #elimina los dahses del pedido y agrega solo el primer pl al listado
            if "/" in pedido:
                pedidos.append(pedido.split("/")[0])
            else:
                pedidos.append(pedido.split()[0])

    #itera por cada numero de pedido en el listado
    #tomar el path al servidor y combinarlos con cada numero de pedido
    #ver si el path que resulta existe en el servidor
    #si el path existe busca el numero de pedido en el reporte
    #ubicado el pedido, inserta hipervinculo en la columna N
            
    n= len(pedidos)
    for pedido in pedidos:
        if os.path.exists(pathServidor+pedido): #si existe el file path
            for sheetNumber in range(1,5): #itera por cada hoja
                if reporte.Sheets(sheetNumber).usedrange.find(pedido): #busca el pedido en cada hoja
                    print "\rArchivando %s en %s, %i files remaining." %(pedido, reporte.Sheets(sheetNumber).Name,(n-1)),
                    print " ",
                    #sys.stdout.flush()
                    documentsColumn = reporte.Sheets(sheetNumber).usedrange.find("Documents").Column #ubica la columna de documentos
                    pedidoRow = reporte.Sheets(sheetNumber).usedrange.find(pedido).Row
                    hyperlinkCell = reporte.Sheets(sheetNumber).Cells(pedidoRow,documentsColumn)#encuentra la celda donde insertar el hipervinculo
                    hyperlinkPath = pathServidor+pedido #crea el path del hipervinculo
                    reporte.Sheets(sheetNumber).Hyperlinks.Add(hyperlinkCell, hyperlinkPath,"","","documents")
                    #print "Archivado."
                    break
        #print "\rFiles Remaining... %i" %(n-1),
        #sys.stdout.flush()
        n-=1
    reporte.Save
    reporte.Close
except:
    traceback.print_exc()
print "Terminado."
raw_input()

No hay comentarios:

Publicar un comentario