如何删除excel电子表格中满足某些条件的行?

时间:2013-02-15 23:18:38

标签: python openpyxl

我想创建Excel(xlsx)电子表格的“简化”版本(即根据某些标准删除某些行),我想知道是否可以使用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完成,如果是这样,怎么做?

2 个答案:

答案 0 :(得分:7)

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'是要删除的行数。

还可以删除列,但我还没有尝试过。

答案 1 :(得分:3)

内部openpyxl似乎没有“行”的概念,它适用于单元格并跟踪维度,如果使用Worksheet.rows,它会从中计算出二维单元格数组。您可以改变数组,但它不会更改工作表。

如果要在工作表中执行此操作,则需要将值从旧位置复制到新位置,并将不再需要的单元格值设置为''或{{1并致电Worksheet.garbage_collect()

如果您的数据集很小且性质统一(例如所有字符串),您可能最好将相关单元格(内容)复制到新工作表,删除旧工作表并将新标题设置为标题刚删除的那个。

最优雅的事情,IMHO,将扩展None或使用Worksheet方法的子类。我会通过改变其delete_rows的坐标来实现这样的方法。但如果Cell内部变化,这可能会破裂。