def treeview2pdf(tv, titulo = None, fecha = None, apaisado = None): """ A partir de un TreeView crea un PDF con su contenido. 1.- Asigna un nombre de archivo en función del nombre del TreeView. 2.- Si titulo es None, asigna como título el nombre del TreeView. 3.- El ancho de los campos será el ancho relativo en porcentaje que ocupa el ancho de la columna (get_width) a la que correspondería. El título del campo será el título (get_title) de la columna. 4.- Si fecha no es None debe ser una cadena de texto. Si no es None, se usará la fecha actual del sistema. 5.- Si la suma del ancho de las columnas del TreeView es superior a 800 píxeles el PDF generado será apaisado, a no ser que se fuerce mediante el parámetro "apaisado" que recibe la función. """ archivo = get_nombre_archivo_from_tv(tv) if titulo == None: titulo = get_titulo_from_tv(tv) campos, pdf_apaisado, cols_a_derecha = get_campos_from_tv(tv) datos = get_datos_from_tv(tv) if fecha == None: fecha = utils.str_fecha(mx.DateTime.localtime()) if apaisado != None: pdf_apaisado = apaisado return geninformes.imprimir2(archivo, titulo, campos, datos, fecha, apaisado = pdf_apaisado, cols_a_derecha = cols_a_derecha)
def treeview2pdf(tv, titulo = None, fecha = None, apaisado = None, pijama = False, graficos = [], numcols_a_totalizar = [], extra_data = []): """ A partir de un TreeView crea un PDF con su contenido. 1.- Asigna un nombre de archivo en función del nombre del TreeView. 2.- Si titulo es None, asigna como título el nombre del TreeView. 3.- El ancho de los campos será el ancho relativo en porcentaje que ocupa el ancho de la columna (get_width) a la que correspondería. El título del campo será el título (get_title) de la columna. 4.- Si fecha no es None debe ser una cadena de texto. Si es None, se usará la fecha actual del sistema. 5.- Si la suma del ancho de las columnas del TreeView es superior a 800 píxeles el PDF generado será apaisado, a no ser que se fuerce mediante el parámetro "apaisado" que recibe la función. numcols_a_totalizar es una lista de índices (empezando por 0) de las columnas a las que se va a intentar convertir a número y sumar para mostrar una última línea con el texto "TOTAL" o "TOTALES" si hay más de una. extra_data son líneas que se añadirán a las que tiene el TreeView *al final* del informe (incluso detrás de los totales, si los hubiera). """ archivo = get_nombre_archivo_from_tv(tv) if titulo == None: titulo = get_titulo_from_tv(tv) campos, pdf_apaisado, cols_a_derecha, cols_centradas=get_campos_from_tv(tv) datos = get_datos_from_tv(tv) totales = dict(zip(numcols_a_totalizar, len(numcols_a_totalizar) * [0])) for fila in datos: for numcol in totales: try: totales[numcol] += utils.parse_float(fila[numcol]) except ValueError: # ¿No hay dato en esa fila? Entonces cuento # instancias. totales[numcol] += 1 #print fila, numcol, fila[numcol] if totales and datos: last_i = len(datos) - 1 # Apuntará a la última línea no nula while (last_i > 0 and reduce(lambda x, y: str(x) + str(y), datos[last_i]) == ""): last_i -= 1 if (datos[last_i] and not reduce(lambda x, y: x == y == "---" and "---", datos[last_i])): datos.append(("---", ) * len(campos)) fila = ["TOTAL"] + [""] * (len(campos) - 1) if len(totales) > 1: fila[0] = "TOTALES" for total in totales: fila[total] = utils.float2str(totales[total] , precision = 2, autodec = True) datos.append(fila) if extra_data and not isinstance(extra_data[0], (tuple, list)): extra_data = [extra_data] for extra in extra_data: dif_len = len(campos) - len(extra) if dif_len <> 0 and not isinstance(extra, list): extra = list(extra) if dif_len > 0: extra += [""] * dif_len elif dif_len < 0: extra = extra[:len(campos)] datos.append(extra) if fecha == None: fecha = utils.str_fecha(datetime.date.today()) if apaisado != None: pdf_apaisado = apaisado return geninformes.imprimir2(archivo, titulo, campos, datos, fecha, apaisado = pdf_apaisado, cols_a_derecha = cols_a_derecha, cols_centradas = cols_centradas, pijama = pijama, graficos = graficos)