1. 1-1
  2. import openpyxl
  3.  
  4. # 通过文件路径,打开工作簿
  5. wb1 = openpyxl.load_workbook('./demo_excel.xlsx')
  6. # 用 Workbook() 创建新工作簿
  7. wb2 = openpyxl.Workbook()
  8.  
  9. openpyxl库可以处理Excel2010以后的电子表格格式,包括:xlsx/xlsm/xltx/xltm
  10. 要使用openpyxl库,需要先导入
  11. 先用import直接导入了openpyxl库,然后用openpyxl.load_workbook()打开已有工作簿,用openpyxl.Workbook()创建新工作簿。
  12. 但是每次使用我们都要带openpyxl.,这样就有点儿麻烦。
  1. 1-1-1
  2. from openpyxl import load_workbook, Workbook
  3.  
  4. # 通过文件路径,打开已有工作簿
  5. wb1 = load_workbook('./demo_excel.xlsx')
  6. # 用 Workbook() 创建新工作簿
  7. wb2 = Workbook()
  8.  
  9. fromimport…是import语句的一个变体,可以导入库或模块中的函数、方法、类或变量。
  10. 语法为:from 库/模块 import 函数/方法/类/变量。
  11. 可以用fromimport…一行导入多个名字,不同名字间用逗号分隔。
  12.  
  13. 例如:from 库/模块 import 函数1, 1
  14.  
  15. 注意第一行代码,写为from openpyxl import load_workbook, Workbook,接下来就可以直接使用被导入的函数/方法/类/变量。

