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

kjo*_*kjo 12 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')
Run Code Online (Sandbox Code Playgroud)

可以这样做openpyxl,如果是这样,怎么样?

jhu*_*ghs 9

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)
Run Code Online (Sandbox Code Playgroud)

其中:'ws'是工作表,'index'是行号,'1'是要删除的行数.

还有删除列的功能,但我没有尝试过.

  • 请注意,delete_rows()实际上将下面的行向上移动。这意味着删除一行后,它下面的所有其他行都有不同的行号。因此,遍历所有行时请记住这一点。 (2认同)

Ant*_*hon 3

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

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

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

恕我直言,最优雅的做法是使用方法Worksheet来扩展或子类delete_rows。我将通过改变其 s 的坐标来实现这样的方法Cell。但如果openpyxl内部发生变化,这可能会被打破。

  • 但是调用“garbage_collect”将删除尾随的空行。 (3认同)