Python使用openpyxl/pandas在每个现有行之后插入空行



我试图阅读和编辑多个工作表的excel文件,但我需要从该文件编辑只有一个表保持其他表完整。我意识到我应该使用openpyxl,因为它可以编辑文件而不会丢失其他内容,所以我从下面开始:

xfile = openpyxl.load_workbook('file.xlsm',  read_only = False, keep_vba = True)
sheet = xfile['Main']

虽然这是有效的,但我也需要有一个方法/函数,为所有现有的行从索引二开始添加三个空行。这就是我意识到openpyxl可能不是这种情况的完美解决方案的地方,因为使用openpyxl编写许多行并不高效。我能想到的一个简单的解决方案肯定不会像预期的那样工作:

for x in range (2, sheet.max_row):
sheet.insert_rows(x,amount=5)
xfile.save('text3.xlsm')

我很想在这种情况下使用pandas,但是pandas在导出数据时会丢失其他工作表,这对我来说不起作用。非常感谢任何建议/指导。为了便于理解,我提供了一个虚拟数据来展示我试图执行的内容:

原始文件:

Product Quantity
0  ignore   ignore
1  ignore   ignore
2   Apple    3
3   Orange   5
4   Banana   5

预期输出:

Product Quantity
0  ignore   ignore
1  ignore   ignore
2   Apple    3
4    Nan      Nan
5    Nan      Nan
6    Nan      Nan
7   Orange   5
8   Nan      Nan
9   Nan      Nan
10  Nan      Nan
11   Banana   5
12    Nan      Nan
13    Nan      Nan
14    Nan      Nan

非常感谢您阅读这篇问题陈述。

您可以在openpyxl中这样做,而在Python世界中,这可能是您唯一的选择。但是当添加/删除行和列时,您需要记住,而不是在循环时更改某些内容。因此,如果您从第3行开始插入5行,您的计数器随后将出错。

最简单的方法是从底部插入行,因为这意味着您不必担心行号改变。但这也是效率最低的,因为每次添加新行时,新行中的单元格也必须重新编号。

如果您只对数据感兴趣,那么最好的方法是直接使用数据的副本,删除工作表中的行,然后从副本中添加数据。

data = []
for row in ws.values:
data.append(row)
data.append([[]]*5)
title = ws.title
del wb[title] # or manually delete the relevant rows
ws = wb.create_sheet(title, x) # x is the index of the worksheet in the workbook
ws.append(["Product", "Quantity"]
for row in data:
ws.append(row)

要对工作表执行此操作,您需要创建一个计数器,该计数器与创建行数相匹配。假设你有10行,那么在第一次插入之后,你将有15行,然后是20行,等等== x + 5x

for i in range(2, ws.max_row * 5, 5): # you will be stepping 5 rows at a time
ws.insert_rows(i, 5)

这是未经测试的,所以可能需要一些调整。我建议您编写一个简单的虚拟文件来对其进行微调。

最新更新