两种写法对比一下,同样是打开三个工作簿和创建三个新的工作簿,下面的写法明显更简单,更高效一些。

  1. 2-1 获取工作簿对象
  2. from openpyxl import load_workbook
  3.  
  4. # 打开【公司人员名单.xlsx】工作簿
  5. staff_wb = load_workbook('./codes/material/公司人员名单.xlsx')
  6. # 打印工作簿对象
  7. print(staff_wb)
  8.  
  9. 使用openpyxl库中的一个函数load_workbook(filename),参数filename代表了工作簿的路径,即.xlsx文件的路径。这个函数会返回一个工作簿对象
  10.  
  11. 运行代码后,我们得到了打印出来的工作簿对象:
  12. <openpyxl.workbook.workbook.Workbook object at xxxxxxxx>。
  13.  
  14. 结果中的Workbook object(Workbook对象)就是工作簿对象,出现这样的结果,也就意味着我们已经成功使用代码打开了【公司人员名单.xlsx】这个文件,并且获得代表它的工作簿对象。
  1. 2-2
  2. 还可以通过实例化Workbook类来获取工作簿对象,更准确地来说,这是一种创建工作簿对象的方式。
  3. 语法很简单,写为Workbook()即可,括号里面不需要写任何参数。
  4. from openpyxl import Workbook
  5.  
  6. # 新建工作簿
  7. new_wb = Workbook()
  8. # 打印工作簿对象
  9. print(new_wb)
  10.  
  11. 输出结果中同样显示<openpyxl.workbook.workbook.Workbook object at xxxxxxxx>,证明工作簿对象已经被成功创建。
  12. 以上就是获取工作簿对象的两种途径
  1. 3-1 工作簿对象的基本操作
  2. 如果要把新建的工作簿对象保存到本地,就需要使用工作簿对象的方法save()。
  3. 语法为:工作簿对象.save(filename),参数filename表示新工作簿的文件路径,这里我推荐以.xlsx作为新工作簿的路径结尾。
  4.  
  5. from openpyxl import Workbook
  6.  
  7. # 新建工作簿
  8. new_wb = Workbook()
  9. # 将新建的工作簿保存为【new_excel.xlsx】
  10. new_wb.save('./new_excel.xlsx')
  11.  
  12. 通过load_workbook(filename)获取到的工作簿对象也可以使用方法save(filename)。
  13. 如果参数filename不变,即保存在原有路径,相当于修改原文件;若参数filename变化,即保存在新的路径,相当于另存为新的文件。

  1. 4-1 练习
    1 from openpyxl import load_workbook, Workbook
  2. 2
  3. 3 # 打开【practice0.xlsx】工作簿
  4. 4 practice_wb = load_workbook('./material/practice0.xlsx')
  5. 5 # 打印工作簿对象
  6. 6 print(practice_wb)
  7. 7
  8. 8 # 新建工作簿对象
  9. 9 new_wb = Workbook()
  10. 10 # 打印新建的工作簿对象
  11. 11 print(new_wb)
  12. 12
  13. 13 # 将新建的工作簿保存为【practice0_result.xlsx】
  14. 14 new_wb.save('./material/practice0_result.xlsx')

 第四行代码,先用函数load_workbook()打开了目标文件,这里需要注意文件的路径是否正确。

 第九行代码,通过实例化Workbook类来新建工作簿对象。

 最后一行代码,使用工作簿对象的方法save()将新建的工作簿保存下来,还是需要注意文件的路径是否正确。

  1. 5-1-1 如何获取工作表对象
  2.  
  3. from openpyxl import load_workbook
  4.  
  5. # 打开【公司人员名单.xlsx】工作簿
  6. staff_wb = load_workbook('./codes/material/公司人员名单.xlsx')
  7. # 获取活动工作表
  8. active_ws = staff_wb.active
  9.  
  10. # 打印工作簿对象
  11. print(staff_wb)
  12. # 打印工作表对象
  13. print(active_ws)
  14.  
  15. 工作表就是工作簿中,位于下方的标签。在实际操作中,我们可以通过点击不同的标签,来选择不同的工作表。
  16. 现实中的工作表,在openpyxl中对应着工作表对象(Worksheet对象)。
  17. 一个工作表对象(Worksheet对象)就表示工作簿中的一张工作表。
  18. 常用的获取工作表的方式有两种,第一种就是通过工作簿对象的属性active
  19. active会获取到活动的工作表,活动工作表是指当前正在操作的工作表,打开一个.xlsx文件后,默认显示的工作表即为活动工作表。

 代码分别打印了工作簿对象(Workbook)和工作表对象(Worksheet),要注意区分它们。

  1. 5-1-2 按表名取表
  2. from openpyxl import load_workbook
  3.  
  4. # 打开【公司人员名单.xlsx】工作簿
  5. staff_wb = load_workbook('./codes/material/公司人员名单.xlsx')
  6. # 按表名取表
  7. fhy_ws = staff_wb['上半年公司名单'] # fhy为first half year(上半年)的缩写
  8. shy_ws = staff_wb['下半年公司名单'] # shy为second half year(下半年)的缩写
  9.  
  10. # 打印工作簿对象
  11. print(staff_wb)
  12. # 打印工作表对象
  13. print(fhy_ws)
  14. print(shy_ws)
  15.  
  16. 如果我们已知工作表的名称,就可以以表名为索引,用工作簿对象['表名']的方式取到指定的工作表对象。一般情况下,如果工作簿中存在多张工作表,且我们知道这些工作表的名称,就可以采用按表名取表这种方式。

 对比两种获取工作表对象的方式,可以根据实际需要自行决定使用哪一种写法。

  1. 5-2 工作表对象的基本操作
  2. 5-2-1 获取单行或单列
  3. from openpyxl import load_workbook
  4.  
  5. # 打开【公司人员名单.xlsx】工作簿
  6. staff_wb = load_workbook('./codes/material/公司人员名单.xlsx')
  7. # 获取活动工作表
  8. active_ws = staff_wb.active
  9.  
  10. # 打印获取到的第五行数据
  11. print(active_ws[5])
  12. # 打印获取到的第二列数据
  13. print(active_ws['B'])
  14.  
  15. Excel表格中,使用数字表示行数,用英文字母表示列名
  16. openpyxl中,通过工作表对象[行数]或工作表对象['列名']的方式获取到一个元组,这个元组中包含了指定行或列中的所有数据。
  17.  
  18. 元组中的每一个元素均为<Cell '工作表名称'.坐标>的形式,Cell是单元格对象。
  1. 5-2-2 获取多行数据
    1 from openpyxl import load_workbook
  2. 2
  3. 3 # 打开【公司人员名单.xlsx】工作簿
  4. 4 staff_wb = load_workbook('./codes/material/公司人员名单.xlsx')
  5. 5 # 获取【'上半年公司名单'】工作表
  6. 6 fhy_ws = staff_wb['上半年公司名单']
  7. 7
  8. 8 # 返回第2行至第12行,第2列(B列)至第3列(C列)这个范围的单元格内的所有数据(值)
  9. 9 for row in fhy_ws.iter_rows(min_row=2, max_row=12, min_col=2, max_col=3, values_only=True):
  10. 10 print(row)
    可以借助工作表对象的方法iter_rows()来得到表格中指定范围内的多行数据。
    参数min_rowmax_row分别表示最小行索引和最大行索引,最小行索引的值默认为1,最大行索引的值默认为表格中有数据的最下面一行的行数;
    参数min_colmax_col分别表示最小列索引和最大列索引,最小列索引的值默认为1,最大列索引的值默认为表格中有数据的最右面一列的列数;
    参数values_only决定是否返回单元格的值,如果为True则返回单元格的值,如果为False则返回单元格对象。
    通常情况下,只读数据时,需要将该参数设置为True,要写入数据时,保持其为默认的False就好。

    工作表对象的方法iter_rows()会返回一个可迭代对象,该对象中有n个元组,n为参数中指定的行数,每一个元组都代表了表格中的一行。
    因此,通常情况下,iter_rows()会和for循环结合使用,从而使得我们取出其返回的可迭代对象中的每一个元组,即表格中指定范围内的每一行数据。
    当参数values_only保持其默认的False时,iter_rows()方法会返回指定范围内的单元格对象

  1. 5-2-3 添加数据
    1 from openpyxl import load_workbook
  2. 2
  3. 3 # 打开【公司人员名单.xlsx】工作簿
  4. 4 staff_wb = load_workbook('./公司人员名单.xlsx')
  5. 5 # 获取活动工作表
  6. 6 active_ws = staff_wb.active
  7. 7
  8. 8 info_list = ['S1911', '萧爵瑟', 3000, '内容']
  9. 9 info_tuple = ('S1912', '吴琐薇', 5000, '销售')
  10. 10
  11. 11 active_ws.append(info_list)
  12. 12 active_ws.append(info_tuple)
  13. 13
  14. 14 # 保存工作簿为【append_demo.xlsx】
  15. 15 staff_wb.save('./append_demo.xlsx')
    可以使用工作表对象的append()来添加一行数据。
    该方法可将部分可迭代对象(常见的如列表、元组)添加到工作表对象中,即给表格的末尾追加一行数据。
    语法也很简单,写为工作表对象.append(列表/元组)即可。

    需要注意的是,使用append()添加完数据后,如果想要在本地的Excel文件中看到添加后的数据,就一定要将工作簿保存下来,即使用工作簿对象的方法save()
    上面的代码中,添加了两行数据,两行数据分别为列表和元组,并且它们确实是被添加到了工作表的最后。

  1. 5-3

  """题目要求
  1. 打开material文件夹下的文件practice1.xlsx,获取下半年公司名单工作表。
  2. 然后打印出第5到第10行,前三列的所有数据(值)。
  3. 再给工作表的最后一行添加数据'S1911', '萧爵瑟', 3000, '内容'。
  4. 然后将结果保存在material文件夹下,并命名为`practice1_result.xlsx`。
  """

  1. 1 from openpyxl import load_workbook
  2. 2
  3. 3 # 打开【practice1.xlsx】工作簿
  4. 4 staff_wb = load_workbook('./material/practice1.xlsx')
  5. 5 # 按表名取表
  6. 6 staff_ws = staff_wb['下半年公司名单']
  7. 7
  8. 8 # 打印出第5到第10行,前三列的所有数据
  9. 9 for row in staff_ws.iter_rows(min_row=5, max_row=10, max_col=3, values_only=True):
  10. 10 print(row)
  11. 11
  12. 12 # 在工作表最后增加数据
  13. 13 info_tuple = ('S1912', '吴琐薇', 5000, '销售')
  14. 14 staff_ws.append(info_tuple)
  15. 15
  16. 16 # 保存结果为【practice1_result.xlsx】
  17. 17 staff_wb.save('practice1_result.xlsx')

 第六行代码,可以使用按表名取表,获取到需要的工作表对象。

 第九行代码,使用iterrows()获取指定范围内的数据,根据题目要求,要将valuesonly的值设置为True。

 第十四行代码,使用append()将元组添加到工作表的最后一行。


  1. 6-1-1 获取单元格对象
    1 from openpyxl import load_workbook
  2. 2
  3. 3 # 打开【公司人员名单.xlsx】工作簿
  4. 4 staff_wb = load_workbook('./codes/material/公司人员名单.xlsx')
  5. 5 # 获取【'上半年公司名单'】工作表
  6. 6 fhy_ws = staff_wb['上半年公司名单']
  7. 7
  8. 8 # 返回第2行至第12行,第2列(B列)至第3列(C列)这个范围的所有单元格对象
  9. 9 for row in fhy_ws.iter_rows(min_row=2, max_row=12, min_col=2, max_col=3):
  10. 10 print(row)

    三种常见的获取单元格对象的方式
    第一种方式就是通过 for row in 工作表对象.iter_rows()来获取指定范围的行,
    当参数values_only为默认的False时,得到的row就是一个个由单元格对象组成的元组,
    可以通过索引或者for循环遍历的方式来获取单独的单元格对象。

    810行代码,获取并打印了表格中第2行至第12行,第2列(B列)至第3列(C列)这个范围内的所有单元格对象。

