学习Excel技术,关注微信公众号:
excelperfect
在Excel工作表中,我们通常使用功能区中“开始”选项卡“单元格”组中的“插入”命令来插入行或列。然而,每次我们只能插入一行或一列。如果需要插入多行或多列,则需要一点技巧。例如,如果要连续插入3行,那么可以先选择3行或者同一列中的连续3个单元格,然后再使用“插入——插入工作表行”命令,如下图1所示。
图1
下面,我们想要。这可以使用VBA来实现,也可以使用Python实现。本文介绍使用Python实现的代码。
如下图2所示的工作表。
图2
假设想要在第3行后,插入连续的2个空行,结果应该如下图3所示。
图3
下面是实现结果的Python代码:
import openpyxl, os
#改变当前文件夹
os.chdir('E:\\完美Excel')
#装载要处理的工作簿
wb = openpyxl.load_workbook('mydata.xlsx')
#获取要处理的工作表
ws = wb['Sheet1']
#用来存储数据的字典
mydatas = {}
#声明行计数变量且使用其作为字典键
rowkey = 1
#遍历工作表行并将数据存储在字典中
for row inws.iter_rows(min_row=1,max_col=ws.max_column,max_row=ws.max_row):
mydatas.setdefault(rowkey,[])
for cell in row:
mydatas[rowkey].append(cell.value)
rowkey += 1
#声明变量且指定开始插入空行的行号及插入的空行数
startnum = 3
blanknums = 2
#清空工作表中要插入空行行号后面的内容
for row inws.iter_rows(min_row=startnum+1,max_col=ws.max_column,max_row=ws.max_row):
for cell in row:
cell.value=""
#工作簿必须关闭且要保存才有效
wb.save("mydata.xlsx")
#将要插入空行的行号后的数据写入到工作表相应的行中
for rownum in range(startnum+blanknums+1,rowkey+blanknums):#取行号
for colnum inrange(1,ws.max_column+1):#取列号
#写入数据
ws.cell(row=rownum,column=colnum).value =mydatas[rownum-blanknums][colnum-1]
#保存工作簿
wb.save("mydata.xlsx")
代码的思路是,首先将工作表的数据存储在字典中,然后清除工作表中要在其之后插入空行的行之后的所有数据,最后取出字典中的数据并将其写入工作表中插入空行之后的行中。详细的代码作用请参见代码中给出的注释。
还记得我们的目的吗?我们想要在工作表的第N行后自动插入连续M个空行。如果进行适当的设置,也可以直接在命令行中直接输入N和M的值,这样不必像上面的代码那样硬编码,而是由用户指定想要在那行后插入多少个空行。
修改后的代码如下:
图4
注意到,第1行是#! Python3,告诉计算机让Python来执行这个程序。代码中,使用sys.argv代替了原代码中的硬编码数字。这样,用户就可以在命令行中指定要插入的行的位置和行数。例如,如果用户要求在工作表的第2行之后插入连续的5个空行,可在命令行中使用下面的命令:
blankRowInserter.py 2 5
如下图5所示。
图5
运行后的结果如下图6所示。
图6