Leggi l’unione di celle in Excel con Python

Sto cercando di leggere l’unione di celle di Excel con Python utilizzando xlrd.

Mio Excel: (si noti che la prima colonna è la fusione tra le tre righe)

    A   B   C
  +---+---+----+
1 | 2 | 0 | 30 |
  +   +---+----+
2 |   | 1 | 20 |
  +   +---+----+
3 |   | 5 | 52 |
  +---+---+----+

Vorrei leggere la terza riga della prima colonna, pari a 2 in questo esempio, ma restituisce ''. Avete idea di come arrivare al valore della cella unita?

Il mio codice:

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

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             
        row += "{0} ".format(value)
        split_row = row.split()   
    all_data.append(split_row)

Quello che ho fatto io:

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

Quello che vorrei ottenere:

'2', '0', '30'
'2', '1', '20'
'2', '5', '52'
  • Si può fare la domanda riproducibile? Ci piacerebbe vedere i dati grezzi e il codice da utilizzare per l’importazione.
  • Ho aggiunto il mio codice.
  • Se si fa un print all_data dopo il ciclo for, che cosa si ottiene? E voi cosa aspettate?
  • Ciao! Ho aggiunto i risultati di troppo.
InformationsquelleAutor Antoine | 2015-06-09

 

5 Replies
  1. 12

    Ho appena provato e sembra funzionare per il vostro campione di dati:

    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)

    ritorno

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

    Tiene traccia dei valori della riga precedente e li usa, se il corrispondente valore della riga corrente è vuoto.

    Di notare che il codice di cui sopra non consente di verificare se una determinata cella è in realtà parte di una unione di un insieme di celle, in modo che si possa replicare i valori precedenti, nei casi in cui la cella in realtà dovrebbe essere vuoto. Ancora, potrebbe essere di qualche aiuto.

    Ulteriori informazioni:

    In seguito ho trovato una pagina di documentazione che parla di un merged_cells attributo che si può utilizzare per determinare le celle che sono inclusi nei vari intervalli di celle unite. La documentazione dice che è “di Nuovo nella versione 0.6.1”, ma quando ho provato ad usarlo con xlrd-0.9.3 installato da pip ho ottenuto l’errore

    NotImplementedError: formatting_info=True non ancora implementato

    Io non sono particolarmente inclini a iniziare a caccia giù diverse versioni di xlrd per verificare il merged_cells funzione, ma forse potresti essere interessato a farlo se il codice di cui sopra è sufficiente per le vostre esigenze e si verifica lo stesso errore che ho fatto con formatting_info=True.

    • Grazie mille!!!
    • Ulteriori informazioni in questo mailing list thread. formatting_info non è supportato per .file xlsx, purtroppo.
    • formatting_info non necessari per xlsx come posso vedere.
  2. 1

    Per coloro che sono alla ricerca per la gestione di cella unita, il modo in cui l’OP ha chiesto, mentre non sovrascrivendo non unite le celle vuote.

    Basato su OP del codice e le informazioni supplementari forniti da @gordthompson risposte e @stavinsky commento, Il codice seguente funziona per i file di excel (xls, xlsx), si potrà leggere file excel primo foglio come un dataframe. Per ogni cella unita, si potrà replicare che la cella unita contenuto in tutte le cellule di questa cella unita rappresentano, come chiesto da poster originale.Nota che merged_cell funzione di xlrd per ” xls ” file funziona solo se ‘formatting_info’ il parametro è passato durante l’apertura della cartella di lavoro.

    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
  3. 0

    Stavo cercando le soluzioni precedenti senza avere existo, tuttavia il seguente lavorato per me:

    sheet = book.sheet_by_index(0)
    all_data = []
    
    for row_index in range(sheet.nrows):
        row = []
        for col_index in range(sheet.ncols):
            valor = sheet.cell(row_index,col_index).value
            if valor == '':
                for crange in sheet.merged_cells:
                    rlo, rhi, clo, chi = crange
                    if rlo <= row_index and row_index < rhi and clo <= col_index and col_index < chi:
                        valor = sheet.cell(rlo, clo).value
                        break
            row.append(valor)
        all_data.append(row)
    
    print(all_data)

    Spero di servire a qualcuno in futuro

  4. -1
    openpyxl.worksheet.merged_cell_ranges

    Questa funzione è possibile ottenere un array come ['A1:M1', 'B22:B27'], che dicono le celle da unire.

    openpyxl.worksheet.merged_cells

    Questa funzione indica se una cella è stata fusa o non

Lascia un commento