一句话总结下第一种方式:通过iter_rows()来获取指定范围的行,再通过索引从行中取出单元格对象。

  1. 6-1-2
    1 from openpyxl import load_workbook
  2. 2
  3. 3 # 打开【公司人员名单.xlsx】工作簿
  4. 4 staff_wb = load_workbook('./codes/material/公司人员名单.xlsx')
  5. 5 # 获取活动工作表
  6. 6 staff_ws = staff_wb.active
  7. 7
  8. 8 # for循环遍历,取出第三行的所有单元格对象
  9. 9 for row_cell in staff_ws[3]:
  10. 10 print(row_cell)
  11. 11
  12. 12 # for循环遍历,取出第三列(C列)的所有单元格对象
  13. 13 for col_cell in staff_ws['C']:
  14. 14 print(col_cell)
    for cell in 工作表对象[行数]
    for cell in 工作表对象['列名']

一句话总结下第二种方式:通过行数或者列名来指定具体的行或列,然后通过for循环遍历获取指定行或列中的每一个单元格对象。

  1. 6-1-3 通过工作表对象['单元格坐标']来获取具体的单元格对象
    1 from openpyxl import load_workbook
  2. 2
  3. 3 # 打开【公司人员名单.xlsx】工作簿
  4. 4 staff_wb = load_workbook('./codes/material/公司人员名单.xlsx')
  5. 5 # 获取活动工作表
  6. 6 staff_ws = staff_wb.active
  7. 7
  8. 8 # 打印单元格对象A1
  9. 9 print(staff_ws['A1'])
    一句话总结下获取单元格对象的第三种方式:通过单元格坐标来指定具体的单元格,从而获取到对应的单元格对象。
  1. 6-2 单元格对象的基本操作
  2. 借助单元格对象的属性value,就可以得到具体的数据;
  3. 也可以通过这个属性给单元格对象赋值(修改单元格的值或给单元格添加值)。
  4.  
  5. # 获取单元格的值
  6. 单元格对象.value
  7. # 给单元格对象赋值
  8. 单元格对象.value =
  1. 6-2-1
    1 from openpyxl import load_workbook
  2. 2
  3. 3 # 打开【公司人员名单.xlsx】工作簿
  4. 4 staff_wb = load_workbook('./codes/material/公司人员名单.xlsx')
  5. 5 # 获取活动工作表
  6. 6 staff_ws = staff_wb.active
  7. 7
  8. 8 # 打印单元格对象C2的值
  9. 9 print(staff_ws['C2'].value)
  10. 10
  11. 11 # 修改单元格对象C2的值为10000
  12. 12 staff_ws['C2'].value = 10000
  13. 13
  14. 14 # 打印修改后的单元格对象C2的值
  15. 15 print(staff_ws['C2'].value)
  16. 16
  17. 17 # 将结果保存为【公司人员名单_new.xlsx】
  18. 18 staff_wb.save('./codes/material/公司人员名单_new.xlsx')
    通过第8行代码,打印出了单元格C2原有的值8000
    1115行,通过单元格对象.value10000赋值给单元格C2,改变了其原有的值,并将修改后的结果打印了出来。

  1. 7-1

