2013-02-15 234 views
7

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

回答

1

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

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

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

最优雅的事情,恕我直言,将延长Worksheetdelete_rows方法的子类。我会通过改变其Cell的坐标来实现这种方法。但是如果openpyxl内部变化,这可能会中断。

+0

将单元格值设置为“'或”无“不会将其删除,更不用说整行。 – Cerin 2015-07-21 18:58:49

+2

但调用'garbage_collect'将删除尾随的空行。 – 2015-08-02 19:02:35