python操作Excel模块openpyxl

安装:pip install openpyxl  

  pip install openpyxl  -i https://pypi.douban.com/simple              豆瓣镜像

想要在文件中插入图片文件,需要安装pillow  :   pip3 install pillow  

      pip3 install pillow -i https://pypi.douban.com/simple              豆瓣镜像

【openpyxl只能操作xlsx文件而不能操作xls文件】

 

创建文件:

 

from openpyxl import Workbook

wb = Workbook()    #创建文件对象
#如果设置参数writw_only=True只写模式,可以提高速度,但是该参数使得刚创建的工作簿中不含任何工作表,如果没有这个参数会包含一个空的工作表
ws = wb.active #获取活动工作表
ws['A1'] = 42 #写入数值 ws['B1'] = "你好"+"automation test" #写入字符串 ws.append([1, 2, 3]) #写入多个单元格--[写在新的一行] ws.append([10, 20, 30]) ws['A4'] = 42 wb.save("d:\\sample.xlsx") #保存文件

 

工作表操作:

from openpyxl import Workbook

wb = Workbook()    
ws = wb.active     
ws['A1'] = 42      

ws1 = wb.create_sheet("Mysheet")           #创建一个工作表
# 参数:新工作表名称
ws2 = wb.create_sheet("Mysheet1", 0)      #创建一个工作表
#参数2:插入的位置序号;默认最后位置;  -1 倒数第二个
ws1.title = "物理"                    #修改工作表名字
ws2.title = u"化学"    #修改工作表名字;必须是Unicode
ws1.sheet_properties.tabColor = "FF0000"   #设定工作表的标签的背景颜色
ws=wb.worksheets[0] #获取指定工作表对象
#参数:工作表序号 ws3=wb[u"化学"] #
获取指定工作表对象---<Worksheet "化学"> #参数:工作表名称 ws3['A1'] = 420 ws3['B1'] = 520 print(ws3.title) #返回工作表名称 sheets=wb.sheetnames #获取所有工作表名称----['Sheet', '物理'] for sheet in sheets: print(sheet) for sheet in wb: #遍历文件的工作表 print(sheet.title) ws4 = wb.copy_worksheet(ws) #把ws工作表的内容复制到一张新工作表 #新工作表的名称为:Sheet Copy print(ws4.title) wb.save("d:\\sample.xlsx")

 

单元格操作:

 

from openpyxl import Workbook

wb = Workbook()    
ws = wb.active     
ws['A1'] = 42      #写入数值--如果使用writw_only=True只写模式,就不能使用这种模式
 d = ws.cell(row=4, column=2, value=10) #给指定行指定列赋值 
#
d 单元格对象---<Cell 'Sheet'.B4> #row=4 第4行---从1开始 #column=2 第2列---从1开始 #value=10 赋值10
#writw_only=True只写模式,不能使用cell方法

a=self.ws.cell(row=4, column=3) #返回指定行列的对象
#<Cell '合计'.C4>

b=a.value  #返回值


ws.cell(row=4, column=3, value="及格")
#赋的值也可以是字符串
aa=ws["C4"].value #返回单元格的数据

bb=d.value #返回单元格的数据

print(aa,bb) wb.save("d:\\sample.xlsx")

 

ws['a1'].font=Font(name='黑体',size=36,bold=True,italic=False,underline='none',strike=True,color='FF0000FF')  #单元格字体
#需要 from openpyxl.styles import Font
#参数2:字号
#bold  是否加粗;italic 是否斜体
#underline='none'  不加下划线
#strike  是否有删除线
#color  文本颜色
col.font = Font(bold=True)   #将A列设定为粗体
row.font = Font(underline="single")  #将第一行设定为下划线格式
#边框可以选择的值为:'hair', 'medium', 'dashDot', 'dotted', 'mediumDashDot', 'dashed', 'mediumDashed', 'mediumDashDotDot', 'dashDotDot', 'slantDashDot', 'double', 'thick', 'thin']
#diagonal 表示对角线
 

 

 

 

ws['a1'].alignment=Alignment(horizontal='center',vertical='bottom',text_rotation=30)    #文本对齐方式
#需要 from openpyxl.styles import Alignment
#horizontal  水平对齐方式
#vertical   垂直对齐方式
#text_rotation  文本旋转角度

 

ws['a1'].fill=GradientFill(type='linear',stop=('FF0000','0000FF'))  #使用渐变色填充单元格
#需要 from openpyxl.styles import GradientFill
#stop=('FF0000','0000FF')   起始颜色  结束颜色

 

ws['a1'].fill=GradientFill(type='linear',stop=('FF0000','FF0000'))  #使用固定颜色填充单元格背景
#需要 from openpyxl.styles import GradientFill

 

ws['a1'].border=Border(left=Side(style='medium',color='FF000000'),right=Side(style='double',color='00FF0000'),top=Side(style='thick',color='0000FF00'),bottom=Side(style='thin',color='FF00FF00'))   #设置单元格边框
#需要 from openpyxl.styles import Border,Side

 

ws['a1'].comment=Comment(text='注释内容',author='李明')  #给单元格设置注释
#需要  from openpyxl.comments import Comment
#参数2:作者
ws['a1'].comment.width=units.points_to_pixels(50)  #设置注释的宽度
ws['a1'].comment.height=units.points_to_pixels(20)  #设置注释的高度--没有变化???
#需要  from openpyxl.utils import units

 

ws.merge_cells('A2:d4')  #合并单元格--方式一
ws.merge_cells(start_row=6,start_column=1,end_row=8,end_column=3)  #合并单元格--方式二

 

ws.unmerge_cells('A2:D4')  #拆分单元格
#A2是合并后的单元格
ws.unmerge_cells(start_row=2,start_column=1,end_row=4,end_column=4)   #拆分单元格

  

 

