我想创建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
完成,如果是这样,怎么做?
答案 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
内部变化,这可能会破裂。