"""题目要求
   1. 通过代码,打开material文件夹下的文件practice2.xlsx,获取下半年公司名单工作表。
   2. 打印第四列(D列)除表头部门外的所有数据。
   3. 将原有的值全部修改为战略储备部。
   4. 将结果保存为practice2_result.xlsx。
   """

  1. 1 from openpyxl import load_workbook
  2. 2
  3. 3 # 打开【practice2.xlsx】工作簿
  4. 4 staff_wb = load_workbook('./material/practice2.xlsx')
  5. 5 # 按表名取表
  6. 6 staff_ws = staff_wb['下半年公司名单']
  7. 7
  8. 8 # 循环获取第四列(D列)的所有单元格对象
  9. 9 for col_cell in staff_ws['D']:
  10. 10 # 如果为表头,则跳过本次循环
  11. 11 if col_cell.value == '部门':
  12. 12 continue
  13. 13 # 打印原有的值
  14. 14 print(col_cell.value)
  15. 15 # 将原有的值修改为'战略储备部'
  16. 16 col_cell.value = '战略储备部'
  17. 17
  18. 18 # 将结果保存为【'practice2_result.xlsx'】
  19. 19 staff_wb.save('./material/practice2_result.xlsx')

    第九行代码,获取到了工作表对象的第四列(D列)。
    第十一、十二行代码,综合if条件判断和continue语句跳过了表头。
    第十六行代码,修改了单元格对象原有的值。

