学习Excel技术
在本系列的上一篇文章《Excel与Python学习专题04:空行插入程序》中,我们实现了自动在指定的行后插入指字数量的空行的Python程序。然而,需求总是千变万化的。在Excel中,经常会遇到间隔多少行插入指定数量的空行的情形。譬如,在制作工资条时,为了方便,需要间隔几行后插入1个空行。对于包括大量数据的工作表,如果手工进行这样的操作,将会枯燥乏味且浪费大量的时间。
如下图1所示的工作表。
图1
我们想要每隔2行插入3个空行,如下图2所示。
图2
下面是实现结果的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
#声明变量且指定间隔的行数和插入的空行数
intervalnum = 2 #间隔行
blanknums = 3 #空行
maxrow = ws.max_row #工作表数据最大行
maxcol = ws.max_column #工作表数据最大列
#清空工作表
for row in ws.iter_rows(min_row=1,max_col=maxcol,max_row=maxrow):
for cell in row:
cell.value=""
#工作簿必须关闭且要保存才有效
wb.save("mydata.xlsx")
#声明取字典键的变量
ikey = 1
#将数据写入到工作表相应的行中
for loopnum in range(0,maxrow//intervalnum+1):
for startendrow inrange((intervalnum+blanknums)*loopnum+1,(intervalnum+blanknums)*(loopnum+1)+1):
if startendrow
for col inrange(1, maxcol+1):
if ikey inmydatas.keys():
ws.cell(row=startendrow,column=col).value= mydatas[ikey][col-1]
ikey += 1
#保存工作簿
wb.save("mydata.xlsx")
代码的思路是,首先将工作表的数据存储在字典中,然后清除工作表的所有数据,接着通过计算得出数据行和空行在工作表中的位置,最后取出字典中的数据并将其写入工作表相应的位置。详细的代码作用请参见代码中给出的注释。
其中:
- 变量intervalnum指定间隔的行数,blanknums指定要插入的空行数。
- maxrow//intervalnum+1得到间隔行和空行的循环数,即要插入多少次空行,需要插入一次空行计为一轮,示例中要循环5次。maxrow为插入空行前工作表中含有数据的最大行号。
- (intervalnum+blanknums)*loopnum+1算出每轮的起始行,示例中分别为1、6、11、16、21;(intervalnum+blanknums)*(loopnum+1)+1算出每轮的结束行,示例中分别为6、11、16、21、26。
- startendrow < (intervalnum+blanknums)*loopnum+1+intervalnum判断每轮循环中要写入数据的行,其余行为空行。
- ikey in mydatas.keys()判断循环计数是否还处于字典的键中,以免最后1行漏掉而没有写入工作表。
下图为代码的图片版。