添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 通过新建一个 Workbook() 对象,即可新建一个工作簿
  • 通过 wb.save("create_workbook.xlsx") 保存为文件
  • 文件其实就是工作簿,一个工作簿可以有多个工作表,但最少得有一个工作表
  • 默认创建新的工作簿时,会自动创建一个名为Sheet的工作表
  • from openpyxl import Workbook
    wb = Workbook()
    wb.save("create_workbook.xlsx")
    

    这样就会生成一个xlsx文件,工作表的名称默认为Sheet

    新建工作表

  • 通过wb.create_sheet(title)新建工作表
  • from openpyxl import Workbook
    wb = Workbook()
    wb.create_sheet("Sheet1")
    wb.create_sheet("Sheet2")
    wb.create_sheet("Sheet3")
    wb.create_sheet("Sheet4")
    wb.save("create_workbook.xlsx")
    

    默认创建给定名称的工作表,创建出来工作表的顺序都是插入到最后面的

    因为工作簿是新创建的,所以默认带有一个Sheet的工作表

    插入工作表

  • 通过wb.create_sheet(title,index)插入工作表
  • 其实就是创建工作表,只是创建时,通过指定index,来指定插入的位置
  • PS:起始按照第0位,第1位,第2位,...,倒数为倒数第0位,倒数第1位,倒数第2位,...,这样去对照下表理解

    index 插入的位置 wb.create_sheet("MySheet0", 0) wb.create_sheet("MySheet1", 1) wb.create_sheet("MySheet2", 2) wb.create_sheet("MySheet3", 3) wb.create_sheet("MySheet-1", -1) wb.create_sheet("MySheet-2", -2) wb.create_sheet("MySheet-3", -3) wb.create_sheet("MySheet-last", None) wb.save("create_workbook.xlsx")

    打开已存在的工作簿

  • 通过load_workbook()打开已存在的xlsx或xlsm文件
  • from openpyxl import load_workbook
    from openpyxl.workbook import Workbook
    filename = "insert_workbook.xlsx"
    wb: Workbook = load_workbook(filename)
    sheet_names = wb.sheetnames
    for name in sheet_names:
        print(f"name:{name}")
    

    获取所有的工作表名称

  • 通过wb.sheetnames获取所有的工作表名称
  • from openpyxl import load_workbook
    from openpyxl.workbook import Workbook
    filename = "insert_workbook.xlsx"
    wb: Workbook = load_workbook(filename)
    sheet_names = wb.sheetnames
    for name in sheet_names:
        print(f"name:{name}")
    

    选中工作表

    要操作一个工作表,首先要选中它,有以下几种方式选中工作表

    wb.active

  • 通过wb.active选中工作表
  • 通过ws.title获取工作表的名称
  • from openpyxl import load_workbook
    from openpyxl.workbook import Workbook
    from openpyxl.worksheet.worksheet import Worksheet
    filename = "insert_workbook.xlsx"
    wb: Workbook = load_workbook(filename)
    ws: Worksheet = wb.active
    print(f"类型是:{ws}")
    print(f"title:{ws.title}")
    

    wb[sheetname]

  • 通过wb[工作表名称]获取工作表
  • 通过ws.title获取工作表的名称
  • 遍历工作簿获取工作表

    可以通过遍历工作簿的方式,获取工作表

    from openpyxl import load_workbook
    from openpyxl.workbook import Workbook
    from openpyxl.worksheet.worksheet import Worksheet
    filename = "insert_workbook.xlsx"
    wb: Workbook = load_workbook(filename)
    for sheet in wb:
        ws: Worksheet = sheet
        # print(f"类型是:{ws}")
        print(f"title:{ws.title}")
    

    修改工作表

    选中工作表后,就可以修改工作表的各种属性了

    通过ws.title="xxx"修改工作表名称

    from openpyxl import load_workbook
    from openpyxl.workbook import Workbook
    from openpyxl.worksheet.worksheet import Worksheet
    filename = "insert_workbook.xlsx"
    wb: Workbook = load_workbook(filename)
    ws: Worksheet = wb["MySheet0"]
    print(f"原来的名称:{ws.title}")
    ws.title = "UpdateSheet"
    print(f"修改后的名称:{ws.title}")
    wb.save("update.xlsx")
    

    修改名称背景

    通过ws.sheet_properties.tabColor = "xxxx"修改工作表名称背景颜色

  • xxxx使用RRGGBB颜色,可以来这里复制张贴HTML颜色代码表 (rapidtables.org)
  • from openpyxl import load_workbook
    from openpyxl.workbook import Workbook
    from openpyxl.worksheet.worksheet import Worksheet
    filename = "insert_workbook.xlsx"
    wb: Workbook = load_workbook(filename)
    ws: Worksheet = wb["MySheet0"]
    ws.sheet_properties.tabColor = "F08080"
    wb.save("update.xlsx")
    

    访问单个单元格

    可以通过以下几种方式访问单个单元格

    通过键的方式

    通过ws['键名']的方式访问,获取到的对象类型是Cell

    通过Cell.value获取到真正的值

    from openpyxl import load_workbook
    from openpyxl.cell import Cell
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    v: Cell = ws['A1']
    print(v.value)
    v: Cell = ws['A100']
    print(v.value)
    v: Cell = ws['AA1']
    print(v.value)
    v: Cell = ws['AB1000']
    print(v.value)
    

    通过.cell方法

    通过ws.cell(row,column)的方式访问,获取到的对象类型是Cell

    row和column都是大于0的整数,即最小是(1,1)

    通过Cell.value获取到真正的值

    from openpyxl import load_workbook
    from openpyxl.cell import Cell
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    v: Cell = ws.cell(1, 1)
    print(v.value)
    v: Cell = ws.cell(14, 27)
    print(v.value)
    v: Cell = ws.cell(100, 28)
    print(v.value)
    

    访问大量单元格

    可以通过以下几种方式访问大量单元格

    访问某一列

  • 通过ws["列名"]访问某一列
  • 列名可以是A,B,C,AA,AB,...
  • 返回是元祖,元祖内是Cell对象
  • 通过Cell.value获取到真正的值
  • from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws['A']
    for cell in a:
        print(cell.value)
    

    访问某几列

  • 通过ws["列名:列名"]的形式可以访问多列,返回是以列组成的元祖,元素类型还是Cell
  • 通过Cell.value获取到真正的值
  • 传递的列名可以是字母,可以是数字
  • 列名是字母的示例

    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws['A:B']
    for cell in a:
        print(cell)
    a = ws['A:AB']
    for cell in a:
        print(cell)
    

    列名是数字的示例

    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws['1:2']
    for cell in a:
        print(cell)
    a = ws['1:28']
    for cell in a:
        print(cell)
    

    访问多行多列

  • 通过ws.iter_rows 的形式可以访问多行多列,返回的是Cell迭代器
  • 返回的数据按行排序,即顺序是A1,B1,C1.....A2,B2,C2,...,A3,B3,C3
  • 通过Cell.value获取到真正的值
  • 示例:访问1-10行,A-AB列

    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws.iter_rows(min_row=1, max_row=10, min_col=1, max_col=28)
    for one in a:
        print(one)
    

    访问多列多行

    和访问多行多列一样,只是排序方式为列优先

    通过ws.iter_cols的形式可以访问多行多列,返回的是Cell迭代器

    返回的数据按行排序,即顺序是A1,A2,A3,....,B1,B2,B3,...,C1,C2,C3,...

    通过Cell.value获取到真正的值

    示例:访问1-10行,A-AB列

    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws.iter_cols(min_row=1, max_row=10, min_col=1, max_col=28)
    for one in a:
        print(one)
    

    访问某一行

  • 在访问多行多列的方式中,把行固定,就是访问某一行
  • 示例:访问第2行

    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws.iter_rows(min_row=2, max_row=2, min_col=1, max_col=28)
    for one in a:
        print(one)
    

    访问所有的数据

    通过ws.rows遍历所有的数据

    遍历出来的数据以行优先排列,即A1,B1,C1.....A2,B2,C2,...,A3,B3,C3

    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws.rows
    for one in a:
        print(one)
    

    仅访问工作表的值

    访问单个单元格和大量单元格,返回的都是Cell对象,Cell对象就是单元格,可以通过Cell对象,获取单元格的属性,例如:颜色,背景,边框等。

    如果只想访问单元格的值,而不关心单元格的其他属性,则可以这样获取

  • 通过ws.values获取所有的值
  • from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws.values
    for one in a:
        print(one)
    
  • 通过访问多行多列或访问多列多行时,传递参数values_only=True即可
  • from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws.iter_rows(min_row=1, max_row=10, min_col=1, max_col=28,values_only=True)
    for one in a:
        print(one)
    
    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    a = ws.iter_cols(min_row=1, max_row=10, min_col=1, max_col=28,values_only=True)
    for one in a:
        print(one)
    

    选中单元格cell后,可以修改它的数据

    通过cell.value="xxx"修改单元格的值

    通过ws.cell(row, cloumn, value)修改单元格的值

    from openpyxl import load_workbook
    from openpyxl.cell import Cell
    from openpyxl.worksheet.worksheet import Worksheet
    wb = load_workbook("src.xlsx")
    ws: Worksheet = wb['Sheet']
    cell: Cell = ws['A1']
    print(f'A1原始的值{cell.value}')
    cell.value = 100
    print(f'A1修改后的值{cell.value}')
    print(f"C2原始的值:{ws.cell(2, 3).value}")
    ws.cell(2, 3, 200)
    print(f"C2修改后的值:{ws.cell(2, 3).value}")
    wb.save("update.xlsx")
    

    保存到文件

  • 通过wb.save()保存Workbook对象到文件
  • from openpyxl import Workbook
    wb = Workbook()
    wb.save("create_workbook.xlsx")
    
    from openpyxl import load_workbook
    wb = load_workbook("src.xlsx")
    wb.save("update.xlsx")
    
  • 指定属性 template=True 将工作表保存为模板
  • from openpyxl import load_workbook
    from openpyxl.workbook import Workbook
    wb: Workbook = load_workbook("src.xlsx")
    wb.template = True
    wb.save("template.xltm")
    
  • 指定属性 template=False将模板文件保存为普通文件
  • from openpyxl import load_workbook
    from openpyxl.workbook import Workbook
    wb: Workbook = load_workbook("template.xltm")
    wb.template = False
    wb.save("new.xlsx")
    

    需要保存为后缀名相同的文件

    打开xlsm需要传递参数keep_vba=True

    模板文件后缀名应该为xltm

    添加一行数据

  • 通过ws.append()添加一行数据
  • 添加的数据在所有数据的最后面
  • 可以理解为就是列表添加数据
  • from openpyxl import load_workbook
    from openpyxl.workbook import Workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb: Workbook = load_workbook("src.xlsx")
    ws: Worksheet = wb.active
    for i in range(5):
        ws.append(range(10))
    wb.save("a.xlsx")
    

    数字转换为字母

    把数字转成字母,例如1就是A列,2就是B列,C就是C列,26就是Z列

    from openpyxl.utils import get_column_letter
    print(f"1对应的列是{get_column_letter(1)}")
    print(f"25对应的列是{get_column_letter(25)}")
    print(f"26对应的列是{get_column_letter(26)}")
    print(f"30对应的列是{get_column_letter(30)}")
    print(f"42对应的列是{get_column_letter(42)}")
    

    通过ws.insert_rows(index, amount)插入空行

    index表示插入的位置

    amount表示插入的行数

    示例:插入到第3行,插入2行空行

    from openpyxl import Workbook
    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb: Workbook = load_workbook("src.xlsx")
    ws: Worksheet = wb.active
    for one in ws.values:
        print(one)
    ws.insert_rows(3, 2)
    for one in ws.values:
        print(one)
    

    通过ws.insert_cols(index, amount)插入空列

    index表示插入的位置

    amount表示插入的列数

    示例:插入到第三列,插入2列空列

    from openpyxl import Workbook
    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb: Workbook = load_workbook("src.xlsx")
    ws: Worksheet = wb.active
    for one in ws.values:
        print(one)
    ws.insert_cols(3, 2)
    for one in ws.values:
        print(one)
    wb.save("a.xlsx")
    

    删除行和删除列

  • 通过ws.delete_rows(index,amount)删除行
  • 通过ws.delete_cols(index,amount)删除列
  • index表示要删除的行或列位置
  • amount表示要删除的行数或列数
  • from openpyxl import Workbook
    from openpyxl import load_workbook
    from openpyxl.worksheet.worksheet import Worksheet
    wb: Workbook = load_workbook("src.xlsx")
    ws: Worksheet = wb.active
    for one in ws.values:
        print(one)
    ws.delete_rows(2,2)
    ws.delete_cols(2,2)
    wb.save("a.xlsx")
    

    教程 — openpyxl 3.0.7 文档 (openpyxl-chinese-docs.readthedocs.io)