(十一)自定义所有工作表的表名
# 导入openpyxl模块
import openpyxl
# 读取“录取表.xlsx”文件内容,
mybook = openpyxl.load_workbook("利润表.xlsx")
#循环工作簿(mybook)中的所有工作表(mybook.worksheets)
for mysheet in mybook.worksheets:
mysheet.title='2020年'+mysheet.title
mybook.save("结果表-利润表.xlsx")
mybook.worksheets表示工作簿(mybook)中的所有工作表
(十二)自定义工作表的表名背景颜色
# 导入openpyxl模块
import openpyxl
# 读取“录取表.xlsx”文件内容,
mybook = openpyxl.load_workbook("利润表.xlsx")
i=0
mylength=len(mybook.worksheets)
while i<mylength:
#若工作表表名是奇数,则设置表名标签是红色
if i%2==0:
mybook.worksheets[i].sheet_properties.tabColor='FF0000'
i+=1
mybook.save("结果表-利润表.xlsx")
sheet_properties.tabColor目前仅支持RRGGBB格式颜色的代码
'FF0000'表示红色,'00FF00'表示绿色,'0000FF'表示蓝色
每两个数字对应一个基准色调
(十三)设置修改工作表的保护密码
代码:
# 导入openpyxl模块
import openpyxl
# 读取“员工.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("员工表.xlsx")
mysheet=mybook.active
#mysheet.protection.sheet=True 该句代码可添加不需要密码的工作表保护
#设置修改工作表的保护密码
mysheet.protection.password='123456'
mybook.save("结果表-员工表.xlsx")
mysheet.protection.sheet=True
上面代码实现:在工作表修改内容时不需要输入密码,直接选择 “审阅/撤销工作表保护” 即可
以上代码为工作表设置密码,在修改工作表内容时,需要在菜单栏 “审阅” 中撤销工作表保护
(十四)在指定位置插入多个空白行
代码:
# 导入openpyxl模块
import openpyxl
# 读取“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
mysheet=mybook.active
#在收入表(mysheet)的第6行之前插入2个空白行
mysheet.insert_rows(6,2)
mybook.save("结果表-收入表.xlsx")
insert_rows() 方法的第一个参数是表示插入位置,第二个参数表示插入空白行的行数
结果:
(十五)在工作表的末尾添加新行
代码:
# 导入openpyxl模块
import openpyxl
# 读取“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
mysheet = mybook.active
mylist = [['2季度', 324166, 1356, 456], ['3季度', 123, 456, 7536], ['4季度', 123, 258, 369]]
# 循环列表(mylist)的行(myrow)数据
for myrow in mylist:
#根据行(myrow)数据在收入表(mysheet)的末尾添加新行
mysheet.append(myrow)
mybook.save("结果表-收入表.xlsx")
结果:
mysheet.append(myrow)
表示向收入表(mysheet)末尾添加一行数据(myrow), myrow 可以是包含多个成员的列表
(十六)在起始数据为空的工作表中添加数据
代码:
# 导入openpyxl模块
import openpyxl
# 读取“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
mysheet = mybook.active
# 在收入表(mysheet)末尾添加新行
mysheet.append({'C': '3季度', 'D': 123, 'E': 4654, 'F': 323})
mysheet.append({'C': '4季度', 'D': 798, 'E': 963, 'F': 654})
mybook.save("结果表-收入表.xlsx")
结果:
mysheet.append({'C': '3季度', 'D': 123, 'E': 4654, 'F': 323})#键名控制列号
表示在最后一行的 C 列写入‘3季度’,在 D 列写入‘123’,在E列写入‘4654’,早F列写入‘323’
由于采用字典的键名控制了列号,因此采用这种方法能在最后一行的部分单元格内写入数据
(十七)在起始为空的工作表中计算数据
代码:
# 导入openpyxl模块
import openpyxl
# 读取“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
mysheet = mybook.active
# 根据起始单元格和结束单元格设置数据范围的最小行列数和最大行列数
myminrow = mysheet.min_row + 4
mymincol = mysheet.min_column + 1
mymaxrow = mysheet.max_row
mymaxcol = mysheet.max_column
# 指定按列操作单元格的数据范围
myrange = mysheet.iter_cols(min_row=myminrow, min_col=mymincol, max_row=mymaxrow, max_col=mymaxcol)
myrowindex = myminrow + 4
mycolindex = mymincol - 1
mysheet.cell(myrowindex, mycolindex).value = '合计'
# 按列对单元格数据求和
for mycol in myrange:
mycolindex += 1
mycolsum = sum(mycell.value for mycell in mycol)
# 将合计数据写入单元格
mysheet.cell(myrowindex, mycolindex).value = mycolsum
mybook.save("结果表-收入表.xlsx")
结果:
min_row,min_colum,max_row,max_colum 方法
表示工作表中内容的最小行,最小列,最大行,最大列(这里的行号列号都是从1开始计数,站在人性化的角度上,但是个人编程的时候从0开始计数)
iter_cols() 方法
该方法需要指定矩形框选区域,表示对框选内容已经限制了优先对列进行操作,故后面的代码中可直接在该指定区域循环而不用管行的影响
针对起始为空的工作表,还是要针对表中数据的具体位置梳理出合适算法来编写代码
有一定的局限性
(十八)在工作表中移动指定范围的数据
# 导入openpyxl模块
import openpyxl
# 读取“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
mysheet = mybook.active
# 把收入表(mysheet)的B4:B8范围的数据向下移动0行,向右移动三列
mysheet.move_range('B4:B8', rows=0, cols=3)
mybook.save("结果表-收入表.xlsx")
move_range() 方法的第一个参数表示要移动的数据范围,rows参数表示要移动的行,若是负数表示向上移动,cols参数表示移动的列数,若是负数向左移动
(十九)将筛选结果添加新建的工作表
# 导入openpyxl模块
import openpyxl
# 读取“成绩.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("成绩表.xlsx")
mysheet = mybook['成绩表']
# 数据范围(myrange)从成绩表(mysheet)的第2行开始,到最后一行
myrange=mysheet[str(mysheet.min_row+1):str(mysheet.max_row)]
#新建工作表(差等生)
myfiltersheet=mybook.create_sheet('差等生')
#在差等生表中插入表头
myfiltersheet.append([mycell.value for mycell in mysheet[str(mysheet.min_row):str(mysheet.min_row)]]+['总分'])
for myrow in myrange:
#获取每位学生的各科成绩
mylist=[mycell.value for mycell in myrow]
#计算每位学生的成绩总分
myscore=sum(mylist[1:])
#若总分小于350,添加到差等生表
if myscore<350:
myfiltersheet.append(mylist+[myscore])
mybook.save("结果表-成绩表.xlsx")
mylist+[myscore] 表示合并拼接两个列表,若写成 mylist+myscore 则将报错,因此列表[myscore] 只有一个元素,但也必须写成列表形式
(二十)将汇总结果添加到新建的工作表
# 导入openpyxl模块
import openpyxl
# 读取“成绩.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("成绩表.xlsx")
mysheet = mybook['成绩表']
# 数据范围(myrange)从成绩表(mysheet)的第5行开始,到最后一行
myrange = mysheet[str(mysheet.min_row + 4):str(mysheet.max_row)]
# 新建工作表(汇总表)
myfiltersheet = mybook.create_sheet('汇总表')
# 在汇总表中插入表头
myfiltersheet.append(['姓名', '总分'])
for myrow in myrange:
# 在汇总中添加每个学生的姓名和总分
myfiltersheet.append([myrow[0].value, sum([mycell.value for mycell in myrow][1:])])
mybook.save("结果表-成绩表.xlsx")
myrange = mysheet[str(mysheet.min_row + 4):str(mysheet.max_row)]
表示以行方式设置成绩表的数据范围即从第5行到最后一行
myfiltersheet.append([myrow[0].value, sum([mycell.value for mycell in myrow][1:])])
表示在汇总表中添加每位学生的姓名和总分
append() 方法是以列表的形式添加到表末尾,每一个表格对应一个列表元素