2013-02-15 40 views
7

Vorrei creare una versione "ridotta" di un foglio di calcolo Excel (xlsx) (ovvero rimuovendo alcune righe in base ad alcuni criteri) e vorrei sapere se è possibile farlo con openpyxl.Come eliminare le righe con openpyxl?

In (pythonish) pseudo-codice, quello che voglio fare sarebbe un aspetto simile:

wb = openpyxl.reader.excel.load_workbook('/path/to/workbook.xlsx') 
sh = wb.get_sheet_by_name('someworksheet') 

# weed out the rows of sh according to somecriterion 
sh.rows[:] = [r for r in sh.rows if somecriterion(r)] 

# save the workbook, with the weeded-out sheet 
wb.save('/path/to/workbook_reduced.xlsx') 

Può qualcosa come questo essere fatto con openpyxl, e se sì, come?

risposta

1

Internamente openpyxl non sembra avere un concetto di "righe" funziona con le celle e tiene traccia delle dimensioni e se si utilizza Worksheet.rows calcola un array 2D di celle da quello. È possibile modificare la matrice, ma non modifica il foglio di lavoro.

Se si vuole fare questo all'interno del foglio di lavoro, è necessario copiare i valori dalla vecchia posizione nella nuova posizione, e impostare il valore delle cellule che non sono più necessari per '' o None e chiamare Worksheet.garbage_collect().

Se il set di dati è di piccole dimensioni e di natura uniforme (tutte le stringhe, ad esempio), è meglio copiare la cella pertinente (contenuto) in un nuovo foglio di lavoro, rimuovere quello vecchio e impostare il titolo di quello nuovo sul titolo di quello appena cancellato.

La cosa più elegante da fare, IMHO, sarebbe estendere Worksheet o una sottoclasse con un metodo delete_rows. Implementerei tale metodo modificando le coordinate dei suoi Cell s in posizione. Ma questo potrebbe rompersi se gli interni di openpyxl cambiano.

+0

L'impostazione dei valori di cella su "" o su Nessuno non li elimina, tanto meno l'intera riga. – Cerin

+2

Ma chiamando 'garbage_collect' rimuoverà le righe vuote finali. –

Problemi correlati