Saltar al contenido

Leer celdas combinadas en Excel con Python

Poseemos la mejor información que hallamos on line. Nosotros deseamos que te sea de mucha utilidad y si quieres aportar alguna mejora hazlo con libertad.

Solución:

Acabo de probar esto y parece funcionar para sus datos de muestra:

all_data = []
excel = xlrd.open_workbook(excel_dir+ excel_file)
sheet_0 = excel.sheet_by_index(0) # Open the first tab

prev_row = [None for i in range(sheet_0.ncols)]
for row_index in range(sheet_0.nrows):
    row= []
    for col_index in range(sheet_0.ncols):
        value = sheet_0.cell(rowx=row_index,colx=col_index).value
        if len(value) == 0:
            value = prev_row[col_index]
        row.append(value)
    prev_row = row
    all_data.append(row)

regresando

[['2', '0', '30'], ['2', '1', '20'], ['2', '5', '52']]

Realiza un seguimiento de los valores de la fila anterior y los usa si el valor correspondiente de la fila actual está vacío.

Tenga en cuenta que el código anterior no verifica si una celda determinada es realmente parte de un conjunto combinado de celdas, por lo que posiblemente podría duplicar valores anteriores en los casos en que la celda realmente debería estar vacía. Aún así, podría ser de alguna ayuda.

Información Adicional:

Posteriormente encontré una página de documentación que habla de un merged_cells attribute que se puede usar para determinar las celdas que se incluyen en varios rangos de celdas combinadas. La documentación dice que es “Nuevo en la versión 0.6.1”, pero cuando traté de usarlo con xlrd-0.9.3 instalado por pip tengo el error

NotImplementedError: formatting_info=Verdadero aún no implementado

No estoy particularmente inclinado a comenzar a buscar diferentes versiones de xlrd para probar el merged_cells característica, pero tal vez le interese hacerlo si el código anterior es insuficiente para sus necesidades y encuentra el mismo error que tuve con formatting_info=True.

También puede intentar usar el método fillna disponible en pandas https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html

df = pd.read_excel(dir+filename,header=1)
df[ColName] = df[ColName].fillna(method='ffill')

Esto debería reemplazar el valor de la celda con el valor anterior

Para aquellos que buscan manejar celdas combinadas, la forma en que OP lo ha pedido, sin sobrescribir celdas vacías no combinadas.

Según el código de OP y la información adicional proporcionada por las respuestas de @gordthompson y el comentario de @stavinsky, el siguiente código funcionará para archivos de Excel (xls, xlsx), leerá la primera hoja del archivo de Excel como un marco de datos. Para cada celda combinada, replicará el contenido de la celda combinada en todas las celdas que representa esta celda combinada, como lo solicitó el póster original. Tenga en cuenta que la función merged_cell de xlrd para el archivo ‘xls’ solo funcionará si se pasa el parámetro ‘formatting_info’ al abrir libro de trabajo.

import pandas as pd
filepath = excel_dir+ excel_file
if excel_file.endswith('xlsx'):
    excel = pd.ExcelFile(xlrd.open_workbook(filepath), engine='xlrd')
elif excel_file.endswith('xls'):
    excel = pd.ExcelFile(xlrd.open_workbook(filepath, formatting_info=True), engine='xlrd')
else:
    print("don't yet know how to handle other excel file formats")
sheet_0 = excel.sheet_by_index(0) # Open the first tab
df = xls.parse(0, header=None) #read the first tab as a datframe

for e in sheet_0.merged_cells:
    rl,rh,cl,ch = e
    print e
    base_value = sheet1.cell_value(rl, cl)
    print base_value
    df.iloc[rl:rh,cl:ch] = base_value

Si te ha resultado de provecho nuestro artículo, agradeceríamos que lo compartas con más desarrolladores de esta manera contrubuyes a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *