excel操作-openpyxl

import  openpyxl  # 可以对xlsx进行读取、修改,无法对xls操作
# nwb=openpyxl.Workbook() # Workbook对象
# nwb.save('11-2-1.xlsx') # 保存文档,默认创建工作表sheet

# wb=openpyxl.load_workbook('11-2-1.xlsx') # 读取工作簿
# print(wb)
# wb.save('11-2-1_new.xlsx')
from openpyxl import Workbook
# 批量新建工作簿
for num in range(1,13):
    nwb=Workbook()
    wbname='1-12月/{:02}.xlsx'.format(num)
    nwb.save(wbname)
import openpyxl
# wb=openpyxl.load_workbook('11-3-1.xlsx')
# wb.create_sheet() # 在工作表的最后新建工作表
# wb.create_sheet('7月') # 在工作表的最后新建有名字的工作表
# wb.create_sheet('3月',2) # 在指定位置新建带名字的工作表,这里的2是第三个工作表的之前,新建的工作表变成第三个工作表
# wb.save('11-3-1-1.xlsx')

# nwb=openpyxl.Workbook()
# nwb.create_sheet()
# nwb.create_sheet('工资表')
# nwb.create_sheet('汇总表',0)
# nwb.save('11-3-1-2.xls')


wb=openpyxl.load_workbook('11-3-2.xlsx')
# print(wb.worksheets) # 返回的是列表,类型加表名
# print([ws for ws in wb])
# print(wb.sheetnames) # 返回工作表的名字,为列表

print(wb.active) # 读取活动工作表,正在使用的工作表
print(wb.worksheets[1]) # 读取指定工作表的名字
print(wb['1月'])
import openpyxl
# wb=openpyxl.load_workbook('11-4.xlsx') #读取工作簿
# wb.copy_worksheet(wb['1月']) # 复制工作表,这里是复制名称为1月的工作表,默认名称1月copy
# nws=wb.copy_worksheet(wb['2月']);nws.title='2月份' # 复制工作表,赋值为2月份
# wb.copy_worksheet(wb['3月']).title='3月份'# 复制工作表,赋值为3月份
# wb.save('11-4-1.xlsx')



# wb=openpyxl.load_workbook('11-4.xlsx')
# # wb.move_sheet(wb['1月'],2) # 移动名称为1月的工作表,向右移动2个工作表的位置
# wb.move_sheet(wb['4月'],-1) # 移动名称为4月的工作表,向左移动1个工作表的位置
# wb.save('11-4-2.xlsx')


wb=openpyxl.load_workbook('11-4.xlsx')
wb.remove(wb['1月']) # 工作表的删除
wb.save('11-4-3.xlsx')
import openpyxl
# nwb=openpyxl.Workbook()
# for name in ['张三','李四','王二','麻子']: # 批量创建工作表
#     nwb.create_sheet(name)
# nwb.remove(nwb['Sheet']) # 因为默认有一个sheet,所以移除它
# nwb.save('案例1/11-5-1.xlsx')

# wb=openpyxl.load_workbook('案例2/11-5-2.xlsx')
# for year in range(2020,2024):
#     wsname='{}年'.format(year)
#     wb.copy_worksheet(wb['业绩表']).title=wsname # 复制工作表后修改名称
# wb.remove(wb['业绩表']) # 移除工作表
# wb.save('案例2/11-5-2-1.xlsx')

# 同一个工作簿里面的不同工作表分别存放到不同工作簿里面
wb=openpyxl.load_workbook('案例3/11-5-3.xlsx')
for name in wb.sheetnames:
     wb=openpyxl.load_workbook('案例3/11-5-3.xlsx')
     for ws in wb.worksheets:
        if ws.title!=name:
            wb.remove(ws) # 如果名称不一样则删除,最后只剩下与工作簿名称一致的工作表
     wb.save('案例3/'+name+'.xlsx')
# 行列
import openpyxl
wb=openpyxl.load_workbook('11-6.xlsx') # 工作簿对象
ws=wb.worksheets[0] # 索引获取第一个工作表
# print(ws['a1'],ws['a1'].value) #  获取a1单元格内存对象,Cell对象,ws['a1'].value)为A1单元格的值
# print(ws.cell(1,1),ws.cell(1,1).value) # 获取A1单元格对象,ws.cell(1,1).value单元格A1的值


ws=wb['成绩表']
# ws=wb.active
# 行号从1开始
print(ws[1]) # 第一行内容对象Cell
print(ws[1:2]) # 第一到第二行
print(ws['1:2'])# 第一到第二行
print(ws['1':'2'])# 第一到第二行

#
print(ws['a:a']) # 第一列,单列
print(ws['a:b']) # 第一第二列,多列
print(ws['a':'b'])# 第一第二列,多列
print(ws['a1:b2']) # 多行多列
print(ws['a1':'b2'])# 多行多列
import openpyxl
wb=openpyxl.load_workbook('11-7.xlsx')
ws=wb.active
print(ws.min_row) # 使用区域的最小行
print(ws.max_row) # 使用区域的最大行
print(ws['b4'].row) # 指定单元格的行号
print(list(ws.values)) # 获取已使用的所有数据,按行返回,因为表第一、二行为空格,所以是None

