• Python之第十二章 处理Excel电子表格


    一、Excel文档

    工作薄: .xlsx文件、包含多个表(工作表)。

    活动表:用户当前查看的表、关闭Excel前最后查看的表。

    二、安装openpyxl模块

    import openpyxl

    三、读取Excel表格

    先制作一张例表1.xlsx

     1、用openpyxl模块打开Excel文档

    openpyxl模块提供了openpyxl.load_workbook()函数,用来打开Excel文档。

     openpyxl.load_workbook()函数打开Excel文档会返回一个workbook数据类型的值。

    workbook对象代表这个Excel文件,相当于File对象代表一个打开的文本文件。

    要记住, example.xlsx 需要在当前工作目录,你才能处理它。可以导入 os ,使
    用函数 os.getcwd() 弄清楚当前工作目录是什么,并使用 os.chdir() 改变当前工作目录。

    2、用工作薄中取得工作表

    调用 get_sheet_names() 方法可以取得工作簿中所有表名的列表。
    1. >>> import openpyxl
    2. >>> wb = openpyxl.load_workbook('example.xlsx') 打开Excel文档,得到workbook对象
    3. >>> wb.get_sheet_names() workbook对象调用get_sheet_names()方法,得到工作薄中的所有工作表名
    4. ['Sheet1', 'Sheet2', 'Sheet3'] 所有工作表名
    5. >>> sheet = wb.get_sheet_by_name('Sheet3') get_sheet_by_name()方法指定工作表名,得到工作表对象,即worksheet对象
    6. >>> sheet
    7. "Sheet3"> Worksheet对象
    8. >>> type(sheet)
    9. <class 'openpyxl.worksheet.worksheet.Worksheet'>
    10. >>> sheet.title worksheet对象调用title方法,得到工作表名
    11. 'Sheet3'
    12. >>> anotherSheet = wb.get_active_sheet() worksheet对象调用get_active_sheet()方法得到活动表
    13. >>> anotherSheet
    14. "Sheet1">

    openpyxl.load_workbook('example.xlsx'):打开Excel文件,得到工作薄对象,workbook对象。

    wb.get_sheet_by_name('Sheet3'):工作薄对象调用get_sheet_by_name()方法,得到工作表对象,worksheet对象。

    get_sheet_names()方法可以取得工作簿中所有表名的列表 wb.sheetnames
      get_sheet_by_name()方法获取工作表对象(高版本Python该方法已弃用)
    sheet=wb['Sheet5']   #得到工作表对象
    get_active_sheet() 方法,取得工作簿的活动表。

    3、从表中取得单元格

    工作薄对象——工作表对象——单元格对象

    1. import openpyxl
    2. wb=openpyxl.load_workbook('1.xlsx') #得到工作薄对象
    3. sheet=wb['Sheet5'] #得到工作表对象
    4. print(type(sheet['A1'])) #得到单元格对象
    5. print(sheet['A1'].value)
    6. c=sheet['B1']
    7. print(c)
    8. print(c.value)

     Cell对象,单元格对象,有value、row、column和coordinate属性。

    工作表对象调用cell()方法,传入整数作为row和column关键字参数,也可以得到一个单元格对象。

    1. import openpyxl
    2. wb=openpyxl.load_workbook('1.xlsx') #得到工作薄对象
    3. sheet=wb['Sheet5'] #得到工作表对象
    4. a=sheet.cell(row=1,column=2)
    5. print(type(a))

     利用 cell()方法和它的关键字参数, 就可以编写 for 循环,打印出一系列单元格的值。

    练习:打印出B列所有所有单元格的值。

    工作表worksheet对象的get_highest_row()方法和get_highest_column()方法可以得到表的大小,但是在最新的openpyxl模块中,已经废除,转而用max_row、max_column。

    1. import openpyxl
    2. wb=openpyxl.load_workbook('1.xlsx') #得到工作薄对象
    3. sheet=wb['Sheet5'] #得到工作表对象
    4. r=sheet.max_row
    5. c=sheet.max_column
    6. print(r,c)
    7. for i in range(1,7):
    8. a=sheet.cell(row=i,column=2)
    9. print(a.value)

    4、列字母和数字之间的转换

    要从字母转换到数字,就调用 openpyxl.cell.column_index_from_string() 函数。
    要从数字转换到字母,就调用 openpyxl.cell.get_column_letter() 函数。在交互式环境
    中输入以下代码:
    1. >>> import openpyxl
    2. >>> from openpyxl.cell import get_column_letter, column_index_from_string
    3. >>> get_column_letter(1)
    4. 'A'
    5. >>> get_column_letter(2)
    6. 'B'
    7. >>> get_column_letter(27)
    8. 'AA'
    9. >>> get_column_letter(900)
    10. 'AHP'
    11. >>> wb = openpyxl.load_workbook('example.xlsx')
    12. >>> sheet = wb.get_sheet_by_name('Sheet1')
    13. >>> get_column_letter(sheet.get_highest_column())
    14. 'C'
    15. >>> column_index_from_string('A')
    16. 1
    17. >>> column_index_from_string('AA')
    18. 27

    5、从表中取得行和列

    可以单独取得工作表中的一行、一列,或者一个矩形区域中的所有Cell对象。然后可以循环遍历这个切片中的所有单元格。

    1. import openpyxl
    2. wb=openpyxl.load_workbook('1.xlsx') #得到工作薄对象
    3. sheet=wb['Sheet5'] #得到工作表对象
    4. print(tuple(sheet['A1':'C3']))

     使用循环,输出选定区域的值:

     我们指明需要从 A1 C3 的矩形区域中的 Cell 对象,得到了一个 Generator对象,它包含该区域中的 Cell 对象。为了帮助我们看清楚这个 Generator 对象,可以使用它的 tuple()方法,在一个元组中列出它的 Cell 对象。

    Generator对象是个元组,是个大元组,其中有很多个小元组,每一行都是一个元组。

    因此要打印出这个区域中所有单元格的值,就要使用两个for循环,外层for循环遍历这个切片中的每一行。第二个循环,针对每一行,循环遍历中该行中的每一个单元格。

    还可以访问指定的行或列的值,这个时候就可以利用Worksheet对象的rots和columns属性。

    1. import openpyxl
    2. wb=openpyxl.load_workbook('1.xlsx') #得到工作薄对象
    3. sheet=wb['Sheet5'] #得到工作表对象
    4. a=sheet['A1':'C3']
    5. b=[col for col in sheet.columns][1]
    6. print(b)

     利用 Worksheet 对象的 rows 属性,可以得到一个元组构成的元组。内部的每个元组都代表 1 行,包含该行中的 Cell 对象。columns 属性也会给你一个元组构成的元组,内部的每个元组都包含 1 列中的 Cell 对象。对于 example.xlsx,因为有 7 3 列,rows给出由 7 个元组构成的一个元组(每个内部元组包含 3 Cell 对象)。columns 给出由3 个元组构成的一个元组(每个内部元组包含 7 Cell 对象)。要访问一个特定的元组,可以利用它在大的元组中的下标。例如,要得到代表 B列的元组,可以用 sheet.columns[1]。要得到代表 A 列的元组,可以用 sheet.columns[0]。 在得到了代表行或列的元组后,可以循环遍历它的对象,打印出它们的值。

    6、工作薄、工作表、单元格

    作为快速复习,下面是从电子表格文件中读取单元格涉及的所有函数、方法和
    数据类型。
    1 .导入 openpyxl 模块。
    2 .调用 openpyxl.load_workbook() 函数。
    3 .取得 Workbook 对象。
    4 .调用 get_active_sheet() get_sheet_by_name() 工作簿方法。
    5 .取得 Worksheet 对象。
    6 .使用索引或工作表的 cell() 方法,带上 row column 关键字参数。
    7 .取得 Cell 对象。
    8 .读取 Cell 对象的 value 属性。

    四、项目:从电子表格中读取数据

    五、写入Excel表格

    OpenPyXL 也提供了一些方法写入数据,这意味着你的程序可以创建和编辑电子表格文件。利用 Python ,创建一个包含几千行数据的电子表格是非常简单的。

    1、创建并保存Excel文档

     我发现我目前学习的这本书Python编程快速上手13章处理Excel电子表格主要使用的是openpyxl模块,但是书中对这个模块的教程已经过时了,好多函数已经废弃、或者被替换了,因此我决定重新在网上找一个教程,来学习openpyxl模块。

    openpyxl

    一、简介

    官方文档:https://openpyxl.readthedocs.io/en/stable/

    注意:openpyxl模块只支持xlsx/xlsm/xltx/xltm格式,不支持xls格式。

    二、新建

    1、新建工作薄

     from openpyxl import Workbook:从openpyxl模块导入Workbook类

    wb = Workbook() 从Workbook类中实例化对象wb

    ws = wb.active wb对象调用active方法 得到活动表

    2、新建工作表

    可以使用create_sheet()函数新建一张工作表。

    1. #新建工作表,名称以Sheet1,Sheet2,....自动填充
    2. ws_1 = wb.create_sheet() # 默认在结尾处新建一个新的工作表
    3. ws_2 = wb.create_sheet(0) # 在当前工作表的指定索引处新建一个工作表
    4. # 用title指定工作表名称
    5. ws_1.title = "新建工作表"
    6. # 新建工作表,并指定名称
    7. ws_3 = wb.create_sheet(title="新建工作表-2",index=0)
    8. ws_4 = wb.create_sheet("新建工作表-1", 0)
    9. # 改变工作表标签颜色,默认为无颜色
    10. ws.sheet_properties.tabColor = "F22F27"

     

     三、操作

    1、设置工作薄只读

    wb = load_workbook(filename='数据.xlsx', read_only=True) #设置只读

     

     2、工作表操作

    1. # 导入openpyxl模块的Workbook类
    2. import openpyxl
    3. from openpyxl import load_workbook
    4. wb=load_workbook(filename='1.xlsx',read_only=True)
    5. print(wb.sheetnames) # 获取工作薄中所有工作表名称
    6. for sheet in wb:
    7. print(sheet.title) # 遍历工作薄中所有工作表名
    8. #获取指定工作表名称
    9. ws=wb['Sheet1'] #创建工作表对象
    10. print('***********'+ws.title) #输入工作表名称
    11. ws_copy=wb.copy_worksheet(ws) #复制工作表
    12. #删除工作表
    13. # 方式一
    14. ws = wb["Sheet1"]
    15. wb.remove(ws)
    16. # 方式二
    17. del wb["Sheet1"]

    3、行列操作

    获知单元格范围

     插入空白行、空白列

     删除行、列

     4、访问单元格

     注意:当一个工作表被创建时,其中不包含单元格,只有当单元格被获取时才被创建。

    这种方式我们不会创建我们从不会使用的单元格,从而减少了内存消耗。

    访问单个单元格

    cell_A2=ws['A2']

    cell_C3=ws[row=3,column=3]

    访问多个单元格

    通过切片访问:

    cell_area = ws['A1':'B4']
    cell_exact = ws.iter_rows(min_row=1, max_row=3, min_col=1, max_col=2)     #即A1:B3

    通过行、列访问:

    col_A = ws['A']           #A列
    col_area = ws['A:B']      #A、B列
    row_2 = ws[2]             #第2行
    row_area = ws[2:5]        #2-5行

    # 迭代所有行
    all_by_row = ws.rows 

    # 迭代所有列
    all_by_col =ws.columns  

    结果可以用tuple()、list()、循环进行处理

    e.g. 1.xlsx

    1. import openpyxl
    2. from openpyxl import load_workbook
    3. wb=load_workbook('1.xlsx')
    4. ws=wb['Sheet5']
    5. #获取单个单元格的值
    6. cell_A2=ws['A2']
    7. cell_C3=ws.cell(row=3,column=3)
    8. print(cell_A2.value,cell_C3.value)
    9. print('---------------------------')
    10. #获取多个单元格的值
    11. cell_area = ws['A1':'D4']
    12. for row in cell_area:
    13. for cell in row:
    14. print(cell.value)

     5、设置行高和列宽

    设置整行行高

    1. # 设置第2行行高
    2. ws.row_dimensions[2].height = 40

    设置整列列宽

    1. # 设置C列列宽
    2. ws.column_dimensions['C'].width = 30

    最后一定要记得保存,wb.save('文件名'),不然不会应用的。

    e.g. 1.xlsx

    1. import openpyxl
    2. from openpyxl import load_workbook
    3. wb=load_workbook('1.xlsx')
    4. ws=wb['Sheet5']
    5. # 设置第2行行高
    6. ws.row_dimensions[2].height = 40
    7. # 设置C列列宽
    8. ws.column_dimensions['C'].width = 30
    9. wb.save('1.xlsx')

    原来的: 

    修改后: 

     6、合并单元格

     合并

    注意:要想在合并单元格写入数据,只需要在合并区域左上角的单元格写入数据即可。

    如果合并区域内的单元格都有数据,也只会保留左上角的数据。

    ws.merge_cells('A2:D4')

    ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)

    1. import openpyxl
    2. from openpyxl import load_workbook
    3. wb=load_workbook('1.xlsx')
    4. ws=wb['Sheet5']
    5. ws.merge_cells('A5:B6')
    6. ws['A5']='这是一个合并后的单元格'
    7. wb.save('1.xlsx')

     

     取消合并

    ws.unmerge_cells('A2:D4')

    ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)

    1. import openpyxl
    2. from openpyxl import load_workbook
    3. wb=load_workbook('1.xlsx')
    4. ws=wb['Sheet5']
    5. ws.merge_cells('A5:B6')
    6. ws['A5']='这是一个合并后的单元格'
    7. ws.unmerge_cells('A5:B6')
    8. wb.save('1.xlsx')

    四、写入

    1、写入数据

    1. # 在单元格写入数据
    2. ws['A1'] = 42 #A1单元格写入
    3. ws.cell(row=1, column=2, value=42) #B1单元格写入
    4. ws.cell(1,3).value= 42 #C1单元格写入
    5. # 新增一行数据
    6. ws.append([1, 2, 3, 4])

    举个例子:

    1. import openpyxl
    2. from openpyxl import load_workbook
    3. wb=load_workbook('1.xlsx')
    4. ws=wb['Sheet5']
    5. ws['A1']='姓名'
    6. ws.cell(row=5, column=1, value='韩梅梅') #A5单元格写入
    7. ws.cell(5,2).value= 42 #B5单元格写入
    8. ws.append(['离美', 2, 3, 4]) # 新增一行数据
    9. wb.save('1.xlsx')

    2、写入公式 

    1. #写入公式
    2. ws['B2'] = "=SUM(A2:A4)"
    3. ws.cell(row=2, column=2, value = "=SUM(A2:A4)")
    4. ws.cell(2,2).value = "=SUM(A2:A4)"

    3、插入图片

    1. img = Image('image') # image:要插入的图片
    2. ws.add_image(img, 'B1') #在B1单元格插入图片

    五、设置单元格样式

    单元格样式有:number_format(数据格式)、Font(字体)、Fill(填充)、Border(边框)、Alignment(对齐方式)、Protection(保护)。

    1、数字格式

    1. import openpyxl
    2. from openpyxl import Workbook
    3. import datetime
    4. wb = Workbook()
    5. ws = wb.active
    6. ws['A1'] = '文字'
    7. print(ws['A1'].number_format) #-->>> General
    8. ws['A2'] = 5
    9. print(ws['A2'].number_format) #-->>> General
    10. ws['A3'] = 0.05
    11. ws['A3'].number_format='0.00%' # 自定义格式
    12. print(ws['A3'].number_format) # -->>> 0.00%
    13. ws['B1'] = datetime.datetime.now()
    14. print(ws['B1'].number_format) # -->>> yyyy-mm-dd h:mm:ss
    15. ws['B2'] = datetime.datetime.now()
    16. ws['B2'].number_format='yyyy-mm-dd' # 自定义格式
    17. print(ws['B2'].number_format) #-->>> yyyy-mm-dd
    18. wb.save("2.xlsx")

     2、字体

    导入

    1. # 导入Font
    2. from openpyxl.styles import Font

    参数说明

    1. name #字体
    2. size #字号,默认11。
    3. bold #是否加粗,默认False。加粗:True
    4. italic #是否斜体,默认False。斜体:True
    5. vertAlign #上下标,默认None。正常:baseline,上标:superscript,下标:subscript
    6. color #字体颜色,默认黑色(FF000000)。
    7. strikethrough #删除线,默认不设置。设置:True
    8. underline #下划线,默认不带下划线。单下划线:single,双下划线:double,会计用单下划线:singleAccounting,会计用双下划线:doubleAccounting

    实例

    1. import openpyxl
    2. from openpyxl import Workbook
    3. from openpyxl.styles import Font
    4. import datetime
    5. wb = Workbook()
    6. ws = wb.active
    7. ws['A1'] = '默认' #A1单元格写入
    8. ws['B2'] = '设置格式' #B2单元格写入
    9. ws['C3'] = '设置上标' #C3单元格写入
    10. #设置B2单元格字体格式
    11. ws['B2'].font = Font(name='Calibri', size=12, color="00FF9900", italic=True, underline='double', strikethrough=True)
    12. #设置C3单元格字体格式
    13. ws['C3'].font = Font(vertAlign='superscript', bold=True)
    14. #保存
    15. wb.save("2.xlsx")

     3、填充

    纯色填充

    导入

    1. #导入
    2. from openpyxl.styles import PatternFill

    参数说明

    1. fill_type #设置图案样式,如果不设置则不会显示颜色。
    2. '''
    3. fill_type可设置的值:solid(实心),lightHorizontal,
    4. darkTrellis, darkUp, darkGray, darkVertical, lightDown,
    5. lightTrellis, lightUp, darkDown, darkHorizontal, mediumGray,
    6. lightVertical, gray0625, gray125, lightGrid, darkGrid, lightGray
    7. '''
    8. fgColor/start_color #前景色 ,即填充色
    9. bgColor/end_color #背景色,即图案颜色

     实例

    1. from openpyxl import Workbook
    2. from openpyxl.styles import PatternFill
    3. wb = Workbook()
    4. ws = wb.active
    5. ws['A1'] = '默认' #A1单元格写入
    6. ws['B2'] = '前景色' #B2单元格写入
    7. ws['C3'] = '背景色' #C3单元格写入
    8. #前景色,即填充色。也是我们一般设置的填充色
    9. ws['B2'].fill = PatternFill(fill_type='solid', fgColor='00FF9900')
    10. #背景色,即图案颜色。
    11. ws['C3'].fill = PatternFill(fill_type='solid', bgColor='00FF9900')
    12. wb.save("实例.xlsx")

    2、渐变填充(GradientFill)

    导入

    1. #导入
    2. from openpyxl.styles import GradientFill

    参数说明

    1. type/fill_type # 渐变填充类型:linear,path
    2. '''
    3. linear :
    4. 渐变在一组指定的 Stops 之间插入颜色,跨越一个区域的长度。默认情况下渐变是从左到右的,但可以使用 degree 属性修改此方向。可以改为提供颜色列表,它们之间的距离将相等。
    5. path:
    6. 渐变从区域的每个边缘应用线性渐变。属性 top、right、bottom、left 指定从各个边界填充的范围。比如top=”0.2” 将填充单元格的前 20%。
    7. '''

    实例

    1. from openpyxl.styles import GradientFill
    2. from openpyxl import Workbook
    3. wb = Workbook()
    4. ws = wb.active
    5. # 合并单元格
    6. ws.merge_cells('B2:F4')
    7. #对合并单元格左上角单元格设置渐变填充
    8. top_left_cell = ws['B2']
    9. top_left_cell.fill = GradientFill(type='linear', degree=0, stop=('FFFFFF', '99ccff', '000000')) #渐变填充
    10. wb.save("实例.xlsx")

    4、边框

    设置边框样式时还需要通过Side。

    导入

    1. #导入
    2. from openpyxl.styles import Border, Side

    参数说明

    1. # Border参数说明
    2. left = Side(style , color) #左边框设置
    3. right = Side(style , color) #右边框设置
    4. top = Side(style , color) #上边框设置
    5. bottom = Side(style , color) #下边框设置
    6. diagonalDown #是否显示左上-右下对角线,显示:True
    7. diagonalUp #是否显示左下-右上对角线,显示:True
    8. diagonal = Side(style , color) #对角线边框设置,注意首先要设置显示对角线
    9. #Side参数说明
    10. style/border_style #边框样式
    11. '''
    12. 边框样式可设置的有:
    13. thick, mediumDashDot, dashed, mediumDashDotDot,
    14. dashDot, slantDashDot, dotted, double, thin,
    15. hair, dashDotDot, mediumDashed, medium
    16. '''
    17. color #边框颜色

    实例

    1. from openpyxl import Workbook
    2. from openpyxl.styles import Border, Side
    3. wb = Workbook()
    4. ws = wb.active
    5. ws['A1'] = '默认' #A1单元格写入
    6. ws['B2'] = '边框' #B2单元格写入
    7. ws['C3'] = '对角线' #C3单元格写入
    8. #边框线格式设置
    9. line_format = Side(style='medium',color='00FF9900')
    10. #B2单元格设置上下左右边框
    11. ws['B2'].border = Border(left=line_format, right=line_format, top=line_format, bottom=line_format)
    12. #C3单元格设置对角线
    13. ws['C3'].border = Border(diagonalDown=True, diagonalUp=True, diagonal=line_format)
    14. #保存
    15. wb.save("实例.xlsx")

    参考链接:Python自动化办公:openpyxl教程(基础)

  • 相关阅读:
    视频剪辑中花式抠图的代码实操与案例详述
    MySQL运维篇(三)
    linux系统下,配置开机自启脚本常见的5种方法
    【GNN】采样算法总结
    并查集(UnionFind)总结
    P3396 题解
    对 Git 分支 master 和 origin/master 的一些认识
    解决spacedesk卸载/重装软件时显示 指定的账户已存在
    ROS2中的行为树 BehaviorTree
    Java并发(二十一)----wait notify介绍
  • 原文地址:https://blog.csdn.net/qq_32393893/article/details/127314863