17

我想创建一个 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,如果可以,怎么做?

4

2 回答 2

15

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

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

于 2018-03-19T18:41:39.943 回答
3

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

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

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

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

于 2013-03-19T07:29:59.440 回答