print(list(ws.rows)) # 按行获取单元格对象,获取的信息比上面values更多
print(list(ws.columns)) #
print(list(ws.iter_rows(min_row=4,min_col=2,values_only=True))) # 获取指定范围内的值 min_row=4从第四行开始,min_col=2从第二列开始,values_only=True 获取值,false为对象
print(list(ws.iter_cols(min_row=4,min_col=2,values_only=True))) # 获取指定范围内的值 按列获取
import openpyxl
wb=openpyxl.load_workbook('11-8.xlsx') # 读取工作簿
ws=wb.active # 活动表
ws['a4']='小明' # 写入A4单元格内容
ws['b4']=100 # 写入B4单元格内容
ws['c4']=89 # 写入C4单元格内容
ws.cell(5,1,'小松') # 5行1列写入小松
ws.cell(5,2,97)# 5行2列写入
ws.cell(5,3,96) # 5行3列写入,只能一个个单元格写入
# 范围内,批量写入
ws.append(['张三',88,99])  # 列表方式写入
ws.append(('李四',88,99)) # 元祖方式写入
ws.append(range(1,4)) # 数字方式写入,1到3
ws.append({'b':'小花','a':69,'c':96}) # 字典方式写入
ws.append({3:'小曾',2:100,1:100}) # 字典方式写入,顺序可以变换
# 保存
wb.save('11-8-1.xlsx')
# 99乘法表
import openpyxl
wb=openpyxl.Workbook();ws=wb.active
for x in range(1,10):
    for y in range(1,x+1):
        val='{}×{}={}'.format(y,x,x*y)
        ws.cell(x,y,val)
wb.save('11-9.xlsx')
import openpyxl
wb=openpyxl.load_workbook('11-10.xlsx')
# ws=wb['成绩表']
ws=wb.active # 读取活动工作表

# 从第二行第二列开始读取,最大的行自行识别,max_col=ws.max_column-1最大的列为倒数第二列
score=ws.iter_rows(min_row=2,min_col=2,max_col=ws.max_column-1)
for row in score: #
    total=sum([v.value for v in row])
    # 三种方法写入总分
    # ws['E'+str(row[1].row)]=total
    # ws.cell(row[1].row,5,total)
    row[-1].offset(0,1).value=total # row[-1]向右偏移一位
wb.save('11-10-1.xlsx')
# 多工作表里面的数据合并
import openpyxl
wb=openpyxl.load_workbook('11-11.xlsx')
nwb=openpyxl.Workbook()
# 活动工作表,第一行增加内容
nwb.active.append(['月份','姓名','手机','笔记本','电脑'])
for ws in wb.worksheets:# ws为列表,工作表的名称
    for row in list(ws.values)[1:]: # 每个工作表的内容
        nwb.active.append((ws.title,)+row) # ws.title为工作表的民初
nwb.active.title='合并结果' # 修改工作表名称
nwb.save('11-11-1.xlsx') # 保存工作簿

# 插入、删除操作学习
import openpyxl
# 插入
wb=openpyxl.load_workbook('11-13-1.xlsx');ws=wb.active
ws.insert_rows(2,3) # 插入行,第2行上方插入三行
ws.insert_cols(3,1) # 插入列,第3列前插入1列
#删除
ws.delete_rows(10,3) # 删除行,第10行开始往后删除3行
ws.delete_cols(5,1) # 删除列,第5列开始往后删除一列,即删除第六列
wb.save('11-13-1-1.xlsx')
#移动
wb=openpyxl.load_workbook('11-13-2.xlsx');ws=wb.active
ws.move_range('g8:j10',-5,3,False) # 区域范围g8:j10,向上移动5,向右移动3
ws.move_range('g15:j16',4,-5,True) # 区域范围'g15:j16,向下移动4,向左移动5
wb.save('11-13-2-1.xlsx')
# 条件筛选
import openpyxl
wb=openpyxl.load_workbook('11-14-1.xlsx',data_only=True) #读取数据不读取公式,excel里面公式不读取
ws=wb.worksheets[0]
for cell in ws['f'][1:]: # 读取F列,去掉表头
    if cell.value<270: # 总分少于270的删除行
        ws.delete_rows(cell.row)
wb.save('11-14-1-1.xlsx')


wb=openpyxl.load_workbook('11-14-2.xlsx',data_only=True)
ws=wb['工资表']
for cell in ws['b'][2:]:# 读取B列,去掉第一、二行剩下的数据
    ws.insert_rows(cell.row) # 有内容的下方插入一行
    for col_num in range(1,7):
        tit=ws.cell(1,col_num).value # 获取第一行的信息
        ws.cell(cell.row-1,col_num,tit) # 赋值到插入行
wb.save('11-14-2-1.xlsx')

原文地址:https://www.cnblogs.com/cheng662540/p/15477082.html