注册 登录

清河洛

python使用openpyxl模块操作excel

qingheluo2020-03-04清河洛496
python中的openpyxl模块可以操作excel文件。使用pip安装pip install openpyxl支持流行的lxml库(如果已安装),这在创建大文件时特别有用。为了能够将图像(jpeg,png,bmp等)包含到文件中,需要安装'pillow'库:pip install pillow1、创建一个excel对象 import openpyxl wb=openpyxl.Workbook() #创建一个新的空白excel对象 wb=openpyxl.load_workbook(filename, read_only=False, keep_vba=False, data_only...

python中的openpyxl模块可以操作excel文件。

使用pip安装pip install openpyxl

支持流行的lxml库(如果已安装),这在创建大文件时特别有用。

为了能够将图像(jpeg,png,bmp等)包含到文件中,需要安装'pillow'库:pip install pillow

1、创建一个excel对象

import openpyxl
wb=openpyxl.Workbook() #创建一个新的空白excel对象
wb=openpyxl.load_workbook(filename, read_only=False, keep_vba=False, data_only=False, keep_links=True)
    打开一个已存在的文件
    keep_vba:是否保留VBA内容(不一定可以使用)
    data_only:读取单元格值时是否读取为公式计算后的结果,默认读取原公式
    keep_links:是否保留链接
该对象的信息属性
    data_only:是否是只读模式(只读属性)
    encoding:获取或设置编码
    properties:获取该excel文档属性对象,该对象的created属性表示创建时间,modified表示修改时间等

2、创建工作表

wb.create_sheet(title=None, index=None)
    title为新创建的工作表名称
    index为新的工作表插入的位置,默认插到末尾

wb.copy_worksheet(sheet_obj):复制一个sheet到末尾,名称为'name Copy'

3、获取工作表实例对象

获取打开的excel对象中所有的工作表(新的空白excel对象默认有一个名称为'Sheet'的工作表):
    wb.sheetnames:获取所有工作表的名称的数组
    wb.worksheets:返回该文档的所有sheet对象组成的数组
    for sheet in wb:
        print(sheet.title)

ws=wb.active #获取当前的活跃sheet对象
ws=wb[name] #工作表的name可以作为key进行索引来获取指定的sheet对象

4、工作表常用操作

获取工作表索引:wb.index(sheet_obj):索引值从0开始

移动工作表:wb.move_sheet(sheet_obj, offset=0):将一个sheet向右移动,为负数则向左移动

获取最大行:ws.max_row

获取最大列:ws.max_column

设置行高:ws.row_dimensions[rowx].height = height_num

设置列宽:ws.column_dimensions['C'].width = width_num

合并单元格

ws.merge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None)

    方法1:仅提供range_string参数:ws.merge_cells('A1:C3')
    方法2:省略range_string参数
        ws.merge_cells(start_row=2, start_column=3, end_row=5, end_column=6)
        由于省略了第一个参数,后面的参数要使用关键字
        所有参数值均为数字,行和列均从数字1开始

拆分单元格

ws.unmerge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None)

改变工作表按钮颜色:ws.sheet_properties.tabColor = '16进制颜色'

删除工作表

wb.remove(ws)
del wb[sheet_name]

冻结窗格:ws.freeze_panes = 'B2'

设置缩放比例:ws.views.sheetView[0].zoomScale = 70

显示/隐藏工作表:ws.sheet_state = 'hidden'

'visible':显示工作表
'hidden' :隐藏工作表,在右键取消隐藏菜单中可见
'veryHidden':深度隐藏,在右键取消隐藏菜单中不可见

添加一行到最底部

ws.append(['This is A1', 'This is B1', 'This is C1'])
    如果是list,将按顺序将所有元素添加至最后一行,每列一个元素的值
ws.append({'A' : 'This is A1', 'C' : 'This is C1'})
    如果是dict,按照相应的键添加相应的键值

5、单元格操作

要读取或修改单元格的值,需要先获取单元格Cell对象

获取Cell对象

ws['B3'] :通过excel中的表达方式,即列字母加行数字组成的字符串
ws.cell(rowx, colx, value=None):通过行和列的索引获取(从1开始),如果提供了value,则同时更改该单元格值

获取所有单元格对象
    ws.rows   :每行为一个元祖,然后组成列表
    ws.columns:每列为一个元祖,然后组成列表

获取指定范围所有单元格对象
    ws['A1':'C2'] 或 ws['A1:C2']
        每个元素为一行的所有单元格对象组成的元祖,每行为一个元素
    ws['C']         :获取C列(第三)列的所有单元格对象列表
    ws['C':'E'] 或 ws['C:E']:先行后列获取所有单元格对象,每行为一个元祖元素
    ws[10]          :获取第10行的所有单元格对象列表
    ws[5:10]        :获取第5行到第10行的所有单元格对象列表
    ws.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False)
        返回指定范围的所有单元格对象,返回格式中每行为一个元祖,然后由这些元祖组成列表,min_*不提供默认为1

根据列索引得到字母:openpyxl.utils.get_column_letter(num)

根据字母得到列索引:openpyxl.utils.column_index_from_string(str)

Cell对象常用的方法

只读属性

column、row:获取列和行的索引
is_date:是否是日期数据

读写属性

value:值
font:字体
aligment:对齐方式
border:边框
fill:填充
style:样式
number_format:数字格式

常用方法

