crear archivos excel con el formato de una plantilla, unir dos códigos
Publicado por Anne (1 intervención) el 04/09/2024 20:21:32
#Código 1:
#Genera fichas contenidas en archivos de excel con las hojas MIR, ByS y PyG pero quiero que el formato de #estas fichasgeneradas sea el del código 2.
trimestre = "T2"
ciclo = '2024'
!pip install pymysql
!pip install xlsxwriter
# Importamos librerías
import pandas as pd
import pymysql
from sqlalchemy import create_engine
import sys
import numpy as np
import scipy.io
import shutil
import xlsxwriter
import re
import os
os.chdir(r'C:\Users\USER\Desktop\Prácticas\Plantilla\Versión 2')
#Los siguientes son importantes para abrir el mysql
from openpyxl import Workbook
from openpyxl import load_workbook
from datetime import datetime
#Documento de excel
ubic = pd.ExcelFile('A. desempeno_mir.xlsx')
hoja = 'Sheet1'
mir_excel = pd.read_excel(ubic, sheet_name = hoja, engine = "openpyxl")
ubic = pd.ExcelFile('A. desempeno_bys.xlsx')
hoja = 'Sheet1'
bys_excel = pd.read_excel(ubic, sheet_name = hoja)
ubic = pd.ExcelFile('A. desempeno_pyg.xlsx')
hoja = 'Sheet1'
pyg_excel = pd.read_excel(ubic, sheet_name = hoja)
#-----------------------MIR-----------------------------
# Función para revisar saltos de línea en las columnas
def saltos_linea(columnas):
for c in columnas:
if mir_excel[c].dtype == "object":
print(c)
print(
mir_excel[mir_excel[c].str.count('\n') != 0]
.shape[0])
lista_columnas = [
'dye',
'ramo_dye',
'siglas_dye',
'eje_gobierno',
'nivel_mir',
'clave_mir',
'resumen_narrativo_mir',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'id_indicador',
'nombre_indicador',
'algoritmo',
'unidad_medida_indicador',
'frecuencia_medicion',
'fecha_disponibilidad_informacion',
'monitoreable',
'acumulable',
'sentido',
'aplica'
]
saltos_linea(lista_columnas)
# Función para quitar dobles espacios
def sustituir_dobles_espacios(columna):
columna_modificada = []
for texto in columna:
texto_modificado = re.sub(r'\s+', ' ', texto)
columna_modificada.append(texto_modificado)
return columna_modificada
# Función para aplicar correcciones
def correcciones(columnas):
for c in columnas:
if mir_excel[c].dtype == "object":
# Rellenar valores NaN con cadena vacía
mir_excel[c] = mir_excel[c].fillna("")
# Reemplazar saltos de línea
mir_excel[c] = mir_excel[c].str.replace('\n', ' ')
# Reemplazar _x000D_
mir_excel[c] = mir_excel[c].str.replace('_x000D_', ' ')
# Quitar dobles espacios
mir_excel[c] = sustituir_dobles_espacios(mir_excel[c])
# Quitar espacios al inicio y al final
mir_excel[c] = mir_excel[c].str.strip()
lista_columnas = ['resumen_narrativo_mir', 'nombre_indicador']
correcciones(lista_columnas)
#---------------------------ByS--------------------------
#REVISAR
def saltos_linea(columna):
for c in columna:
print(c)
print(
bys_excel[bys_excel[c].str.count('\n') != 0]
.shape[0])
lista_columnas = ['ramo_dye',
'siglas_dye',
'dye',
'eje_gobierno',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'clave_componente',
'nombre_componente',
'nombre_bys',
'unidad_medida',
'monitoreable',
'aplica']
saltos_linea(lista_columnas)
# Quitar dobles espacios
def sustituir_dobles_espacios(columna):
columna_modificada = []
for texto in columna:
texto_modificado = re.sub(r'\s+', ' ', texto)
columna_modificada.append(texto_modificado)
return columna_modificada
def correcciones(columna):
for c in columna:
# Valores nan
#bys_excel[c].fillna("", inplace=True)
bys_excel[c] = bys_excel[c].fillna("")
# Salto de linea
bys_excel[c] = bys_excel[c].str.replace('\n',' ')
# Por sí los salto de linea ya son _x000D_
bys_excel[c] = bys_excel[c].str.replace('_x000D_',' ')
# Quitar dobles espacios.
bys_excel[c] = sustituir_dobles_espacios(bys_excel[c])
# Espacios al inicio y al final
bys_excel[c] = bys_excel[c] .str.strip()
lista_columnas = ['nombre_bys', 'unidad_medida']
correcciones(lista_columnas)
#------------------------P&G-------------------------------
#REVISAR
def saltos_linea(columna):
for c in columna:
print(c)
print(
pyg_excel[
(pyg_excel[c].str.count('\n') != 0)
&
(pyg_excel['pg'] == 'P')
].shape[0])
lista_columnas = ['ramo_dye',
'siglas_dye',
'dye',
'eje_gobierno',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'clave_componente',
'nombre_componente',
'pg',
'clave_pg_recodificada',
'nombre_pg',
'nombre_entregable',
'unidad_medida',
'monitoreable',
'aplica'
]
saltos_linea(lista_columnas)
# Quitar dobles espacios
def sustituir_dobles_espacios(columna):
columna_modificada = []
for texto in columna:
texto_modificado = re.sub(r'\s+', ' ', texto)
columna_modificada.append(texto_modificado)
return columna_modificada
def correcciones(columna):
for c in columna:
# Valores nan
#pyg_excel[c].fillna("", inplace=True)
pyg_excel[c] = pyg_excel[c].fillna("")
# Salto de linea
pyg_excel[c] = pyg_excel[c].str.replace('\n',' ')
# Por sí los salto de linea ya son _x000D_
pyg_excel[c] = pyg_excel[c].str.replace('_x000D_',' ')
# Quitar dobles espacios.
pyg_excel[c] = sustituir_dobles_espacios(pyg_excel[c])
# Espacios al inicio y al final
pyg_excel[c] = pyg_excel[c] .str.strip()
lista_columnas = ['nombre_pg', 'nombre_entregable', 'unidad_medida']
correcciones(lista_columnas)
# Nuevo
df_mir = mir_excel[['dye',
'ramo_dye',
'siglas_dye',
'eje_gobierno',
'nivel_mir',
'clave_mir',
'clave_pq_recodificada',
'resumen_narrativo_mir',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'id_indicador',
'nombre_indicador',
'algoritmo',
'unidad_medida_indicador',
'frecuencia_medicion',
'fecha_disponibilidad_informacion',
'monitoreable',
'acumulable',
'sentido',
'valor_linea_base',
'meta_anual_2024',
'meta_anual',
'meta_alcanzada',
'avance',
'aplica']]
def nivel(x):
if x['nivel_mir'] == "FIN":
return "01.fin"
elif x['nivel_mir'] == "PROPOSITO":
return "02.proposito"
elif x['nivel_mir'] == "Componente":
return "03.componente"
elif x['nivel_mir'] == "Actividad":
return "04.actividad"
else:
return "error"
df_mir.loc[:, 'nivel_mir'] = df_mir.apply(nivel, axis=1)
df_bys = bys_excel[[ 'ramo_dye',
'siglas_dye',
'dye',
'eje_gobierno',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'clave_componente',
'nombre_componente',
'id_bys',
'nombre_bys',
'unidad_medida',
'ponderacion',
'meta_modificada',
'meta_calendarizada',
'captura_seguimiento',
'avance_periodo',
'avance_anual',
'monitoreable',
'aplica'
]]
# Asegúrate de que no haya valores nulos y convierte a int y luego a str
df_bys = df_bys.copy() # Asegúrate de trabajar con una copia
df_bys['id_bys'] = df_bys['id_bys'].fillna(0).astype('int64') # Convertir a int64
df_bys['id_bys'] = df_bys['id_bys'].astype('str') # Convertir a str
#df_bys.dtypes
df_pyg = pyg_excel[['ramo_dye',
'siglas_dye',
'dye',
'eje_gobierno',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'clave_componente',
'nombre_componente',
'pg',
'clave_pg_recodificada',
'nombre_pg',
'id_entregable',
'nombre_entregable',
'unidad_medida',
'ponderacion',
'meta_modificada',
'meta_calendarizada',
'captura_seguimiento',
'avance_periodo',
'avance_anual',
'monitoreable',
'aplica'
]].copy() # Crear una copia
# Convertir valores de 'id_entregable' a int y luego a str
df_pyg['id_entregable'] = df_pyg['id_entregable'].fillna(0).astype('int64').astype('str')
# Asegurarse de que df_mir, df_bys y df_pyg son copias independientes
df_mir = df_mir.copy()
df_bys = df_bys.copy()
df_pyg = df_pyg.copy()
# Definir y nombrar los workbooks usando .loc[] para evitar SettingWithCopyWarning
df_mir.loc[:, 'list_name_wb'] = df_mir['ramo_dye'] + " " + df_mir['siglas_dye']
df_bys.loc[:, 'list_name_wb'] = df_bys['ramo_dye'] + " " + df_bys['siglas_dye']
df_pyg.loc[:, 'list_name_wb'] = df_pyg['ramo_dye'] + " " + df_pyg['siglas_dye']
df_list_name_wb = pd.concat([df_mir.list_name_wb, df_bys.list_name_wb, df_pyg.list_name_wb], axis=0)
df_list_name_wb = df_list_name_wb.drop_duplicates()
print(df_list_name_wb) #Observar que hay un NaN y es por el entregable de ByS que no debe considerarse.
df_list_name_wb.to_excel('1. db_list_names_wb.xlsx', index = False)
#---------------------MIR---------------
#Creamos columnas que se necesitaran.
df_mir['programa_presupuestario'] = df_mir['clave_programa_presupuestario'] + ". " + df_mir['nombre_programa_presupuestario']
def objetivo(x):
if x['nivel_mir'] == '04.actividad':
return x['nivel_mir'] + " - " + x['clave_pq_recodificada'] + '. '+ x['resumen_narrativo_mir']
else:
return x['nivel_mir'] + ". " + x['resumen_narrativo_mir']
df_mir['objetivo'] = df_mir.apply(objetivo, axis = 1)
df_mir['indicador'] = df_mir['id_indicador'].astype(str) + ". " + df_mir['nombre_indicador']
def orden(x):
if x['nivel_mir'] in ['01.fin', '02.proposito']:
return str(x['clave_programa_presupuestario']) + '.' + str(x['nivel_mir']) + '.' + str(x['id_indicador'])
elif x['nivel_mir'] in ['03.componente']:
return str(x['clave_programa_presupuestario']) + '.' + str(x['clave_mir'])[5:8] + '.' + str(x['nivel_mir']) + '.' + str(x['id_indicador'])
elif x['nivel_mir'] in ['04.actividad']:
return str(x['clave_programa_presupuestario']) + '.' + str(x['clave_mir'])[5:8] + '.' + str(x['nivel_mir']) + '.' + str(x['clave_mir'])[9:15] + '.' + str(x['id_indicador'])
else:
return "error"
df_mir['clave_jerarquia'] = df_mir.apply(orden,axis=1)
fechas = df_mir['fecha_disponibilidad_informacion'].str.split(pat = ",", n = -1, expand = True)
for num in range(24):
fechas.rename(columns = {fechas.columns[num] : 'fecha_' + str(num)}, inplace= True)
df_mir = pd.concat([df_mir,fechas], axis = 1)
df_mir['numero_caracteres_fecha'] = df_mir['fecha_disponibilidad_informacion'].str.len()
def frecuencia_medicion(x):
if x['numero_caracteres_fecha'] == 10 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] "
elif x['numero_caracteres_fecha'] == 21 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "]"
elif x['numero_caracteres_fecha'] == 32 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "] [" + x['fecha_2'] + "]"
elif x['numero_caracteres_fecha'] == 43 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "] [" + x['fecha_2'] + "] [" + x['fecha_3'] + "]"
else:
return x['frecuencia_medicion']
df_mir['frecuencia_medicion'] = df_mir.apply(frecuencia_medicion, axis = 1)
def meta_alcanzada_texto(x):
if x['monitoreable'] == 'no monitoreable' and (x['meta_alcanzada'] == 0 or pd.isnull(x['meta_alcanzada'])):
return "N/A"
elif x['monitoreable'] == 'no monitoreable' and x['meta_alcanzada'] != 0 and pd.notnull(x['meta_alcanzada']):
return x['meta_alcanzada']
elif x['monitoreable'] == 'monitoreable' and (x['meta_alcanzada'] == 0 or pd.isnull(x['meta_alcanzada'])):
return "Sin reporte de avance"
elif x['monitoreable'] == 'monitoreable' and x['meta_alcanzada'] != 0 and pd.notnull(x['meta_alcanzada']):
return x['meta_alcanzada']
df_mir['meta_alcanzada_texto'] = df_mir.apply(meta_alcanzada_texto, axis=1)
def avance(x):
if x['monitoreable'] == 'no monitoreable' and (x['avance'] == 0 or pd.isnull(x['avance'])):
return "N/A"
elif x['monitoreable'] == 'no monitoreable' and x['avance'] != 0 and pd.notnull(x['avance']):
return x['avance']
elif x['monitoreable'] == 'monitoreable':
return x['avance']
df_mir['avance_texto'] = df_mir.apply(avance, axis=1)
def susceptible_reporte(x):
if x['monitoreable'] == 'monitoreable':
return "Si"
elif x['monitoreable'] == 'no monitoreable':
return "No"
df_mir['susceptible_reporte'] = df_mir.apply(susceptible_reporte, axis=1)
#Frecuencia de medición + fecha de disponibilidad de la información
#Desglosamos fecha
fechas = df_mir['fecha_disponibilidad_informacion'].str.split(pat = ",", n = -1, expand = True)
for num in range(24):
fechas.rename(columns = {fechas.columns[num] : 'fecha_' + str(num)}, inplace= True)
df_mir = pd.concat([df_mir,fechas], axis = 1)
#Agregamos columna
df_mir['numero_caracteres_fecha'] = df_mir['fecha_disponibilidad_informacion'].str.len()
def frecuencia_medicion(x):
if x['numero_caracteres_fecha'] == 10 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] "
elif x['numero_caracteres_fecha'] == 21 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "]"
elif x['numero_caracteres_fecha'] == 32 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "] [" + x['fecha_2'] + "]"
elif x['numero_caracteres_fecha'] == 43 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "] [" + x['fecha_2'] + "] [" + x['fecha_3'] + "]"
else:
return x['frecuencia_medicion']
df_mir['frecuencia_medicion'] = df_mir.apply(frecuencia_medicion, axis = 1)
#Meta alcanzada
def meta_alcanzada_texto(x):
if x['monitoreable'] == 'no monitoreable' and (x['meta_alcanzada'] == 0 or pd.isnull(x['meta_alcanzada'])):
return "N/A"
elif x['monitoreable'] == 'no monitoreable' and x['meta_alcanzada'] != 0 and pd.notnull(x['meta_alcanzada']):
return x['meta_alcanzada']
elif x['monitoreable'] == 'monitoreable' and (x['meta_alcanzada'] == 0 or pd.isnull(x['meta_alcanzada'])):
return "Sin reporte de avance"
elif x['monitoreable'] == 'monitoreable' and x['meta_alcanzada'] != 0 and pd.notnull(x['meta_alcanzada']):
return x['meta_alcanzada']
df_mir['meta_alcanzada_texto'] = df_mir.apply(meta_alcanzada_texto, axis=1)
#Avance
def avance(x):
if x['monitoreable'] == 'no monitoreable' and (x['avance'] == 0 or pd.isnull(x['avance'])):
return "N/A"
elif x['monitoreable'] == 'no monitoreable' and x['avance'] != 0 and pd.notnull(x['avance']):
return x['avance']
elif x['monitoreable'] == 'monitoreable':
return x['avance']
df_mir['avance_texto'] = df_mir.apply(avance, axis=1)
#Suceptible de reporte
def susceptible_reporte(x):
if x['monitoreable'] == 'monitoreable':
return "Si"
elif x['monitoreable'] == 'no monitoreable':
return "No"
df_mir['susceptible_reporte'] = df_mir.apply(susceptible_reporte, axis=1)
#----------------------ByS------------
#Creamos columnas que se necesitaran.
df_bys['programa_presupuestario'] = df_bys['clave_programa_presupuestario'] + "." + df_bys['nombre_programa_presupuestario']
df_bys['componente'] = df_bys['clave_componente'] + "." + df_bys['nombre_componente']
df_bys['bys'] = df_bys['id_bys'] + "." + df_bys['nombre_bys'] + " [" + df_bys['unidad_medida'] + "]"
df_bys['clave_jerarquia'] = df_bys['clave_componente'] + "." + df_bys['id_bys']
#Creamos columnas que se necesitaran.
#Meta calendarizada
def meta_calendarizada_texto(x):
if x['monitoreable'] == "no monitoreable":
return "Sin meta calendarizada"
elif x['monitoreable'] == "monitoreable":
return x['meta_calendarizada']
df_bys['meta_calendarizada_texto'] = df_bys.apply(meta_calendarizada_texto, axis=1)
#Meta alcanzada
def captura_seguimiento_texto(x):
if x['captura_seguimiento'] == 0 and x['monitoreable'] == "no monitoreable" :
return "Sin meta calendarizada"
elif x['captura_seguimiento'] == 0 and x['monitoreable'] == "monitoreable" :
return "Sin reporte de avance"
elif x['captura_seguimiento'] > 0 :
return x['captura_seguimiento']
df_bys['captura_seguimiento_texto'] = df_bys.apply(captura_seguimiento_texto, axis=1)
#Avance periodo
def avance_periodo_texto(x):
if x['monitoreable'] == "no monitoreable" :
return "N/A"
elif x['monitoreable'] == "monitoreable" :
return x['avance_periodo']
df_bys['avance_periodo_texto'] = df_bys.apply(avance_periodo_texto, axis=1)
#Avance
def avance(x):
if x['captura_seguimiento'] == 0 and x['monitoreable'] == "no monitoreable" :
return "N/A"
else:
return x['avance_anual']
df_bys['avance_texto'] = df_bys.apply(avance, axis = 1)
#------------------PyG------------
# Creamos columnas que se necesitarán.
df_pyg['programa_presupuestario'] = df_pyg['clave_programa_presupuestario'] + ". " + df_pyg['nombre_programa_presupuestario']
df_pyg['componete'] = df_pyg['clave_componente'] + ". " + df_pyg['nombre_componente']
df_pyg['proceso'] = df_pyg['clave_pg_recodificada'] + ". " + df_pyg['nombre_pg']
df_pyg['entregable'] = df_pyg['id_entregable'] + ". " + df_pyg['nombre_entregable'] + " [" + df_pyg['unidad_medida'] + "]"
df_pyg['clave_jerarquia_p'] = df_pyg['clave_componente'] + "." + df_pyg['clave_pg_recodificada'] + "." + df_pyg['id_entregable']
df_pyg['clave_jerarquia_g'] = df_pyg['clave_pg_recodificada'] + "." + df_pyg['id_entregable']
# Meta calendarizada
def meta_calendarizada_texto(x):
if x['monitoreable'] == "no monitoreable":
return "Sin meta calendarizada"
elif x['monitoreable'] == "monitoreable":
return x['meta_calendarizada']
df_pyg['meta_calendarizada_texto'] = df_pyg.apply(meta_calendarizada_texto, axis=1)
# Meta alcanzada
def captura_seguimiento_texto(x):
if x['captura_seguimiento'] == 0 and x['monitoreable'] == "no monitoreable":
return "Sin meta calendarizada"
elif x['captura_seguimiento'] == 0 and x['monitoreable'] == "monitoreable":
return "Sin reporte de avance"
elif x['captura_seguimiento'] > 0:
return x['captura_seguimiento']
df_pyg['captura_seguimiento_texto'] = df_pyg.apply(captura_seguimiento_texto, axis=1)
# Avance periodo
def avance_periodo_texto(x):
if x['monitoreable'] == "no monitoreable":
return "N/A"
elif x['monitoreable'] == "monitoreable":
return x['avance_periodo']
df_pyg['avance_periodo_texto'] = df_pyg.apply(avance_periodo_texto, axis=1)
# Avance
def avance(x):
if x['captura_seguimiento'] == 0 and x['monitoreable'] == "no monitoreable":
return "N/A"
else:
return x['avance_anual']
df_pyg['avance_texto'] = df_pyg.apply(avance, axis=1)
#Renombramos archivos
#MIR
df_mir = df_mir.rename(columns = {'dye' : 'DyE',
'algoritmo' : 'Algoritmo',
'unidad_medida_indicador' : 'Unidad de Medida del Indicador',
'frecuencia_medicion' : 'Frecuencia de Medición',
'acumulable' : 'Acumulable',
'sentido' : 'Sentido del Indicador',
'valor_linea_base' : 'Valor Línea Base',
'meta_anual_2024' : 'Meta Anual',
'meta_anual' : 'Meta Anual -',
'meta_alcanzada' : 'Meta Alcanzada',
'avance' : '% Av. Físico Anual',
'programa_presupuestario' : 'Programa Presupuestario',
'objetivo' : 'Objetivo',
'indicador' : 'Indicador',
'clave_jerarquia' : 'clave_jerarquia',
'meta_alcanzada_texto' : 'Meta Alcanzada (texto)',
'avance_texto' : '% Av. Físico (texto)',
'susceptible_reporte' : 'Susceptible de reporte'})
#ByS
df_bys = df_bys.rename(columns = {'dye' : 'DyE',
'ponderacion' : 'Ponderación %',
'meta_modificada' : 'Meta Anual',
'meta_calendarizada' : 'Meta Calendarizada',
'captura_seguimiento' : 'Meta Alcanzada',
'avance_periodo' : '% Cumplimiento',
'avance_anual' : '% Av. Físico Anual',
'programa_presupuestario' : 'Programa Presupuestario',
'componente' : 'Componente',
'bys' : 'Bien y Servicio',
'meta_calendarizada_texto' : 'Meta Calendarizada (texto)',
'captura_seguimiento_texto' : 'Meta Alcanzada (texto)',
'avance_periodo_texto' : '% Cumplimiento (texto)',
'avance_texto' : '% Av. Físico (texto)'})
#PyG
df_pyg = df_pyg.rename(columns = {'dye' : 'DyE',
'ponderacion' : 'Ponderación %',
'meta_modificada' : 'Meta Anual',
'meta_calendarizada' : 'Meta Calendarizada',
'captura_seguimiento' : 'Meta Alcanzada',
'avance_periodo' : '% Cumplimiento',
'avance_anual' : '% Av. Físico Anual',
'programa_presupuestario' : 'Programa Presupuestario',
'componete' : 'Componente',
'proceso' : 'Proceso',
'entregable' : 'Entregable',
'meta_calendarizada_texto' : 'Meta Calendarizada (texto)',
'captura_seguimiento_texto' : 'Meta Alcanzada (texto)',
'avance_periodo_texto' : '% Cumplimiento (texto)',
'avance_texto' : '% Av. Físico (texto)'})
#Exportamos data frames
df_mir['indicadores_considerados'] = df_mir['nivel_mir'] + "_" + df_mir['nombre_indicador']
def indicadores_considerados(x):
if x['indicadores_considerados'] in ["04.actividad_Porcentaje de Avance Financiero del Proceso/Proyecto",
"04.actividad_Porcentaje de Avance Físico del Proceso/Proyecto"]:
return 0
else:
return 1
df_mir['indicadores_considerados'] = df_mir.apply(indicadores_considerados, axis = 1)
#Exportamos
lista_dye = ['0201 Ofi. Gob.', '0202 CGCS', '0203 Ofi. Sec. Part.', '0209 IPLANEG', '0212 JEGAPE',
'0213 UTAPE', '0214 GTOMX', '0215 CGJ', '04 SG', '05 SDSH', '06 SFIA', '07 SSP', '08 SDAyR',
'10 SDES', '11 SEG', '12 SSG', '20 SICOM', '21 SECTUR', '27 STyRC', '3001 CODE', '3002 UTEG', '3004 DIF',
'3005 CECYTEG', '3007 UTNG', '3008 MIQ', '3009 CEAG', '3010 COFOCE', '3011 IEC', '3012 UTL', '3017 ITESI',
'3018 SABES', '3019 ISAPEG', '3021 ITSUR', '3022 CECAMED', '3024 UTSOE', '3025 JUVENTUDES GTO', '3026 PAOT',
'3027 CONALEP', '3029 IMUG', '3031 ISSEG', '3034 EPRR', '3035 INAEBA', '3036 UPGTO', '3037 FORUM', '3038 IECA',
'3039 UVEG', '3042 CECCEG', '3043 ITESG', '3044 ITESS', '3045 UPPE', '3046 UPJR', '3049 UPB',
'3050 UTSMA', '3052 UTS', '3054 INGUDIS', '3057 ITESA', '3058 ITSPR', '3059 UTLB',
'3061 SESEA', '3062 INFOSPE', '3063 PEPNNA', '3064 IDEA GTO', '3065 CEAIV', '3066 CCL','3067 UIEG', '3068 AGEG',
'32 SMAOT', '34 SMEI', 'FINALIZAR']
#Para el nombre del archivo
workbook_name = ['0201_Ofi. Gob.', '0202_CGCS', '0203_Ofi. Sec. Part.', '0209_IPLANEG', '0212_JEGAPE',
'0213_UTAPE', '0214_GTOMX', '0215_CGJ', '04_SG', '05_SDSH', '06_SFIA', '07_SSP', '08_SDAyR',
'10_SDES', '11_SEG', '12_SSG', '20_SICOM', '21_SECTUR', '27_STyRC', '3001_CODE', '3002_UTEG', '3004_DIF',
'3005_CECYTEG', '3007_UTNG', '3008_MIQ', '3009_CEAG', '3010_COFOCE', '3011_IEC', '3012_UTL', '3017_ITESI',
'3018_SABES', '3019_ISAPEG', '3021_ITSUR', '3022_CECAMED', '3024_UTSOE', '3025_JUVENTUDES GTO', '3026_PAOT',
'3027_CONALEP', '3029_IMUG', '3031_ISSEG', '3034_EPRR', '3035_INAEBA', '3036_UPGTO', '3037_FORUM', '3038_IECA',
'3039_UVEG', '3042_CECCEG', '3043_ITESG', '3044_ITESS', '3045_UPPE', '3046_UPJR', '3049_UPB',
'3050_UTSMA', '3052_UTS', '3054_INGUDIS', '3057_ITESA', '3058_ITSPR', '3059_UTLB',
'3061_SESEA', '3062_INFOSPE', '3063_PEPNNA', '3064_IDEA GTO', '3065_CEAIV', '3066_CCL','3067 UIEG', '3068 AGEG',
'32_SMAOT','34_SMEI', 'FINALIZAR']
series = np.arange(0, 69)
list_workbooks = []
for valor in series:
dye = lista_dye[valor]
name = workbook_name[valor]
# Create a Pandas Excel writer using XlsxWriter as the engine.
list_workbooks.append(f'MyE_{name}_Fichas_2024_T2.xlsx')
writer = pd.ExcelWriter(f'MyE_{name}_Fichas_2024_T2.xlsx', engine='xlsxwriter')
# Definir el relleno blanco
blanco = PatternFill(start_color="FFFFFF", end_color="FFFFFF", fill_type="solid")
# Aplicar relleno blanco a todas las celdas de la hoja de trabajo
for row in ws.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50): # Limitamos el rango para un mejor rendimiento
for cell in row:
cell.fill = blanco
mir = df_mir[(df_mir['list_name_wb'] == dye) & (df_mir['aplica'] == 'aplica') & (df_mir['indicadores_considerados'] == 1)]
mir = mir[['Programa Presupuestario', 'Objetivo', 'Indicador','Unidad de Medida del Indicador', 'Algoritmo',
'Sentido del Indicador', 'Acumulable', 'Frecuencia de Medición', 'Susceptible de reporte', 'Valor Línea Base', 'Meta Anual', 'Meta Alcanzada','% Av. Físico Anual',
'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul', 'Riesgo de Cumplimiento de la Meta Anual',
'Descripción de las acciones de mejora/Comentarios']]
mir.to_excel(writer, sheet_name = 'MIR', index = False)
bys = df_bys[(df_bys['list_name_wb'] == dye) & (df_bys['aplica'] == 'aplica')]
bys = bys[['DyE','Programa Presupuestario', 'Componente', 'Bien y Servicio', 'Meta Anual','Meta Calendarizada',
'Meta Alcanzada', '% Cumplimiento', '% Av. Físico Anual']]
bys.to_excel(writer, sheet_name = 'ByS', index = False)
pyg = df_pyg[(df_pyg['list_name_wb'] == dye) & (df_pyg['aplica'] == 'aplica')]
pyg = pyg[['DyE','Programa Presupuestario', 'Componente', 'Proceso', 'Entregable', 'Meta Anual',
'Meta Calendarizada', 'Meta Alcanzada', '% Cumplimiento', '% Av. Físico Anual']]
pyg.to_excel(writer, sheet_name = 'PyG', index = False)
# Close the Pandas Excel writer and output the Excel file.
writer.close()
#Nivel actividad
# Para el filtro de la tabla
lista_dye = ['3051 GPI','F002 FOFIES','F003 FOGIM', '3053 XONOTLI', 'FINALIZAR']
#Para el nombre del archivo
workbook_name = ['3051_GPI','F002_FOFIES','F003_FOGIM','3053_XONOTLI', 'FINALIZAR']
series = np.array([0, 1, 2, 3, 4])
list_workbooks = []
for valor in series:
dye = lista_dye[valor] # Es del tipo str.
print(dye)
name = workbook_name[valor]
print(name)
# Create a Pandas Excel writer using XlsxWriter as the engine.
list_workbooks.append('MyE_' + name + '_Fichas_2024_T2.xlsx')
writer = pd.ExcelWriter('MyE_' + name + '_Fichas_2024_T2.xlsx', engine='xlsxwriter')
mir = df_mir[(df_mir['list_name_wb'] == dye) & (df_mir['aplica'] == 'aplica')]
mir = mir[['DyE','Programa Presupuestario', 'Objetivo', 'Indicador','Unidad de Medida del Indicador', 'Algoritmo',
'Sentido del Indicador','Acumulable', 'Frecuencia de Medición', 'Susceptible de reporte','Valor Línea Base',
'Meta Anual', 'Meta Anual -', 'Meta Alcanzada (texto)', '% Av. Físico (texto)',
'Meta Alcanzada', '% Av. Físico Anual', 'aplica','clave_jerarquia']]
count_row_mir = mir.shape[0]
print(count_row_mir)
if count_row_mir != 0:
mir.to_excel(writer, sheet_name='MIR', index=False)
bys = df_bys[(df_bys['list_name_wb'] == dye) & (df_bys['aplica'] == 'aplica')]
bys = bys[['DyE', 'Programa Presupuestario', 'Componente', 'Bien y Servicio', 'Ponderación %', 'Meta Anual',
'Meta Calendarizada (texto)','Meta Alcanzada (texto)', '% Cumplimiento (texto)', '% Av. Físico (texto)',
'Meta Calendarizada', 'Meta Alcanzada', '% Cumplimiento', '% Av. Físico Anual','clave_jerarquia']]
count_row_bys = bys.shape[0]
print(count_row_bys)
if count_row_bys != 0:
bys.to_excel(writer, sheet_name='ByS', index=False)
ps = df_pyg[(df_pyg['list_name_wb'] == dye) & (df_pyg['pg'] == 'P') & (df_pyg['aplica'] == 'aplica')]
ps = ps[['DyE', 'Programa Presupuestario', 'Componente', 'Proceso', 'Entregable', 'Ponderación %', 'Meta Anual',
'Meta Calendarizada (texto)','Meta Alcanzada (texto)',
'% Cumplimiento (texto)', '% Av. Físico (texto)',
'Meta Calendarizada','Meta Alcanzada', '% Cumplimiento',
'% Av. Físico Anual','aplica','clave_jerarquia_p']]
count_row_ps = ps.shape[0]
print(count_row_ps)
if count_row_ps != 0:
ps.to_excel(writer, sheet_name='Ps', index=False)
gs = df_pyg[(df_pyg['list_name_wb'] == dye) & (df_pyg['pg'] == 'G') & (df_pyg['aplica'] == 'aplica')]
gs = gs[['DyE','Proceso', 'Entregable', 'Ponderación %', 'Meta Anual',
'Meta Calendarizada (texto)','Meta Alcanzada (texto)',
'% Cumplimiento (texto)', '% Av. Físico (texto)',
'Meta Calendarizada', 'Meta Alcanzada',
'% Cumplimiento', '% Av. Físico Anual', 'aplica','clave_jerarquia_g']]
count_row_gs = gs.shape[0]
print(count_row_gs)
if count_row_gs != 0:
gs.to_excel(writer, sheet_name='Gs', index=False)
# Close the Pandas Excel writer and output the Excel file.
writer.close()
lista_fichas = pd.DataFrame(list_workbooks, columns=['workbook_name'])
lista_fichas.to_excel("3. lista_fichas_generadas_actividad.xlsx", index=False)
# Listas proporcionadas
lista_dye = ['0201 Ofi. Gob.', '0202 CGCS', '0203 Ofi. Sec. Part.', '0209 IPLANEG', '0212 JEGAPE',
'0213 UTAPE', '0214 GTOMX', '0215 CGJ', '04 SG', '05 SDSH', '06 SFIA', '07 SSP', '08 SDAyR',
'10 SDES', '11 SEG', '12 SSG', '20 SICOM', '21 SECTUR', '27 STyRC', '3001 CODE', '3002 UTEG', '3004 DIF',
'3005 CECYTEG', '3007 UTNG', '3008 MIQ', '3009 CEAG', '3010 COFOCE', '3011 IEC', '3012 UTL', '3017 ITESI',
'3018 SABES', '3019 ISAPEG', '3021 ITSUR', '3022 CECAMED', '3024 UTSOE', '3025 JUVENTUDES GTO', '3026 PAOT',
'3027 CONALEP', '3029 IMUG', '3031 ISSEG', '3034 EPRR', '3035 INAEBA', '3036 UPGTO', '3037 FORUM', '3038 IECA',
'3039 UVEG', '3042 CECCEG', '3043 ITESG', '3044 ITESS', '3045 UPPE', '3046 UPJR', '3049 UPB',
'3050 UTSMA', '3052 UTS', '3054 INGUDIS', '3057 ITESA', '3058 ITSPR', '3059 UTLB',
'3061 SESEA', '3062 INFOSPE', '3063 PEPNNA', '3064 IDEA GTO', '3065 CEAIV', '3066 CCL','3067 UIEG', '3068 AGEG',
'32 SMAOT', '34 SMEI', 'FINALIZAR']
workbook_name = ['0201_Ofi. Gob.', '0202_CGCS', '0203_Ofi. Sec. Part.', '0209_IPLANEG', '0212_JEGAPE',
'0213_UTAPE', '0214_GTOMX', '0215_CGJ', '04_SG', '05_SDSH', '06_SFIA', '07_SSP', '08_SDAyR',
'10_SDES', '11_SEG', '12_SSG', '20_SICOM', '21_SECTUR', '27_STyRC', '3001_CODE', '3002_UTEG', '3004_DIF',
'3005_CECYTEG', '3007_UTNG', '3008_MIQ', '3009_CEAG', '3010_COFOCE', '3011_IEC', '3012_UTL', '3017_ITESI',
'3018_SABES', '3019_ISAPEG', '3021_ITSUR', '3022_CECAMED', '3024_UTSOE', '3025_JUVENTUDES GTO', '3026_PAOT',
'3027_CONALEP', '3029_IMUG', '3031_ISSEG', '3034_EPRR', '3035_INAEBA', '3036_UPGTO', '3037_FORUM', '3038_IECA',
'3039_UVEG', '3042_CECCEG', '3043_ITESG', '3044_ITESS', '3045_UPPE', '3046_UPJR', '3049_UPB',
'3050_UTSMA', '3052_UTS', '3054_INGUDIS', '3057_ITESA', '3058_ITSPR', '3059_UTLB',
'3061_SESEA', '3062_INFOSPE', '3063_PEPNNA', '3064_IDEA GTO', '3065_CEAIV', '3066_CCL','3067_UIEG', '3068_AGEG',
'32_SMAOT','34_SMEI', 'FINALIZAR']
series = np.arange(len(lista_dye))
list_workbooks = []
for valor in series:
dye = lista_dye[valor] # Es del tipo str.
print(dye)
name = workbook_name[valor]
print(name)
# Crear escritor de Excel
workbook_path = 'MyE_' + name + '_Fichas_2024_T2_anexo_actividad.xlsx'
list_workbooks.append(workbook_path)
writer = pd.ExcelWriter(workbook_path, engine='xlsxwriter')
mir = df_mir[(df_mir['list_name_wb'] == dye) & (df_mir['aplica'] == 'aplica') & (df_mir['indicadores_considerados'] == 0)]
mir = mir[['DyE', 'Programa Presupuestario', 'Objetivo', 'Indicador', 'Unidad de Medida del Indicador', 'Algoritmo',
'Sentido del Indicador', 'Acumulable', 'Frecuencia de Medición', 'Susceptible de reporte', 'Valor Línea Base',
'Meta Anual', 'Meta Anual -', 'Meta Alcanzada (texto)', '% Av. Físico (texto)',
'Meta Alcanzada', '% Av. Físico Anual', 'aplica', 'clave_jerarquia']]
count_row_mir = mir.shape[0]
print(count_row_mir)
# Condicional num de renglones.
if count_row_mir != 0:
# Agregar pestaña
mir.to_excel(writer, sheet_name='MIR', index=False)
# Cerrar y guardar el archivo
writer.close()
# Guardar lista de nombres de archivos generados
lista_fichas = pd.DataFrame(list_workbooks, columns=['workbook_name'])
lista_fichas.to_excel("4. lista_fichas_anexo_actividad.xlsx", index=False)
#Código 2:
#Platilla del formato de las fichas
import pandas as pd
import openpyxl
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
from openpyxl.worksheet.table import Table, TableStyleInfo
import os
os.chdir(r'C:\Users\USERDesktop\Prácticas\Plantilla')
# Ruta del archivo Excel nuevo
new_path = 'TemplateExcelFichasAvance.xlsx'
# Crear un nuevo libro de trabajo y una hoja de trabajo llamada 'MIR'
wb = openpyxl.Workbook()
ws = wb.active # Corrección aquí
ws.title = "MIR"
# Definir el relleno blanco
blanco = PatternFill(start_color="FFFFFF", end_color="FFFFFF", fill_type="solid")
# Aplicar relleno blanco a todas las celdas de la hoja de trabajo
for row in ws.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50): # Limitamos el rango para un mejor rendimiento
for cell in row:
cell.fill = blanco
# Guardar el archivo Excel con los cambios
wb.save(new_path)
# DataFrame para MIR con los encabezados de la tabla
MIR_headers = [
'Programa Presupuestario', 'Objetivo', 'Indicador', 'Unidad de Medida del Indicador', 'Algoritmo', 'Sentido del Indicador',
'Acumulable', 'Frecuencia de Medición', 'Susceptible de reporte', 'Valor Línea Base', 'Meta Anual', 'Meta Alcanzada', '% Av. Físico Anual',
'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul', 'Riesgo de Cumplimiento de la Meta Anual',
'Descripción de las acciones de mejora/Comentarios'
]
# Asegurarnos de que los encabezados sean cadenas
MIR_headers = [str(header) for header in MIR_headers]
MIR = pd.DataFrame(columns=MIR_headers)
# Guardar el DataFrame en el archivo Excel existente
with pd.ExcelWriter(new_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
MIR.to_excel(writer, startcol=1, startrow=4, sheet_name='MIR', index=False)
worksheet = writer.sheets['MIR']
# Cargar el archivo Excel nuevo con openpyxl
wb = openpyxl.load_workbook(new_path)
ws = wb['MIR']
# Agregar encabezado personalizado
ws.merge_cells('B2:Q2')
header = ws['B2']
header.value = '{{dye}}'
header.font = Font(bold=True, size=14)
header.alignment = Alignment(horizontal="center")
ws.merge_cells('B3:Q3')
sub_header = ws['B3']
sub_header.value = 'Periodo Enero - {{periodo}} {{ciclo}}'
sub_header.font = Font(bold=True, size=12)
sub_header.alignment = Alignment(horizontal="center")
# Crear y agregar la tabla
tab = Table(displayName="TablaMir", ref=f'B5:Q{5+len(MIR)}')
style = TableStyleInfo(
name="TableStyleMedium9", showFirstColumn=False, showLastColumn=False,
showRowStripes=True, showColumnStripes=True
)
tab.tableStyleInfo = style
ws.add_table(tab)
# Estilos de celdas
naranja = PatternFill(fgColor="ED7D31", fill_type="solid")
azul = PatternFill(fgColor="002060", fill_type="solid")
texto_blanco = Font(color="FFFFFF", bold=True)
borde_blanco = Border(
left=Side(style='thin', color='FFFFFF'), right=Side(style='thin', color='FFFFFF'),
top=Side(style='thin', color='FFFFFF'), bottom=Side(style='thin', color='FFFFFF')
)
# Aplicar estilos a los encabezados de la tabla
for cell in ws["5:5"]:
if cell.column_letter in ['O', 'P', 'Q']:
cell.fill = naranja
elif 'B' <= cell.column_letter <= 'Q': # Rango de la tabla
cell.fill = azul
else: # Fuera del rango de la tabla
cell.fill = blanco
cell.font = texto_blanco
cell.border = borde_blanco
cell.alignment = Alignment(horizontal="center", vertical="center")
# Guardar el archivo Excel con los cambios
wb.save(new_path)
#----------------------------ByS--------------------------------------
# Crear una nueva hoja de trabajo llamada 'ByS' y agregarle el formato
ws_bys = wb.create_sheet(title="ByS")
# Definir el relleno blanco para la nueva hoja
for row in ws_bys.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50):
for cell in row:
cell.fill = blanco
# Guardar el archivo Excel con los cambios
wb.save(new_path)
# DataFrame para ByS con los encabezados de la tabla
ByS_headers = [
'Programa Presupuestario', 'Componente', 'Bien y Servicio', 'Ponderación %', 'Meta Anual',
'Meta Calendarizada', 'Meta Alcanzada', '% Cumplimiento', '% Av. Físico Anual', 'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul',
'Riesgo de Cumplimiento de la Meta Anual', 'Descripción de las acciones de mejora/Comentarios'
]
# Asegurarnos de que los encabezados sean cadenas
ByS_headers = [str(header) for header in ByS_headers]
ByS = pd.DataFrame(columns=ByS_headers)
# Guardar el DataFrame en la hoja 'ByS'
with pd.ExcelWriter(new_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
ByS.to_excel(writer, startcol=1, startrow=4, sheet_name='ByS', index=False)
worksheet_bys = writer.sheets['ByS']
# Cargar el archivo Excel nuevo con openpyxl
wb = openpyxl.load_workbook(new_path)
# Cargar la hoja 'ByS'
ws_bys = wb['ByS']
# Agregar encabezado personalizado a 'ByS'
ws_bys.merge_cells('B2:M2')
header_bys = ws_bys['B2']
header_bys.value = '{{dye}}'
header_bys.font = Font(bold=True, size=14)
header_bys.alignment = Alignment(horizontal="center")
ws_bys.merge_cells('B3:M3')
sub_header_bys = ws_bys['B3']
sub_header_bys.value = 'Periodo Enero - {{periodo}} {{ciclo}}'
sub_header_bys.font = Font(bold=True, size=12)
sub_header_bys.alignment = Alignment(horizontal="center")
# Crear y agregar la tabla a 'ByS'
tab_bys = Table(displayName="TablaByS", ref=f'B5:M{5+len(ByS)}')
style_bys = TableStyleInfo(
name="TableStyleMedium9", showFirstColumn=False, showLastColumn=False,
showRowStripes=True, showColumnStripes=True
)
tab_bys.tableStyleInfo = style_bys
ws_bys.add_table(tab_bys)
# Aplicar estilos a los encabezados de la tabla en 'ByS'
for cell in ws_bys["5:5"]:
if cell.column_letter in ['K', 'L', 'M']:
cell.fill = naranja
elif 'B' <= cell.column_letter <= 'M': # Rango de la tabla
cell.fill = azul
else: # Fuera del rango de la tabla
cell.fill = blanco
cell.font = texto_blanco
cell.border = borde_blanco
cell.alignment = Alignment(horizontal="center", vertical="center")
# Guardar el archivo
wb.save(new_path)
#--------------------------Ps-----------------------
# Crear una nueva hoja de trabajo llamada 'Ps' y agregarle el formato
ws_Ps = wb.create_sheet(title="Ps")
# Definir el relleno blanco para la nueva hoja
for row in ws_Ps.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50):
for cell in row:
cell.fill = blanco
# Guardar el archivo Excel con los cambios
wb.save(new_path)
# DataFrame para Ps con los encabezados de la tabla
Ps_headers = [
'Programa Presupuestario', 'Componente', 'Proceso', 'Entregable', 'Ponderación %', 'Meta Anual', 'Meta Calendarizada',
'Meta Alcanzada', '%Av. Físico Anual', 'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul',
'Riesgo de Cumplimiento de la Meta Anual', 'Descripción de las acciones de mejora o Comentarios'
]
# Asegurarnos de que los encabezados sean cadenas
Ps_headers = [str(header) for header in Ps_headers]
Ps = pd.DataFrame(columns=Ps_headers)
# Guardar el DataFrame en la hoja 'Ps'
with pd.ExcelWriter(new_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
Ps.to_excel(writer, startcol=1, startrow=4, sheet_name='Ps', index=False)
worksheet_Ps = writer.sheets['Ps']
# Cargar el archivo Excel nuevo con openpyxl
wb = openpyxl.load_workbook(new_path)
# Cargar la hoja 'Ps'
ws_Ps = wb['Ps']
# Agregar encabezado personalizado a 'Ps'
ws_Ps.merge_cells('B2:N2')
header_Ps = ws_Ps['B2']
header_Ps.value = '{{dye}}'
header_Ps.font = Font(bold=True, size=14)
header_Ps.alignment = Alignment(horizontal="center")
ws_Ps.merge_cells('B3:N3')
sub_header_Ps = ws_Ps['B3']
sub_header_Ps.value = 'Periodo Enero - {{periodo}} {{ciclo}}'
sub_header_Ps.font = Font(bold=True, size=12)
sub_header_Ps.alignment = Alignment(horizontal="center")
# Crear y agregar la tabla a 'Ps'
tab_Ps = Table(displayName="TablaPs", ref=f'B5:N{5+len(Ps)}')
style_Ps = TableStyleInfo(
name="TableStyleMedium9", showFirstColumn=False, showLastColumn=False,
showRowStripes=True, showColumnStripes=True
)
tab_Ps.tableStyleInfo = style_Ps
ws_Ps.add_table(tab_Ps)
# Aplicar estilos a los encabezados de la tabla en 'Ps'
for cell in ws_Ps["5:5"]:
if cell.column_letter in ['K', 'L', 'M', 'N']:
cell.fill = naranja
elif 'B' <= cell.column_letter <= 'N': # Rango de la tabla
cell.fill = azul
else: # Fuera del rango de la tabla
cell.fill = blanco
cell.font = texto_blanco
cell.border = borde_blanco
cell.alignment = Alignment(horizontal="center", vertical="center")
#--------------------------Gs-----------------------
# Crear una nueva hoja de trabajo llamada 'Gs' y agregarle el formato
ws_Gs = wb.create_sheet(title="Gs")
# Definir el relleno blanco para la nueva hoja
for row in ws_Gs.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50):
for cell in row:
cell.fill = blanco
# Guardar el archivo Excel con los cambios
wb.save(new_path)
# DataFrame para Gs con los encabezados de la tabla
Gs_headers = [
'Proceso', 'Entregable', 'Ponderación %', 'Meta Anual', 'Meta Calendarizada', 'Meta Alcanzada', '% Av. Físico Anual',
'Av. Físico al periodo', 'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul',
'Riesgo de Cumplimiento de la Meta Anual', 'Descripción de las acciones de mejora/Comentarios'
]
ws_Gs = wb['Gs']
# Agregar encabezado personalizado
ws_Gs.merge_cells('B2:L2')
header_Gs = ws_Gs['B2']
header_Gs.value = '{{dye}}'
header_Gs.font = Font(bold=True, size=14)
header_Gs.alignment = Alignment(horizontal="center")
ws_Gs.merge_cells('B3:L3')
sub_header_Gs = ws_Gs['B3']
sub_header_Gs.value = 'Periodo Enero - {{periodo}} {{ciclo}}'
sub_header_Gs.font = Font(bold=True, size=12)
sub_header_Gs.alignment = Alignment(horizontal="center")
# Crear y agregar la tabla
tab_Gs = Table(displayName="TablaGs", ref=f'B5:L{5+len(Gs)}')
style_Gs = TableStyleInfo(
name="TableStyleMedium9", showFirstColumn=False, showLastColumn=False,
showRowStripes=True, showColumnStripes=True
)
tab_Gs.tableStyleInfo = style_Gs
ws_Gs.add_table(tab_Gs)
# Aplicar estilos a los encabezados de la tabla
for cell in ws_Gs["5:5"]:
if cell.column_letter in ['J', 'K', 'L']:
cell.fill = naranja
elif 'B' <= cell.column_letter <= 'L': # Rango de la tabla
cell.fill = azul
else: # Fuera del rango de la tabla
cell.fill = blanco
cell.font = texto_blanco
cell.border = borde_blanco
cell.alignment = Alignment(horizontal="center", vertical="center")
# Guardar el archivo
wb.save(new_path)
# Confirmación final
print(f'El archivo se ha creado correctamente en la ruta: {new_path}')
#Genera fichas contenidas en archivos de excel con las hojas MIR, ByS y PyG pero quiero que el formato de #estas fichasgeneradas sea el del código 2.
trimestre = "T2"
ciclo = '2024'
!pip install pymysql
!pip install xlsxwriter
# Importamos librerías
import pandas as pd
import pymysql
from sqlalchemy import create_engine
import sys
import numpy as np
import scipy.io
import shutil
import xlsxwriter
import re
import os
os.chdir(r'C:\Users\USER\Desktop\Prácticas\Plantilla\Versión 2')
#Los siguientes son importantes para abrir el mysql
from openpyxl import Workbook
from openpyxl import load_workbook
from datetime import datetime
#Documento de excel
ubic = pd.ExcelFile('A. desempeno_mir.xlsx')
hoja = 'Sheet1'
mir_excel = pd.read_excel(ubic, sheet_name = hoja, engine = "openpyxl")
ubic = pd.ExcelFile('A. desempeno_bys.xlsx')
hoja = 'Sheet1'
bys_excel = pd.read_excel(ubic, sheet_name = hoja)
ubic = pd.ExcelFile('A. desempeno_pyg.xlsx')
hoja = 'Sheet1'
pyg_excel = pd.read_excel(ubic, sheet_name = hoja)
#-----------------------MIR-----------------------------
# Función para revisar saltos de línea en las columnas
def saltos_linea(columnas):
for c in columnas:
if mir_excel[c].dtype == "object":
print(c)
print(
mir_excel[mir_excel[c].str.count('\n') != 0]
.shape[0])
lista_columnas = [
'dye',
'ramo_dye',
'siglas_dye',
'eje_gobierno',
'nivel_mir',
'clave_mir',
'resumen_narrativo_mir',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'id_indicador',
'nombre_indicador',
'algoritmo',
'unidad_medida_indicador',
'frecuencia_medicion',
'fecha_disponibilidad_informacion',
'monitoreable',
'acumulable',
'sentido',
'aplica'
]
saltos_linea(lista_columnas)
# Función para quitar dobles espacios
def sustituir_dobles_espacios(columna):
columna_modificada = []
for texto in columna:
texto_modificado = re.sub(r'\s+', ' ', texto)
columna_modificada.append(texto_modificado)
return columna_modificada
# Función para aplicar correcciones
def correcciones(columnas):
for c in columnas:
if mir_excel[c].dtype == "object":
# Rellenar valores NaN con cadena vacía
mir_excel[c] = mir_excel[c].fillna("")
# Reemplazar saltos de línea
mir_excel[c] = mir_excel[c].str.replace('\n', ' ')
# Reemplazar _x000D_
mir_excel[c] = mir_excel[c].str.replace('_x000D_', ' ')
# Quitar dobles espacios
mir_excel[c] = sustituir_dobles_espacios(mir_excel[c])
# Quitar espacios al inicio y al final
mir_excel[c] = mir_excel[c].str.strip()
lista_columnas = ['resumen_narrativo_mir', 'nombre_indicador']
correcciones(lista_columnas)
#---------------------------ByS--------------------------
#REVISAR
def saltos_linea(columna):
for c in columna:
print(c)
print(
bys_excel[bys_excel[c].str.count('\n') != 0]
.shape[0])
lista_columnas = ['ramo_dye',
'siglas_dye',
'dye',
'eje_gobierno',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'clave_componente',
'nombre_componente',
'nombre_bys',
'unidad_medida',
'monitoreable',
'aplica']
saltos_linea(lista_columnas)
# Quitar dobles espacios
def sustituir_dobles_espacios(columna):
columna_modificada = []
for texto in columna:
texto_modificado = re.sub(r'\s+', ' ', texto)
columna_modificada.append(texto_modificado)
return columna_modificada
def correcciones(columna):
for c in columna:
# Valores nan
#bys_excel[c].fillna("", inplace=True)
bys_excel[c] = bys_excel[c].fillna("")
# Salto de linea
bys_excel[c] = bys_excel[c].str.replace('\n',' ')
# Por sí los salto de linea ya son _x000D_
bys_excel[c] = bys_excel[c].str.replace('_x000D_',' ')
# Quitar dobles espacios.
bys_excel[c] = sustituir_dobles_espacios(bys_excel[c])
# Espacios al inicio y al final
bys_excel[c] = bys_excel[c] .str.strip()
lista_columnas = ['nombre_bys', 'unidad_medida']
correcciones(lista_columnas)
#------------------------P&G-------------------------------
#REVISAR
def saltos_linea(columna):
for c in columna:
print(c)
print(
pyg_excel[
(pyg_excel[c].str.count('\n') != 0)
&
(pyg_excel['pg'] == 'P')
].shape[0])
lista_columnas = ['ramo_dye',
'siglas_dye',
'dye',
'eje_gobierno',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'clave_componente',
'nombre_componente',
'pg',
'clave_pg_recodificada',
'nombre_pg',
'nombre_entregable',
'unidad_medida',
'monitoreable',
'aplica'
]
saltos_linea(lista_columnas)
# Quitar dobles espacios
def sustituir_dobles_espacios(columna):
columna_modificada = []
for texto in columna:
texto_modificado = re.sub(r'\s+', ' ', texto)
columna_modificada.append(texto_modificado)
return columna_modificada
def correcciones(columna):
for c in columna:
# Valores nan
#pyg_excel[c].fillna("", inplace=True)
pyg_excel[c] = pyg_excel[c].fillna("")
# Salto de linea
pyg_excel[c] = pyg_excel[c].str.replace('\n',' ')
# Por sí los salto de linea ya son _x000D_
pyg_excel[c] = pyg_excel[c].str.replace('_x000D_',' ')
# Quitar dobles espacios.
pyg_excel[c] = sustituir_dobles_espacios(pyg_excel[c])
# Espacios al inicio y al final
pyg_excel[c] = pyg_excel[c] .str.strip()
lista_columnas = ['nombre_pg', 'nombre_entregable', 'unidad_medida']
correcciones(lista_columnas)
# Nuevo
df_mir = mir_excel[['dye',
'ramo_dye',
'siglas_dye',
'eje_gobierno',
'nivel_mir',
'clave_mir',
'clave_pq_recodificada',
'resumen_narrativo_mir',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'id_indicador',
'nombre_indicador',
'algoritmo',
'unidad_medida_indicador',
'frecuencia_medicion',
'fecha_disponibilidad_informacion',
'monitoreable',
'acumulable',
'sentido',
'valor_linea_base',
'meta_anual_2024',
'meta_anual',
'meta_alcanzada',
'avance',
'aplica']]
def nivel(x):
if x['nivel_mir'] == "FIN":
return "01.fin"
elif x['nivel_mir'] == "PROPOSITO":
return "02.proposito"
elif x['nivel_mir'] == "Componente":
return "03.componente"
elif x['nivel_mir'] == "Actividad":
return "04.actividad"
else:
return "error"
df_mir.loc[:, 'nivel_mir'] = df_mir.apply(nivel, axis=1)
df_bys = bys_excel[[ 'ramo_dye',
'siglas_dye',
'dye',
'eje_gobierno',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'clave_componente',
'nombre_componente',
'id_bys',
'nombre_bys',
'unidad_medida',
'ponderacion',
'meta_modificada',
'meta_calendarizada',
'captura_seguimiento',
'avance_periodo',
'avance_anual',
'monitoreable',
'aplica'
]]
# Asegúrate de que no haya valores nulos y convierte a int y luego a str
df_bys = df_bys.copy() # Asegúrate de trabajar con una copia
df_bys['id_bys'] = df_bys['id_bys'].fillna(0).astype('int64') # Convertir a int64
df_bys['id_bys'] = df_bys['id_bys'].astype('str') # Convertir a str
#df_bys.dtypes
df_pyg = pyg_excel[['ramo_dye',
'siglas_dye',
'dye',
'eje_gobierno',
'clave_programa_presupuestario',
'nombre_programa_presupuestario',
'clave_componente',
'nombre_componente',
'pg',
'clave_pg_recodificada',
'nombre_pg',
'id_entregable',
'nombre_entregable',
'unidad_medida',
'ponderacion',
'meta_modificada',
'meta_calendarizada',
'captura_seguimiento',
'avance_periodo',
'avance_anual',
'monitoreable',
'aplica'
]].copy() # Crear una copia
# Convertir valores de 'id_entregable' a int y luego a str
df_pyg['id_entregable'] = df_pyg['id_entregable'].fillna(0).astype('int64').astype('str')
# Asegurarse de que df_mir, df_bys y df_pyg son copias independientes
df_mir = df_mir.copy()
df_bys = df_bys.copy()
df_pyg = df_pyg.copy()
# Definir y nombrar los workbooks usando .loc[] para evitar SettingWithCopyWarning
df_mir.loc[:, 'list_name_wb'] = df_mir['ramo_dye'] + " " + df_mir['siglas_dye']
df_bys.loc[:, 'list_name_wb'] = df_bys['ramo_dye'] + " " + df_bys['siglas_dye']
df_pyg.loc[:, 'list_name_wb'] = df_pyg['ramo_dye'] + " " + df_pyg['siglas_dye']
df_list_name_wb = pd.concat([df_mir.list_name_wb, df_bys.list_name_wb, df_pyg.list_name_wb], axis=0)
df_list_name_wb = df_list_name_wb.drop_duplicates()
print(df_list_name_wb) #Observar que hay un NaN y es por el entregable de ByS que no debe considerarse.
df_list_name_wb.to_excel('1. db_list_names_wb.xlsx', index = False)
#---------------------MIR---------------
#Creamos columnas que se necesitaran.
df_mir['programa_presupuestario'] = df_mir['clave_programa_presupuestario'] + ". " + df_mir['nombre_programa_presupuestario']
def objetivo(x):
if x['nivel_mir'] == '04.actividad':
return x['nivel_mir'] + " - " + x['clave_pq_recodificada'] + '. '+ x['resumen_narrativo_mir']
else:
return x['nivel_mir'] + ". " + x['resumen_narrativo_mir']
df_mir['objetivo'] = df_mir.apply(objetivo, axis = 1)
df_mir['indicador'] = df_mir['id_indicador'].astype(str) + ". " + df_mir['nombre_indicador']
def orden(x):
if x['nivel_mir'] in ['01.fin', '02.proposito']:
return str(x['clave_programa_presupuestario']) + '.' + str(x['nivel_mir']) + '.' + str(x['id_indicador'])
elif x['nivel_mir'] in ['03.componente']:
return str(x['clave_programa_presupuestario']) + '.' + str(x['clave_mir'])[5:8] + '.' + str(x['nivel_mir']) + '.' + str(x['id_indicador'])
elif x['nivel_mir'] in ['04.actividad']:
return str(x['clave_programa_presupuestario']) + '.' + str(x['clave_mir'])[5:8] + '.' + str(x['nivel_mir']) + '.' + str(x['clave_mir'])[9:15] + '.' + str(x['id_indicador'])
else:
return "error"
df_mir['clave_jerarquia'] = df_mir.apply(orden,axis=1)
fechas = df_mir['fecha_disponibilidad_informacion'].str.split(pat = ",", n = -1, expand = True)
for num in range(24):
fechas.rename(columns = {fechas.columns[num] : 'fecha_' + str(num)}, inplace= True)
df_mir = pd.concat([df_mir,fechas], axis = 1)
df_mir['numero_caracteres_fecha'] = df_mir['fecha_disponibilidad_informacion'].str.len()
def frecuencia_medicion(x):
if x['numero_caracteres_fecha'] == 10 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] "
elif x['numero_caracteres_fecha'] == 21 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "]"
elif x['numero_caracteres_fecha'] == 32 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "] [" + x['fecha_2'] + "]"
elif x['numero_caracteres_fecha'] == 43 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "] [" + x['fecha_2'] + "] [" + x['fecha_3'] + "]"
else:
return x['frecuencia_medicion']
df_mir['frecuencia_medicion'] = df_mir.apply(frecuencia_medicion, axis = 1)
def meta_alcanzada_texto(x):
if x['monitoreable'] == 'no monitoreable' and (x['meta_alcanzada'] == 0 or pd.isnull(x['meta_alcanzada'])):
return "N/A"
elif x['monitoreable'] == 'no monitoreable' and x['meta_alcanzada'] != 0 and pd.notnull(x['meta_alcanzada']):
return x['meta_alcanzada']
elif x['monitoreable'] == 'monitoreable' and (x['meta_alcanzada'] == 0 or pd.isnull(x['meta_alcanzada'])):
return "Sin reporte de avance"
elif x['monitoreable'] == 'monitoreable' and x['meta_alcanzada'] != 0 and pd.notnull(x['meta_alcanzada']):
return x['meta_alcanzada']
df_mir['meta_alcanzada_texto'] = df_mir.apply(meta_alcanzada_texto, axis=1)
def avance(x):
if x['monitoreable'] == 'no monitoreable' and (x['avance'] == 0 or pd.isnull(x['avance'])):
return "N/A"
elif x['monitoreable'] == 'no monitoreable' and x['avance'] != 0 and pd.notnull(x['avance']):
return x['avance']
elif x['monitoreable'] == 'monitoreable':
return x['avance']
df_mir['avance_texto'] = df_mir.apply(avance, axis=1)
def susceptible_reporte(x):
if x['monitoreable'] == 'monitoreable':
return "Si"
elif x['monitoreable'] == 'no monitoreable':
return "No"
df_mir['susceptible_reporte'] = df_mir.apply(susceptible_reporte, axis=1)
#Frecuencia de medición + fecha de disponibilidad de la información
#Desglosamos fecha
fechas = df_mir['fecha_disponibilidad_informacion'].str.split(pat = ",", n = -1, expand = True)
for num in range(24):
fechas.rename(columns = {fechas.columns[num] : 'fecha_' + str(num)}, inplace= True)
df_mir = pd.concat([df_mir,fechas], axis = 1)
#Agregamos columna
df_mir['numero_caracteres_fecha'] = df_mir['fecha_disponibilidad_informacion'].str.len()
def frecuencia_medicion(x):
if x['numero_caracteres_fecha'] == 10 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] "
elif x['numero_caracteres_fecha'] == 21 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "]"
elif x['numero_caracteres_fecha'] == 32 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "] [" + x['fecha_2'] + "]"
elif x['numero_caracteres_fecha'] == 43 :
return x['frecuencia_medicion'] + " [" + x['fecha_0'] + "] [" + x['fecha_1'] + "] [" + x['fecha_2'] + "] [" + x['fecha_3'] + "]"
else:
return x['frecuencia_medicion']
df_mir['frecuencia_medicion'] = df_mir.apply(frecuencia_medicion, axis = 1)
#Meta alcanzada
def meta_alcanzada_texto(x):
if x['monitoreable'] == 'no monitoreable' and (x['meta_alcanzada'] == 0 or pd.isnull(x['meta_alcanzada'])):
return "N/A"
elif x['monitoreable'] == 'no monitoreable' and x['meta_alcanzada'] != 0 and pd.notnull(x['meta_alcanzada']):
return x['meta_alcanzada']
elif x['monitoreable'] == 'monitoreable' and (x['meta_alcanzada'] == 0 or pd.isnull(x['meta_alcanzada'])):
return "Sin reporte de avance"
elif x['monitoreable'] == 'monitoreable' and x['meta_alcanzada'] != 0 and pd.notnull(x['meta_alcanzada']):
return x['meta_alcanzada']
df_mir['meta_alcanzada_texto'] = df_mir.apply(meta_alcanzada_texto, axis=1)
#Avance
def avance(x):
if x['monitoreable'] == 'no monitoreable' and (x['avance'] == 0 or pd.isnull(x['avance'])):
return "N/A"
elif x['monitoreable'] == 'no monitoreable' and x['avance'] != 0 and pd.notnull(x['avance']):
return x['avance']
elif x['monitoreable'] == 'monitoreable':
return x['avance']
df_mir['avance_texto'] = df_mir.apply(avance, axis=1)
#Suceptible de reporte
def susceptible_reporte(x):
if x['monitoreable'] == 'monitoreable':
return "Si"
elif x['monitoreable'] == 'no monitoreable':
return "No"
df_mir['susceptible_reporte'] = df_mir.apply(susceptible_reporte, axis=1)
#----------------------ByS------------
#Creamos columnas que se necesitaran.
df_bys['programa_presupuestario'] = df_bys['clave_programa_presupuestario'] + "." + df_bys['nombre_programa_presupuestario']
df_bys['componente'] = df_bys['clave_componente'] + "." + df_bys['nombre_componente']
df_bys['bys'] = df_bys['id_bys'] + "." + df_bys['nombre_bys'] + " [" + df_bys['unidad_medida'] + "]"
df_bys['clave_jerarquia'] = df_bys['clave_componente'] + "." + df_bys['id_bys']
#Creamos columnas que se necesitaran.
#Meta calendarizada
def meta_calendarizada_texto(x):
if x['monitoreable'] == "no monitoreable":
return "Sin meta calendarizada"
elif x['monitoreable'] == "monitoreable":
return x['meta_calendarizada']
df_bys['meta_calendarizada_texto'] = df_bys.apply(meta_calendarizada_texto, axis=1)
#Meta alcanzada
def captura_seguimiento_texto(x):
if x['captura_seguimiento'] == 0 and x['monitoreable'] == "no monitoreable" :
return "Sin meta calendarizada"
elif x['captura_seguimiento'] == 0 and x['monitoreable'] == "monitoreable" :
return "Sin reporte de avance"
elif x['captura_seguimiento'] > 0 :
return x['captura_seguimiento']
df_bys['captura_seguimiento_texto'] = df_bys.apply(captura_seguimiento_texto, axis=1)
#Avance periodo
def avance_periodo_texto(x):
if x['monitoreable'] == "no monitoreable" :
return "N/A"
elif x['monitoreable'] == "monitoreable" :
return x['avance_periodo']
df_bys['avance_periodo_texto'] = df_bys.apply(avance_periodo_texto, axis=1)
#Avance
def avance(x):
if x['captura_seguimiento'] == 0 and x['monitoreable'] == "no monitoreable" :
return "N/A"
else:
return x['avance_anual']
df_bys['avance_texto'] = df_bys.apply(avance, axis = 1)
#------------------PyG------------
# Creamos columnas que se necesitarán.
df_pyg['programa_presupuestario'] = df_pyg['clave_programa_presupuestario'] + ". " + df_pyg['nombre_programa_presupuestario']
df_pyg['componete'] = df_pyg['clave_componente'] + ". " + df_pyg['nombre_componente']
df_pyg['proceso'] = df_pyg['clave_pg_recodificada'] + ". " + df_pyg['nombre_pg']
df_pyg['entregable'] = df_pyg['id_entregable'] + ". " + df_pyg['nombre_entregable'] + " [" + df_pyg['unidad_medida'] + "]"
df_pyg['clave_jerarquia_p'] = df_pyg['clave_componente'] + "." + df_pyg['clave_pg_recodificada'] + "." + df_pyg['id_entregable']
df_pyg['clave_jerarquia_g'] = df_pyg['clave_pg_recodificada'] + "." + df_pyg['id_entregable']
# Meta calendarizada
def meta_calendarizada_texto(x):
if x['monitoreable'] == "no monitoreable":
return "Sin meta calendarizada"
elif x['monitoreable'] == "monitoreable":
return x['meta_calendarizada']
df_pyg['meta_calendarizada_texto'] = df_pyg.apply(meta_calendarizada_texto, axis=1)
# Meta alcanzada
def captura_seguimiento_texto(x):
if x['captura_seguimiento'] == 0 and x['monitoreable'] == "no monitoreable":
return "Sin meta calendarizada"
elif x['captura_seguimiento'] == 0 and x['monitoreable'] == "monitoreable":
return "Sin reporte de avance"
elif x['captura_seguimiento'] > 0:
return x['captura_seguimiento']
df_pyg['captura_seguimiento_texto'] = df_pyg.apply(captura_seguimiento_texto, axis=1)
# Avance periodo
def avance_periodo_texto(x):
if x['monitoreable'] == "no monitoreable":
return "N/A"
elif x['monitoreable'] == "monitoreable":
return x['avance_periodo']
df_pyg['avance_periodo_texto'] = df_pyg.apply(avance_periodo_texto, axis=1)
# Avance
def avance(x):
if x['captura_seguimiento'] == 0 and x['monitoreable'] == "no monitoreable":
return "N/A"
else:
return x['avance_anual']
df_pyg['avance_texto'] = df_pyg.apply(avance, axis=1)
#Renombramos archivos
#MIR
df_mir = df_mir.rename(columns = {'dye' : 'DyE',
'algoritmo' : 'Algoritmo',
'unidad_medida_indicador' : 'Unidad de Medida del Indicador',
'frecuencia_medicion' : 'Frecuencia de Medición',
'acumulable' : 'Acumulable',
'sentido' : 'Sentido del Indicador',
'valor_linea_base' : 'Valor Línea Base',
'meta_anual_2024' : 'Meta Anual',
'meta_anual' : 'Meta Anual -',
'meta_alcanzada' : 'Meta Alcanzada',
'avance' : '% Av. Físico Anual',
'programa_presupuestario' : 'Programa Presupuestario',
'objetivo' : 'Objetivo',
'indicador' : 'Indicador',
'clave_jerarquia' : 'clave_jerarquia',
'meta_alcanzada_texto' : 'Meta Alcanzada (texto)',
'avance_texto' : '% Av. Físico (texto)',
'susceptible_reporte' : 'Susceptible de reporte'})
#ByS
df_bys = df_bys.rename(columns = {'dye' : 'DyE',
'ponderacion' : 'Ponderación %',
'meta_modificada' : 'Meta Anual',
'meta_calendarizada' : 'Meta Calendarizada',
'captura_seguimiento' : 'Meta Alcanzada',
'avance_periodo' : '% Cumplimiento',
'avance_anual' : '% Av. Físico Anual',
'programa_presupuestario' : 'Programa Presupuestario',
'componente' : 'Componente',
'bys' : 'Bien y Servicio',
'meta_calendarizada_texto' : 'Meta Calendarizada (texto)',
'captura_seguimiento_texto' : 'Meta Alcanzada (texto)',
'avance_periodo_texto' : '% Cumplimiento (texto)',
'avance_texto' : '% Av. Físico (texto)'})
#PyG
df_pyg = df_pyg.rename(columns = {'dye' : 'DyE',
'ponderacion' : 'Ponderación %',
'meta_modificada' : 'Meta Anual',
'meta_calendarizada' : 'Meta Calendarizada',
'captura_seguimiento' : 'Meta Alcanzada',
'avance_periodo' : '% Cumplimiento',
'avance_anual' : '% Av. Físico Anual',
'programa_presupuestario' : 'Programa Presupuestario',
'componete' : 'Componente',
'proceso' : 'Proceso',
'entregable' : 'Entregable',
'meta_calendarizada_texto' : 'Meta Calendarizada (texto)',
'captura_seguimiento_texto' : 'Meta Alcanzada (texto)',
'avance_periodo_texto' : '% Cumplimiento (texto)',
'avance_texto' : '% Av. Físico (texto)'})
#Exportamos data frames
df_mir['indicadores_considerados'] = df_mir['nivel_mir'] + "_" + df_mir['nombre_indicador']
def indicadores_considerados(x):
if x['indicadores_considerados'] in ["04.actividad_Porcentaje de Avance Financiero del Proceso/Proyecto",
"04.actividad_Porcentaje de Avance Físico del Proceso/Proyecto"]:
return 0
else:
return 1
df_mir['indicadores_considerados'] = df_mir.apply(indicadores_considerados, axis = 1)
#Exportamos
lista_dye = ['0201 Ofi. Gob.', '0202 CGCS', '0203 Ofi. Sec. Part.', '0209 IPLANEG', '0212 JEGAPE',
'0213 UTAPE', '0214 GTOMX', '0215 CGJ', '04 SG', '05 SDSH', '06 SFIA', '07 SSP', '08 SDAyR',
'10 SDES', '11 SEG', '12 SSG', '20 SICOM', '21 SECTUR', '27 STyRC', '3001 CODE', '3002 UTEG', '3004 DIF',
'3005 CECYTEG', '3007 UTNG', '3008 MIQ', '3009 CEAG', '3010 COFOCE', '3011 IEC', '3012 UTL', '3017 ITESI',
'3018 SABES', '3019 ISAPEG', '3021 ITSUR', '3022 CECAMED', '3024 UTSOE', '3025 JUVENTUDES GTO', '3026 PAOT',
'3027 CONALEP', '3029 IMUG', '3031 ISSEG', '3034 EPRR', '3035 INAEBA', '3036 UPGTO', '3037 FORUM', '3038 IECA',
'3039 UVEG', '3042 CECCEG', '3043 ITESG', '3044 ITESS', '3045 UPPE', '3046 UPJR', '3049 UPB',
'3050 UTSMA', '3052 UTS', '3054 INGUDIS', '3057 ITESA', '3058 ITSPR', '3059 UTLB',
'3061 SESEA', '3062 INFOSPE', '3063 PEPNNA', '3064 IDEA GTO', '3065 CEAIV', '3066 CCL','3067 UIEG', '3068 AGEG',
'32 SMAOT', '34 SMEI', 'FINALIZAR']
#Para el nombre del archivo
workbook_name = ['0201_Ofi. Gob.', '0202_CGCS', '0203_Ofi. Sec. Part.', '0209_IPLANEG', '0212_JEGAPE',
'0213_UTAPE', '0214_GTOMX', '0215_CGJ', '04_SG', '05_SDSH', '06_SFIA', '07_SSP', '08_SDAyR',
'10_SDES', '11_SEG', '12_SSG', '20_SICOM', '21_SECTUR', '27_STyRC', '3001_CODE', '3002_UTEG', '3004_DIF',
'3005_CECYTEG', '3007_UTNG', '3008_MIQ', '3009_CEAG', '3010_COFOCE', '3011_IEC', '3012_UTL', '3017_ITESI',
'3018_SABES', '3019_ISAPEG', '3021_ITSUR', '3022_CECAMED', '3024_UTSOE', '3025_JUVENTUDES GTO', '3026_PAOT',
'3027_CONALEP', '3029_IMUG', '3031_ISSEG', '3034_EPRR', '3035_INAEBA', '3036_UPGTO', '3037_FORUM', '3038_IECA',
'3039_UVEG', '3042_CECCEG', '3043_ITESG', '3044_ITESS', '3045_UPPE', '3046_UPJR', '3049_UPB',
'3050_UTSMA', '3052_UTS', '3054_INGUDIS', '3057_ITESA', '3058_ITSPR', '3059_UTLB',
'3061_SESEA', '3062_INFOSPE', '3063_PEPNNA', '3064_IDEA GTO', '3065_CEAIV', '3066_CCL','3067 UIEG', '3068 AGEG',
'32_SMAOT','34_SMEI', 'FINALIZAR']
series = np.arange(0, 69)
list_workbooks = []
for valor in series:
dye = lista_dye[valor]
name = workbook_name[valor]
# Create a Pandas Excel writer using XlsxWriter as the engine.
list_workbooks.append(f'MyE_{name}_Fichas_2024_T2.xlsx')
writer = pd.ExcelWriter(f'MyE_{name}_Fichas_2024_T2.xlsx', engine='xlsxwriter')
# Definir el relleno blanco
blanco = PatternFill(start_color="FFFFFF", end_color="FFFFFF", fill_type="solid")
# Aplicar relleno blanco a todas las celdas de la hoja de trabajo
for row in ws.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50): # Limitamos el rango para un mejor rendimiento
for cell in row:
cell.fill = blanco
mir = df_mir[(df_mir['list_name_wb'] == dye) & (df_mir['aplica'] == 'aplica') & (df_mir['indicadores_considerados'] == 1)]
mir = mir[['Programa Presupuestario', 'Objetivo', 'Indicador','Unidad de Medida del Indicador', 'Algoritmo',
'Sentido del Indicador', 'Acumulable', 'Frecuencia de Medición', 'Susceptible de reporte', 'Valor Línea Base', 'Meta Anual', 'Meta Alcanzada','% Av. Físico Anual',
'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul', 'Riesgo de Cumplimiento de la Meta Anual',
'Descripción de las acciones de mejora/Comentarios']]
mir.to_excel(writer, sheet_name = 'MIR', index = False)
bys = df_bys[(df_bys['list_name_wb'] == dye) & (df_bys['aplica'] == 'aplica')]
bys = bys[['DyE','Programa Presupuestario', 'Componente', 'Bien y Servicio', 'Meta Anual','Meta Calendarizada',
'Meta Alcanzada', '% Cumplimiento', '% Av. Físico Anual']]
bys.to_excel(writer, sheet_name = 'ByS', index = False)
pyg = df_pyg[(df_pyg['list_name_wb'] == dye) & (df_pyg['aplica'] == 'aplica')]
pyg = pyg[['DyE','Programa Presupuestario', 'Componente', 'Proceso', 'Entregable', 'Meta Anual',
'Meta Calendarizada', 'Meta Alcanzada', '% Cumplimiento', '% Av. Físico Anual']]
pyg.to_excel(writer, sheet_name = 'PyG', index = False)
# Close the Pandas Excel writer and output the Excel file.
writer.close()
#Nivel actividad
# Para el filtro de la tabla
lista_dye = ['3051 GPI','F002 FOFIES','F003 FOGIM', '3053 XONOTLI', 'FINALIZAR']
#Para el nombre del archivo
workbook_name = ['3051_GPI','F002_FOFIES','F003_FOGIM','3053_XONOTLI', 'FINALIZAR']
series = np.array([0, 1, 2, 3, 4])
list_workbooks = []
for valor in series:
dye = lista_dye[valor] # Es del tipo str.
print(dye)
name = workbook_name[valor]
print(name)
# Create a Pandas Excel writer using XlsxWriter as the engine.
list_workbooks.append('MyE_' + name + '_Fichas_2024_T2.xlsx')
writer = pd.ExcelWriter('MyE_' + name + '_Fichas_2024_T2.xlsx', engine='xlsxwriter')
mir = df_mir[(df_mir['list_name_wb'] == dye) & (df_mir['aplica'] == 'aplica')]
mir = mir[['DyE','Programa Presupuestario', 'Objetivo', 'Indicador','Unidad de Medida del Indicador', 'Algoritmo',
'Sentido del Indicador','Acumulable', 'Frecuencia de Medición', 'Susceptible de reporte','Valor Línea Base',
'Meta Anual', 'Meta Anual -', 'Meta Alcanzada (texto)', '% Av. Físico (texto)',
'Meta Alcanzada', '% Av. Físico Anual', 'aplica','clave_jerarquia']]
count_row_mir = mir.shape[0]
print(count_row_mir)
if count_row_mir != 0:
mir.to_excel(writer, sheet_name='MIR', index=False)
bys = df_bys[(df_bys['list_name_wb'] == dye) & (df_bys['aplica'] == 'aplica')]
bys = bys[['DyE', 'Programa Presupuestario', 'Componente', 'Bien y Servicio', 'Ponderación %', 'Meta Anual',
'Meta Calendarizada (texto)','Meta Alcanzada (texto)', '% Cumplimiento (texto)', '% Av. Físico (texto)',
'Meta Calendarizada', 'Meta Alcanzada', '% Cumplimiento', '% Av. Físico Anual','clave_jerarquia']]
count_row_bys = bys.shape[0]
print(count_row_bys)
if count_row_bys != 0:
bys.to_excel(writer, sheet_name='ByS', index=False)
ps = df_pyg[(df_pyg['list_name_wb'] == dye) & (df_pyg['pg'] == 'P') & (df_pyg['aplica'] == 'aplica')]
ps = ps[['DyE', 'Programa Presupuestario', 'Componente', 'Proceso', 'Entregable', 'Ponderación %', 'Meta Anual',
'Meta Calendarizada (texto)','Meta Alcanzada (texto)',
'% Cumplimiento (texto)', '% Av. Físico (texto)',
'Meta Calendarizada','Meta Alcanzada', '% Cumplimiento',
'% Av. Físico Anual','aplica','clave_jerarquia_p']]
count_row_ps = ps.shape[0]
print(count_row_ps)
if count_row_ps != 0:
ps.to_excel(writer, sheet_name='Ps', index=False)
gs = df_pyg[(df_pyg['list_name_wb'] == dye) & (df_pyg['pg'] == 'G') & (df_pyg['aplica'] == 'aplica')]
gs = gs[['DyE','Proceso', 'Entregable', 'Ponderación %', 'Meta Anual',
'Meta Calendarizada (texto)','Meta Alcanzada (texto)',
'% Cumplimiento (texto)', '% Av. Físico (texto)',
'Meta Calendarizada', 'Meta Alcanzada',
'% Cumplimiento', '% Av. Físico Anual', 'aplica','clave_jerarquia_g']]
count_row_gs = gs.shape[0]
print(count_row_gs)
if count_row_gs != 0:
gs.to_excel(writer, sheet_name='Gs', index=False)
# Close the Pandas Excel writer and output the Excel file.
writer.close()
lista_fichas = pd.DataFrame(list_workbooks, columns=['workbook_name'])
lista_fichas.to_excel("3. lista_fichas_generadas_actividad.xlsx", index=False)
# Listas proporcionadas
lista_dye = ['0201 Ofi. Gob.', '0202 CGCS', '0203 Ofi. Sec. Part.', '0209 IPLANEG', '0212 JEGAPE',
'0213 UTAPE', '0214 GTOMX', '0215 CGJ', '04 SG', '05 SDSH', '06 SFIA', '07 SSP', '08 SDAyR',
'10 SDES', '11 SEG', '12 SSG', '20 SICOM', '21 SECTUR', '27 STyRC', '3001 CODE', '3002 UTEG', '3004 DIF',
'3005 CECYTEG', '3007 UTNG', '3008 MIQ', '3009 CEAG', '3010 COFOCE', '3011 IEC', '3012 UTL', '3017 ITESI',
'3018 SABES', '3019 ISAPEG', '3021 ITSUR', '3022 CECAMED', '3024 UTSOE', '3025 JUVENTUDES GTO', '3026 PAOT',
'3027 CONALEP', '3029 IMUG', '3031 ISSEG', '3034 EPRR', '3035 INAEBA', '3036 UPGTO', '3037 FORUM', '3038 IECA',
'3039 UVEG', '3042 CECCEG', '3043 ITESG', '3044 ITESS', '3045 UPPE', '3046 UPJR', '3049 UPB',
'3050 UTSMA', '3052 UTS', '3054 INGUDIS', '3057 ITESA', '3058 ITSPR', '3059 UTLB',
'3061 SESEA', '3062 INFOSPE', '3063 PEPNNA', '3064 IDEA GTO', '3065 CEAIV', '3066 CCL','3067 UIEG', '3068 AGEG',
'32 SMAOT', '34 SMEI', 'FINALIZAR']
workbook_name = ['0201_Ofi. Gob.', '0202_CGCS', '0203_Ofi. Sec. Part.', '0209_IPLANEG', '0212_JEGAPE',
'0213_UTAPE', '0214_GTOMX', '0215_CGJ', '04_SG', '05_SDSH', '06_SFIA', '07_SSP', '08_SDAyR',
'10_SDES', '11_SEG', '12_SSG', '20_SICOM', '21_SECTUR', '27_STyRC', '3001_CODE', '3002_UTEG', '3004_DIF',
'3005_CECYTEG', '3007_UTNG', '3008_MIQ', '3009_CEAG', '3010_COFOCE', '3011_IEC', '3012_UTL', '3017_ITESI',
'3018_SABES', '3019_ISAPEG', '3021_ITSUR', '3022_CECAMED', '3024_UTSOE', '3025_JUVENTUDES GTO', '3026_PAOT',
'3027_CONALEP', '3029_IMUG', '3031_ISSEG', '3034_EPRR', '3035_INAEBA', '3036_UPGTO', '3037_FORUM', '3038_IECA',
'3039_UVEG', '3042_CECCEG', '3043_ITESG', '3044_ITESS', '3045_UPPE', '3046_UPJR', '3049_UPB',
'3050_UTSMA', '3052_UTS', '3054_INGUDIS', '3057_ITESA', '3058_ITSPR', '3059_UTLB',
'3061_SESEA', '3062_INFOSPE', '3063_PEPNNA', '3064_IDEA GTO', '3065_CEAIV', '3066_CCL','3067_UIEG', '3068_AGEG',
'32_SMAOT','34_SMEI', 'FINALIZAR']
series = np.arange(len(lista_dye))
list_workbooks = []
for valor in series:
dye = lista_dye[valor] # Es del tipo str.
print(dye)
name = workbook_name[valor]
print(name)
# Crear escritor de Excel
workbook_path = 'MyE_' + name + '_Fichas_2024_T2_anexo_actividad.xlsx'
list_workbooks.append(workbook_path)
writer = pd.ExcelWriter(workbook_path, engine='xlsxwriter')
mir = df_mir[(df_mir['list_name_wb'] == dye) & (df_mir['aplica'] == 'aplica') & (df_mir['indicadores_considerados'] == 0)]
mir = mir[['DyE', 'Programa Presupuestario', 'Objetivo', 'Indicador', 'Unidad de Medida del Indicador', 'Algoritmo',
'Sentido del Indicador', 'Acumulable', 'Frecuencia de Medición', 'Susceptible de reporte', 'Valor Línea Base',
'Meta Anual', 'Meta Anual -', 'Meta Alcanzada (texto)', '% Av. Físico (texto)',
'Meta Alcanzada', '% Av. Físico Anual', 'aplica', 'clave_jerarquia']]
count_row_mir = mir.shape[0]
print(count_row_mir)
# Condicional num de renglones.
if count_row_mir != 0:
# Agregar pestaña
mir.to_excel(writer, sheet_name='MIR', index=False)
# Cerrar y guardar el archivo
writer.close()
# Guardar lista de nombres de archivos generados
lista_fichas = pd.DataFrame(list_workbooks, columns=['workbook_name'])
lista_fichas.to_excel("4. lista_fichas_anexo_actividad.xlsx", index=False)
#Código 2:
#Platilla del formato de las fichas
import pandas as pd
import openpyxl
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
from openpyxl.worksheet.table import Table, TableStyleInfo
import os
os.chdir(r'C:\Users\USERDesktop\Prácticas\Plantilla')
# Ruta del archivo Excel nuevo
new_path = 'TemplateExcelFichasAvance.xlsx'
# Crear un nuevo libro de trabajo y una hoja de trabajo llamada 'MIR'
wb = openpyxl.Workbook()
ws = wb.active # Corrección aquí
ws.title = "MIR"
# Definir el relleno blanco
blanco = PatternFill(start_color="FFFFFF", end_color="FFFFFF", fill_type="solid")
# Aplicar relleno blanco a todas las celdas de la hoja de trabajo
for row in ws.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50): # Limitamos el rango para un mejor rendimiento
for cell in row:
cell.fill = blanco
# Guardar el archivo Excel con los cambios
wb.save(new_path)
# DataFrame para MIR con los encabezados de la tabla
MIR_headers = [
'Programa Presupuestario', 'Objetivo', 'Indicador', 'Unidad de Medida del Indicador', 'Algoritmo', 'Sentido del Indicador',
'Acumulable', 'Frecuencia de Medición', 'Susceptible de reporte', 'Valor Línea Base', 'Meta Anual', 'Meta Alcanzada', '% Av. Físico Anual',
'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul', 'Riesgo de Cumplimiento de la Meta Anual',
'Descripción de las acciones de mejora/Comentarios'
]
# Asegurarnos de que los encabezados sean cadenas
MIR_headers = [str(header) for header in MIR_headers]
MIR = pd.DataFrame(columns=MIR_headers)
# Guardar el DataFrame en el archivo Excel existente
with pd.ExcelWriter(new_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
MIR.to_excel(writer, startcol=1, startrow=4, sheet_name='MIR', index=False)
worksheet = writer.sheets['MIR']
# Cargar el archivo Excel nuevo con openpyxl
wb = openpyxl.load_workbook(new_path)
ws = wb['MIR']
# Agregar encabezado personalizado
ws.merge_cells('B2:Q2')
header = ws['B2']
header.value = '{{dye}}'
header.font = Font(bold=True, size=14)
header.alignment = Alignment(horizontal="center")
ws.merge_cells('B3:Q3')
sub_header = ws['B3']
sub_header.value = 'Periodo Enero - {{periodo}} {{ciclo}}'
sub_header.font = Font(bold=True, size=12)
sub_header.alignment = Alignment(horizontal="center")
# Crear y agregar la tabla
tab = Table(displayName="TablaMir", ref=f'B5:Q{5+len(MIR)}')
style = TableStyleInfo(
name="TableStyleMedium9", showFirstColumn=False, showLastColumn=False,
showRowStripes=True, showColumnStripes=True
)
tab.tableStyleInfo = style
ws.add_table(tab)
# Estilos de celdas
naranja = PatternFill(fgColor="ED7D31", fill_type="solid")
azul = PatternFill(fgColor="002060", fill_type="solid")
texto_blanco = Font(color="FFFFFF", bold=True)
borde_blanco = Border(
left=Side(style='thin', color='FFFFFF'), right=Side(style='thin', color='FFFFFF'),
top=Side(style='thin', color='FFFFFF'), bottom=Side(style='thin', color='FFFFFF')
)
# Aplicar estilos a los encabezados de la tabla
for cell in ws["5:5"]:
if cell.column_letter in ['O', 'P', 'Q']:
cell.fill = naranja
elif 'B' <= cell.column_letter <= 'Q': # Rango de la tabla
cell.fill = azul
else: # Fuera del rango de la tabla
cell.fill = blanco
cell.font = texto_blanco
cell.border = borde_blanco
cell.alignment = Alignment(horizontal="center", vertical="center")
# Guardar el archivo Excel con los cambios
wb.save(new_path)
#----------------------------ByS--------------------------------------
# Crear una nueva hoja de trabajo llamada 'ByS' y agregarle el formato
ws_bys = wb.create_sheet(title="ByS")
# Definir el relleno blanco para la nueva hoja
for row in ws_bys.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50):
for cell in row:
cell.fill = blanco
# Guardar el archivo Excel con los cambios
wb.save(new_path)
# DataFrame para ByS con los encabezados de la tabla
ByS_headers = [
'Programa Presupuestario', 'Componente', 'Bien y Servicio', 'Ponderación %', 'Meta Anual',
'Meta Calendarizada', 'Meta Alcanzada', '% Cumplimiento', '% Av. Físico Anual', 'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul',
'Riesgo de Cumplimiento de la Meta Anual', 'Descripción de las acciones de mejora/Comentarios'
]
# Asegurarnos de que los encabezados sean cadenas
ByS_headers = [str(header) for header in ByS_headers]
ByS = pd.DataFrame(columns=ByS_headers)
# Guardar el DataFrame en la hoja 'ByS'
with pd.ExcelWriter(new_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
ByS.to_excel(writer, startcol=1, startrow=4, sheet_name='ByS', index=False)
worksheet_bys = writer.sheets['ByS']
# Cargar el archivo Excel nuevo con openpyxl
wb = openpyxl.load_workbook(new_path)
# Cargar la hoja 'ByS'
ws_bys = wb['ByS']
# Agregar encabezado personalizado a 'ByS'
ws_bys.merge_cells('B2:M2')
header_bys = ws_bys['B2']
header_bys.value = '{{dye}}'
header_bys.font = Font(bold=True, size=14)
header_bys.alignment = Alignment(horizontal="center")
ws_bys.merge_cells('B3:M3')
sub_header_bys = ws_bys['B3']
sub_header_bys.value = 'Periodo Enero - {{periodo}} {{ciclo}}'
sub_header_bys.font = Font(bold=True, size=12)
sub_header_bys.alignment = Alignment(horizontal="center")
# Crear y agregar la tabla a 'ByS'
tab_bys = Table(displayName="TablaByS", ref=f'B5:M{5+len(ByS)}')
style_bys = TableStyleInfo(
name="TableStyleMedium9", showFirstColumn=False, showLastColumn=False,
showRowStripes=True, showColumnStripes=True
)
tab_bys.tableStyleInfo = style_bys
ws_bys.add_table(tab_bys)
# Aplicar estilos a los encabezados de la tabla en 'ByS'
for cell in ws_bys["5:5"]:
if cell.column_letter in ['K', 'L', 'M']:
cell.fill = naranja
elif 'B' <= cell.column_letter <= 'M': # Rango de la tabla
cell.fill = azul
else: # Fuera del rango de la tabla
cell.fill = blanco
cell.font = texto_blanco
cell.border = borde_blanco
cell.alignment = Alignment(horizontal="center", vertical="center")
# Guardar el archivo
wb.save(new_path)
#--------------------------Ps-----------------------
# Crear una nueva hoja de trabajo llamada 'Ps' y agregarle el formato
ws_Ps = wb.create_sheet(title="Ps")
# Definir el relleno blanco para la nueva hoja
for row in ws_Ps.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50):
for cell in row:
cell.fill = blanco
# Guardar el archivo Excel con los cambios
wb.save(new_path)
# DataFrame para Ps con los encabezados de la tabla
Ps_headers = [
'Programa Presupuestario', 'Componente', 'Proceso', 'Entregable', 'Ponderación %', 'Meta Anual', 'Meta Calendarizada',
'Meta Alcanzada', '%Av. Físico Anual', 'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul',
'Riesgo de Cumplimiento de la Meta Anual', 'Descripción de las acciones de mejora o Comentarios'
]
# Asegurarnos de que los encabezados sean cadenas
Ps_headers = [str(header) for header in Ps_headers]
Ps = pd.DataFrame(columns=Ps_headers)
# Guardar el DataFrame en la hoja 'Ps'
with pd.ExcelWriter(new_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
Ps.to_excel(writer, startcol=1, startrow=4, sheet_name='Ps', index=False)
worksheet_Ps = writer.sheets['Ps']
# Cargar el archivo Excel nuevo con openpyxl
wb = openpyxl.load_workbook(new_path)
# Cargar la hoja 'Ps'
ws_Ps = wb['Ps']
# Agregar encabezado personalizado a 'Ps'
ws_Ps.merge_cells('B2:N2')
header_Ps = ws_Ps['B2']
header_Ps.value = '{{dye}}'
header_Ps.font = Font(bold=True, size=14)
header_Ps.alignment = Alignment(horizontal="center")
ws_Ps.merge_cells('B3:N3')
sub_header_Ps = ws_Ps['B3']
sub_header_Ps.value = 'Periodo Enero - {{periodo}} {{ciclo}}'
sub_header_Ps.font = Font(bold=True, size=12)
sub_header_Ps.alignment = Alignment(horizontal="center")
# Crear y agregar la tabla a 'Ps'
tab_Ps = Table(displayName="TablaPs", ref=f'B5:N{5+len(Ps)}')
style_Ps = TableStyleInfo(
name="TableStyleMedium9", showFirstColumn=False, showLastColumn=False,
showRowStripes=True, showColumnStripes=True
)
tab_Ps.tableStyleInfo = style_Ps
ws_Ps.add_table(tab_Ps)
# Aplicar estilos a los encabezados de la tabla en 'Ps'
for cell in ws_Ps["5:5"]:
if cell.column_letter in ['K', 'L', 'M', 'N']:
cell.fill = naranja
elif 'B' <= cell.column_letter <= 'N': # Rango de la tabla
cell.fill = azul
else: # Fuera del rango de la tabla
cell.fill = blanco
cell.font = texto_blanco
cell.border = borde_blanco
cell.alignment = Alignment(horizontal="center", vertical="center")
#--------------------------Gs-----------------------
# Crear una nueva hoja de trabajo llamada 'Gs' y agregarle el formato
ws_Gs = wb.create_sheet(title="Gs")
# Definir el relleno blanco para la nueva hoja
for row in ws_Gs.iter_rows(min_row=1, max_row=1000, min_col=1, max_col=50):
for cell in row:
cell.fill = blanco
# Guardar el archivo Excel con los cambios
wb.save(new_path)
# DataFrame para Gs con los encabezados de la tabla
Gs_headers = [
'Proceso', 'Entregable', 'Ponderación %', 'Meta Anual', 'Meta Calendarizada', 'Meta Alcanzada', '% Av. Físico Anual',
'Av. Físico al periodo', 'Motivo de la desviación Desviación: Semaforización roja, amarilla y azul',
'Riesgo de Cumplimiento de la Meta Anual', 'Descripción de las acciones de mejora/Comentarios'
]
ws_Gs = wb['Gs']
# Agregar encabezado personalizado
ws_Gs.merge_cells('B2:L2')
header_Gs = ws_Gs['B2']
header_Gs.value = '{{dye}}'
header_Gs.font = Font(bold=True, size=14)
header_Gs.alignment = Alignment(horizontal="center")
ws_Gs.merge_cells('B3:L3')
sub_header_Gs = ws_Gs['B3']
sub_header_Gs.value = 'Periodo Enero - {{periodo}} {{ciclo}}'
sub_header_Gs.font = Font(bold=True, size=12)
sub_header_Gs.alignment = Alignment(horizontal="center")
# Crear y agregar la tabla
tab_Gs = Table(displayName="TablaGs", ref=f'B5:L{5+len(Gs)}')
style_Gs = TableStyleInfo(
name="TableStyleMedium9", showFirstColumn=False, showLastColumn=False,
showRowStripes=True, showColumnStripes=True
)
tab_Gs.tableStyleInfo = style_Gs
ws_Gs.add_table(tab_Gs)
# Aplicar estilos a los encabezados de la tabla
for cell in ws_Gs["5:5"]:
if cell.column_letter in ['J', 'K', 'L']:
cell.fill = naranja
elif 'B' <= cell.column_letter <= 'L': # Rango de la tabla
cell.fill = azul
else: # Fuera del rango de la tabla
cell.fill = blanco
cell.font = texto_blanco
cell.border = borde_blanco
cell.alignment = Alignment(horizontal="center", vertical="center")
# Guardar el archivo
wb.save(new_path)
# Confirmación final
print(f'El archivo se ha creado correctamente en la ruta: {new_path}')
Valora esta pregunta
0