行和列操作:

from openpyxl import Workbook

wb = Workbook()
ws1 = wb.active
ws1["A1"]=1
ws1["A2"]=2
ws1["A3"]=3

ws1["B1"]=4
ws1["B2"]=5
ws1["B3"]=6

ws1["C1"]=7
ws1["C2"]=8
ws1["C3"]=9

cell=ws1["A"]  #返回指定列元组
#(<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>, <Cell 'Sheet'.A3>)---元组
for c in cell:
    print(c.value)
cells=ws1["A:C"]  #返回多列元组--返回A列到C列的元组---闭区间
#((<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>, <Cell 'Sheet'.A3>), (<Cell 'Sheet'.B1>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.B3>), (<Cell 'Sheet'.C1>, <Cell 'Sheet'.C2>, <Cell 'Sheet'.C3>))
#返回值:元组;每一列又是一个元组

row=ws1[2]  #返回指定行元组
#(<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>)
for r in row:
    print(r.value)
rows=ws1[1:3]  #返回1到3行的元组
#((<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>), (<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>), (<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>))
#返回值:元组;每一行又是一个元组

rows=ws1.rows  #获取所有行对象
# <generator object Worksheet._cells_by_row at 0x000000000333A048>

cells=ws1.columns  #获取所有列对象
#<generator object Worksheet._cells_by_col at 0x000000000333A8C8>

wb.save("d:\\sample.xlsx")

 

ws.append(range(10))  #在最后追加一行
ws.append([10,20,30])  #在最后追加一行

 

ws.insert_cols(2)  #在第二列位置插入一个空白列
ws.insert_cols(2,3)  #在第二列位置开始插入3个空白列

 

#ws.insert_rows(2)  #在第二行位置插入一个空白行
ws.insert_rows(2,3)  #在第二行位置开始插入3个空白行

 

#ws.column_dimensions.group('B', 'D', hidden=True)   #隐藏b到d列范围内的列
ws.column_dimensions.group('B', 'D', hidden=False)   #不隐藏b到d列范围内的列

 

 

from openpyxl import Workbook

wb = Workbook()
ws1 = wb.active
ws1["A1"]=1
ws1["A2"]=2
ws1["A3"]=3

ws1["B1"]=4
ws1["B2"]=5
ws1["B3"]=6

ws1["C1"]=7
ws1["C2"]=8
ws1["C3"]=9

rs=ws1.rows  #获取所有行对象
i=0
rsl=[]
for row in rs:
    i=i+1  #计算行数
    rsl.append(row)  #获取所有行列表
    #[(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>), (<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>), (<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>)]
    #每一行是一个元组
r=rsl[0]  #获取第一行
a=rsl[0][0]  #获取第一行第一列的单元格对象
i=rsl[0][0].value  #获取第一行第一列的单元格的值
r=rsl[-1]  #获取最后行

cs=ws1.columns  #获取所有列对象
csl=[]
for cell in cs:
    csl.append(cell)  #获取所有列列表
i=len(csl)   #列数
c=csl[0]  #获取第一列
a=csl[0][0]  #获取第一列第一行的单元格对象
a=csl[0][0].value  #获取第一列第一行的单元格数据
c=csl[-1]   #获取最后一列

print(i)
wb.save("d:\\sample.xlsx")

 

打开已经存在的文件: 

from openpyxl import Workbook
from openpyxl import load_workbook

wb = load_workbook('d:\\sample.xlsx')  #读入文件
#需要
from openpyxl import load_workbook
#没有data_only=True 参数,遇到公式时读出的公式。有data_only=True 参数,读出的是公式计算后的值
ws=wb.active
aa=ws["A1"].value
i=ws.max_row  #返回总行数
ii=ws.max_column  #返回总列数
print(aa,i,ii)
wb.save("d:\\sample.xlsx")

 

公式: 

 

如上图:D1单元格用了公式

from openpyxl import Workbook
from openpyxl import load_workbook

wb = load_workbook('d:\\sample.xlsx')  #读入文件
ws=wb.active
aa=ws["D1"].value
print(aa,type(aa))

D1单元格返回的数据和类型是:=SUM(A1:C1) <class 'str'>   

返回的是公式还是公式计算后的值,就得看带不带data_only=True 参数

 

 

 

from openpyxl import Workbook
from openpyxl import load_workbook

wb = load_workbook('d:\\sample.xlsx')  #读入文件
ws=wb.active
ws["A1"] = "=SUM(1, 1)"  #使用公式
wb.save("d:\\sample.xlsx")

 

单元格类型:

ty=ws["A1"].number_format  #返回单元格类型
如果是常规[数值、公式、字符串],返回General
如果是百分数,返回0.00%

 

图片操作:

需要先安装Pilow

需要  from openpyxl.drawing.image import Image   

img = Image('d:\\ss\\1.jpg')  #读入图片
img.height //=5  #高缩小为五分之一
img.width //=5   #宽缩小为五分之一
ws.add_image(img, 'g1')  #g1单元格插入图片

 

画饼状图、柱状图: 

参看:https://mp.weixin.qq.com/s?__biz=MzI4MzM2MDgyMQ==&mid=2247489973&idx=1&sn=3fe8d47bcca692d2ed1169a78b736328&chksm=eb8ab2efdcfd3bf9ed9565ad67fb22f77fbae07fedb3f059198db496f4d680ca4bd9d2278024&mpshare=1&scene=23&srcid=&sharer_sharetime=1570840653205&sharer_shareid=78c54fec67a24249a0fb14669883329e#rd

 

资料:https://www.cnblogs.com/zeke-python-road/p/8986318.html    

posted @ 2019-10-09 12:27  天子骄龙  阅读(1340)  评论(0编辑  收藏  举报