2013-02-15 166 views
7

我想創建一個Excel(xlsx)電子表格的「簡化」版本(即通過根據某些標準刪除一些行),並且我想知道這是否可以用openpyxl完成。如何用openpyxl刪除行?

在(pythonish)僞代碼,我想做的事情會看起來像:

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') 

能像這樣用openpyxl來完成,如果是這樣,怎麼樣?

回答

1

內部openpyxl似乎沒有「行」的概念,它與單元格一起工作並跟蹤維度,如果您使用Worksheet.rows,它會從中計算出二維單元格數組。您可以改變數組,但不會更改工作表。

如果要在Worksheet中執行此操作,需要將舊位置的值複製到新位置,並將不再需要的單元格的值設置爲''None並呼叫Worksheet.garbage_collect()

如果您的數據集很小且性質統一(例如所有字符串),您最好將相關單元格(內容)複製到新工作表中,刪除舊單元格並將新單元格的標題設置爲剛刪除的標題。

最優雅的事情,恕我直言,將延長Worksheetdelete_rows方法的子類。我會通過改變其Cell的座標來實現這種方法。但是如果openpyxl內部變化,這可能會中斷。

+0

將單元格值設置爲「'或」無「不會將其刪除,更不用說整行。 – Cerin 2015-07-21 18:58:49

+2

但調用'garbage_collect'將刪除尾隨的空行。 – 2015-08-02 19:02:35