如何删除满足某些条件的Excel电子表格中的行?
我想制作一个“简化版”的Excel表格(也就是根据某些标准删除一些行),我想知道这是否可以用openpyxl
来实现。
用(类似Python的)伪代码来说,我想做的事情大概是这样的:
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
来实现吗?如果可以的话,应该怎么做呢?
2 个回答
在内部,openpyxl
似乎并没有“行”的概念,它主要是处理单元格,并跟踪这些单元格的尺寸。如果你使用 Worksheet.rows
,它会根据这些单元格计算出一个二维数组。你可以修改这个数组,但这并不会改变工作表本身。
如果你想在工作表内进行这样的操作,你需要把旧位置的值复制到新位置,并把那些不再需要的单元格的值设置为 ''
或 None
,然后调用 Worksheet.garbage_collect()
。
如果你的数据集比较小,而且类型一致(比如都是字符串),你可以考虑把相关的单元格内容复制到一个新的工作表,删除旧的工作表,并把新工作表的标题设置为刚删除的那个工作表的标题。
在我看来,最优雅的做法是扩展 Worksheet
或者创建一个子类,增加一个 delete_rows
方法。我会通过直接改变其 Cell
的坐标来实现这个方法。不过,如果 openpyxl
的内部结构发生变化,这个方法可能会失效。
2018年的更新:今天我在找怎么删除一行的时候,发现openpyxl 2.5.0-b2版本里增加了这个功能。我试了一下,效果很好。
这是我找到答案的链接: https://bitbucket.org/openpyxl/openpyxl/issues/964/delete_rows-does-not-work-on-deleting
下面是删除一行的语法:
ws.delete_rows(index, 1)
这里的意思是:
'ws' 是工作表,
'index' 是你要删除的行号,
'1' 是要删除的行数。
另外,还有删除列的功能,不过我还没试过。