20201207-2 openpyxl 库与模块导入的更多相关文章

  1. python成长之路【第十八篇】:python模块介绍、模块导入和重载

    一.模块和命名空间 一般来说,Python程序往往由多个模块文件构成,通过import语句连接在一起.每个模块文件是一个独立完备的变量包,即一个命名空间.一个模块文件不能看到其他文件定义的变量名,除非 ...

  2. python学习日记(模块导入)

    什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.p ...

  3. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  4. Node.js模块导入导出

    这篇文章本来是想模块导入导出和事件循环一起写的,但是感觉一起写的话会太长了,所以就分开两篇文章写吧.下一篇会重点介绍一下js中的事件循环,js代码到底是以何种顺序去执行的呢?我相信你看懂了事件循环再去 ...

  5. python模块导入细节

    python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: ...

  6. 【转】python模块导入细节

    [转]python模块导入细节 python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码 ...

  7. python基础之import模块导入和包的调用

    模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...

  8. Python开发基础-Day16import模块导入和包的调用

    模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...

  9. python之模块导入和重载

    模块导入和重载 模块导入通过import语句实现,但是在同一次会话中只运行一次. 若想要再次运行文件,调用imp标准库中的reload函数: >>> from imp import ...

随机推荐

  1. 用了Redisson的Spring Boot Starter搞的我都想重写个

    在对接一个小程序推送的框架时,需要将 access_token 存储到 Redis 中,框架中提供了存储逻辑,只需要将 RedissonClient 对象传进去即可. 框架内部在用 Redisson ...

  2. 已安装的nginx添加其他模块

    总体操作就是添加新模块并重新编译源码,然后把编译后的nginx可执行文件覆盖原来的那个即可.1 查看已安装的参数nginx -V拷贝那些巴拉巴拉的参数,后面编译的时候使用 2 下载相同版本号的源码,解 ...

  3. ABBYY FineReader中的其他格式

    ABBYY FineReade是一款功能强大的PDF编辑转换器,在内置任务窗口,您可以将 PDF 或图片转换成常见的格式(*.pptx. *.odt. *.html.*.epub.*.fb2.*.rt ...

  4. ABBYY FineReader 15 对比文档功能

    想必大家在办公的时候都有着要处理各种各样文档的烦恼,一个文档经过一个人或不同人的多次修订都是常有的事,拥有文档对比功能的软件也就应势而生.ABBYY FineReader 15 有许多能够帮助我们办公 ...

  5. 教你用Vegas Pro制作视频的遮罩转场特效

    很多小伙伴在接触了Vegas之后,都想利用Vegas制作出各种酷炫的特效.小编也是一样. 今天,小编就和大家分享一下,小编近期学会的遮罩转场特效. 首先想要制作遮罩转场效果,需要的素材有:至少两个图片 ...

  6. JavaSE 学习笔记01丨开发前言与环境搭建、基础语法

    本蒟蒻学习过C/C++的语法,故在学习Java的过程中,会关注于C++与Java的区别.开发前言部分,看了苏星河教程中的操作步骤.而后,主要阅读了<Java核心技术 卷1 基础知识>(第8 ...

  7. 码农飞升记-Java是什么?

    1.Java概述 Java 原名 Oak 是 Sun Microsystems 公司的 James Gosling 及其团队于 1995 年 5 月推出的 Java 程序设计语言 和 Java 平台 ...

  8. springboot补充

    springboot中的日志: 在默认的spring-boot-starter中,会引入spring-boot-starter-logging, 而springboot-starte-longing中 ...

  9. jquery on 动态生成绑定事件

    $(document).on("mouseenter", ".v6-div-kind-ok", function () { alert();});

  10. moviepy音视频剪辑:与大小相关的视频变换函数crop、even_size、margin、resize介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...