ws.add_image(img,'B5'):插入图片

from openpyxl.drawing.image import Image
from PIL import JpegImagePlugin

img = Image(img_path)
img.width=130
img.height=100
ws.add_image(img,'B5')

cell通过读写属性设置单元格格式

创建颜色对象

color = openpyxl.styles.Color(rgb='16进制颜色',tint=0)

tint表示亮度,值为-1至1的浮点数

以下所有内容中参数color官方均推荐使用Color颜色对象赋值,但直接使用16进制颜色字符串仍可生效,但不保证后期是否会修改

设置字体

cell.font=openpyxl.styles.Font(name='Calibri',size=11, italic=False, color='000000', bold=False)

name        :字体名称,str('Calibri')
size=       :字体大小,int(11),单位为pt(点数)
color       :字体颜色,str('000000')或openpyxl.styles.Color实例对象
vertAlign   :垂直对齐,str(None),"subscript"下标,"superscript"上标,"baseline"基线对齐
underline   :下划线  ,str(None),"single"单下划线,"double"双,"singleAccounting"会计用单, "doubleAccounting"会计用双

以下是值为bool类型,默认为False的参数
italic(斜体)、bold(粗体)、underline(下划线)、strike(删除线)、outline(轮廓空心)、shadow(阴影)

设置对齐方式

cell.alignment=openpyxl.styles.Alignment(horizontal='水平对齐',vertical='垂直对齐',text_rotation=旋转角度,wrap_text=是否自动换行)

horizontal可能的值:左对齐left、居中center、右对齐right、分散对齐distributed、跨列居中centerContinuous、两端对齐justify、填充fill、常规general
vertical可能的值:居中center、还可以靠上top、靠下bottom、两端对齐justify、分散对齐distributed
wrap_text参数还可以写成wrapText

设置边框

首先创建边框样式Side对象

openpyxl.styles.Side(border_style,color)

border_style可选值:
    thin:细线
    double:双线
    medium:中等粗细
    thick:粗线
    
    dashed:短线
    dotted:点
    hair:极细的点
    dashDot:点和短线
    dashDotDot:点和两个短线

    mediumDashDot:中等粗细的点和短线
    mediumDashDotDot:中等粗细的点和两个短线
    mediumDashed:中等粗细的短线
    slantDashDot:斜向的点和短划

根据若干边框样式对象创建边框Border对象

openpyxl.styles.Border(left=None,right=None,top=None,bottom=None,diagonal=None,diagonal_direction=0)

top、bottom、left、right分别表示上下左右边框的样式
diagonal:对角线的样式
diagonal_direction:对角线的方向,0为不设置,1为左上到右下,2为左下到右上

最后将Border对象赋值给cell的border属性

cell.border=openpyxl.styles.Border(......)

单元格填充

cell.fill = openpyxl.styles.PatternFill(fill_type='solid',start_color=None)

数字格式

cell.number_format = 'format'

cell.number_format = '0.00%'  # 以两位小数百分数显示
cell.number_format = 'yyyy-mm-dd' :将数字改为日期并按照指定格式显示

命名样式

创建一个包含字体,填充,边框,对齐,数字格式的样式对象,通过style属性赋值

cell.style = openpyxl.styles.NamedStyle(name='Normal',font=None, fill=None, border=None, alignment=None, number_format=None)

name    :样式名称,在同一个作用域中,名称为唯一的,再次创建相同名称的实例对象会报错
font    :参考字体设置
fill    :参考单元格填充
border  :参考边框设置
alignment:参考对齐方式
number_format:str(None),设定数字格式

样式注册:wb.add_named_style(my_style)

将命名样式注册到工作簿中,注册后可以通过命名样式的name字符串设定样式

命名样式也将在首次分配给单元格时自动注册

my_style = openpyxl.styles.NamedStyle(name='mystyle',number_format='0.0%')

ws['D5'].style = 'mystyle'
    # 会报错,因为该名称的样式还没有注册

wb.add_named_style(my_style)
ws['D5'].style = 'mystyle'        # 设定成功

或者

ws['B2'].style=my_style
ws['D5'].style = 'mystyle'     # 在为B2单元格设置样式时会自动注册

由于NamedStyle类创建时各参数由默认值,所以如果先通过font、border等属性修改了单元格格式,后通过style设置了其他样式,那么之前设置的格式会恢复默认值

设置超链接

# 引入创建超链接实例的class
from openpyxl.worksheet.hyperlink import Hyperlink

# 创建超链接实例对象
link = Hyperlink(ref=None, location=None, tooltip=None, display='display', id='id', target=None)

    # 所有参数均为str字符串类型,其中ref为必须指定的参数
    # ref用于指定超链接应用的单元格引用或范围,如"D3","D3:E3"
    # location指定文档中的位置,如"sheet!A2","A2","A2:A5"
    # tooltip指定鼠标悬停时的提示文本
    # target指定外部文档会网址,如果同时指定了location,则完整的超链接地址为target#location
    # display按照字面理解应该是超链接显示文本,但实测无效
    # id功能未知

# 将单元格绑定超链接
ws['B2'].hyperlink=link

实测ref的指定单元格不生效,超链接会在绑定的单元格中生效,所以ref可以为任意字符串值

6、关闭或保存成文件

wb.close():关闭以只读模式打开的文件对象,其他模式打开的没有效果

wb.save('file_name.xlsx')



网址导航