学习Excel技术

在本系列的上一篇文章《Excel与Python学习专题04:空行插入程序》中,我们实现了自动在指定的行后插入指字数量的空行的Python程序。然而,需求总是千变万化的。在Excel中,经常会遇到间隔多少行插入指定数量的空行的情形。譬如,在制作工资条时,为了方便,需要间隔几行后插入1个空行。对于包括大量数据的工作表,如果手工进行这样的操作,将会枯燥乏味且浪费大量的时间。

如下图1所示的工作表。

ipython中怎么加行 怎么在python中添加空行_字典写入excel

图1 

我们想要每隔2行插入3个空行,如下图2所示。

ipython中怎么加行 怎么在python中添加空行_数据_02

图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行漏掉而没有写入工作表。

下图为代码的图片版。

ipython中怎么加行 怎么在python中添加空行_字典写入excel_03