• python中openpyxl库用法详解


            openpyxl模块是一个读写Excel 文档的Python库,openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档。

    • openpyxl.load_workbook(地址) - 打开给定的文件名并返回 工作簿
    • openpyxl.Workbook() - 新建一个 Workbook(工作簿)对象 ,即excel文件

    一、读取数据

    数据如下图所示:

    示例代码:

    1. import openpyxl
    2. # 打开给定的文件名并返回 工作簿
    3. data = openpyxl.load_workbook('data/体检表.xlsx')
    4. print(type(data))
    5. print(data) # 返回一个 workbook 数据类型的值

    运行结果:

    1.1 从工作簿中取得工作表

    • 工作簿对象.sheetnames - 获取当前工作簿中 所有表的名字
    • 工作簿对象.active - 获取当前 活动表1 对应的Worksheet对象
    • 工作簿对象[表名] - 根据表名获取指定 表对象
    • 表对象.title - 获取表对象的 表名
    • 表对象.max_row - 获取表的 最大有效行数
    • 表对象.max_column - 获取表的 最大有效列数 

    示例代码:

    1. import openpyxl
    2. # 打开给定的文件名并返回 工作簿
    3. data = openpyxl.load_workbook('data/体检表.xlsx')
    4. print(type(data))
    5. print(data) # 返回一个 workbook 数据类型的值
    6. # 获取所有表的表名
    7. sheets_names = data.sheetnames
    8. print(sheets_names)
    9. # 获取活动表对应的表对象(表对象就是Worksheet类的对象)
    10. active_sheet = data.active
    11. print(active_sheet)
    12. # 根据表名获取工作簿中指定的表
    13. sheet2 = data['Sheet2']
    14. print(sheet2)
    15. # 根据表对象获取表的名字
    16. sheet_name1 = active_sheet.title
    17. sheet_name2 = sheet2.title
    18. print(sheet_name1, sheet_name2)
    19. # 获取第二列的所有内容
    20. sheet = data.active
    21. row_num = sheet.max_row # 获取当前表中最大的行数
    22. for row in range(1, row_num+1):
    23. cell = sheet.cell(row, 2)
    24. print(cell.value)

    运行结果:

    1.2 从表中取得单元格

    • 表对象['列号行号'] - 获取指定列的指定行对应的单元格对象(单元格对象是 Cell 类的对象,列号是从A开始,行号是从1开始)
    • 表对象.cell(行号, 列号) - 获取指定行指定列对应的单元格(这儿的行号和列好号都可以用数字)
    • 表对象.iter_rows() - 一行一行的取
    • 表对象.iter_cols() - 列表一列的取
    • 单元格对象.value - 获取单元格中的内容
    • 单元格对象.row - 获取行号(数字1开始)
    • 单元格对象.column - 获取列号(数字1开始)
    • 单元格对象.coordinate - 获取位置(包括行号和列号) 

    示例代码:

    1. import openpyxl
    2. # 打开给定的文件名并返回 工作簿
    3. data = openpyxl.load_workbook('data/体检表.xlsx')
    4. print(type(data))
    5. print(data) # 返回一个 workbook 数据类型的值
    6. # 获取活跃表对象
    7. sheet = data.active
    8. # 获取单元格对应的 Cell 对象
    9. a1 = sheet['A1'] # A1 表示A列中的第一行,这儿的列号采用的是从A开始的
    10. print(a1)
    11. # 获取单元格中的内容
    12. content = a1.value
    13. print(content)
    14. # 调用表的 cell()方法时,可以传入整数 作为 row 和 column 关键字参数,也可以得到一个单元格
    15. content2 = sheet.cell(2, 2).value
    16. print(content2)
    17. # 获取单元格的行和列信息
    18. row = a1.row
    19. print('行:', row)
    20. column = a1.column
    21. print('列:', column)
    22. coordinate = a1.coordinate
    23. print(coordinate)
    24. print("*" * 100)
    25. # 获取第二列的所有内容
    26. row_num = sheet.max_row # 获取当前表中最大的行数
    27. for row in range(1, row_num+1):
    28. cell = sheet.cell(row, 2)
    29. print(cell.value)

    运行结果:

    注意:在 Z 列之后,列开始使用两个字母:AA、AB、AC 等。作为替代,在调用表的 cell()方法时,可以传入整数 作为 row 和 column 关键字参数,也可以得到一个单元格。

    注意:第一行或第一列的对应的整数 是 1,不是 0。

    1.3 从表中取得行和列

            表对象也可以像列表或者字符串那样进行 切片 操作,来获取电子表格中一行、一列或一个 矩形区域 中的所有 Cell 对象,然后就可以对数据进行相应的操作。

    • 表对象[位置1:位置2] - 获取指定范围中的所有的单元格

    示例代码:

    1. import openpyxl
    2. from openpyxl.utils import get_column_letter
    3. # 打开给定的文件名并返回 工作簿
    4. data = openpyxl.load_workbook('data/体检表.xlsx')
    5. # print(type(data))
    6. # print(data) # 返回一个 workbook 数据类型的值
    7. # 获取表对象
    8. sheet = data.active
    9. # 1.获取整个一行的单元格
    10. max_column = sheet.max_column # 获取最大列数
    11. column = get_column_letter(max_column) # 获取最大列数对应的字母列号
    12. # 获取第一行所有单元格对象
    13. row2 = sheet['A1':'%s1' % column] # ((, , ),)
    14. print(row2)
    15. for row_cells in row2:
    16. for cell in row_cells:
    17. print(cell.coordinate, cell.value)
    18. print("*" * 100)
    19. # 2.获取整个列的单元格
    20. max_row = sheet.max_row
    21. columnB = sheet['B1':'B%d' % max_row]
    22. # 获取B列对应的所有单元格对象
    23. for column_cells in columnB:
    24. for cell in column_cells:
    25. print(cell.coordinate, cell.value)
    26. print("*" * 100)
    27. # 3. 获取矩形区域中的单元格对象
    28. cell_tuples = sheet['A1': 'C3']
    29. print(cell_tuples)
    30. for cells in cell_tuples:
    31. for cell in cells:
    32. print(cell.coordinate, cell.value)

    运行结果:

    二、写入数据

    2.1 创建Workbook对象来创建Excel文件并保存

    • openpyxl.Workbook() - 创建空的 Excel 文件对应的工作簿对象
    • 工作簿对象.save(文件路径) - 保存文件
    • 工作簿对象.create_sheet(title, index) - 在指定工作簿中的指定位置(默认是最后)创建指定名字的表,并且返回表对象
    • 工作簿对象.remove(表对象) - 删除工作簿中的指定表
    • 表对象[位置] = 值 - 在表中指定位置对应的单元格中写入指定的值,位置是字符串:‘A1’(第1列的第一行)、‘B1’(第二列的第一行)

    示例代码:

    1. import openpyxl
    2. # 创建空的Workbook对象
    3. w_data = openpyxl.Workbook()
    4. # 获取所有表名
    5. print(w_data.sheetnames) # ['Sheet']
    6. # 可知默认情况下,新建的Workbook对象对应的Excel 文件中只有一张名字是 'Sheet' 的表
    7. # 获取活动表
    8. sheet_active = w_data.active
    9. # 修改表的名字
    10. sheet_active.title = 'first_table'
    11. # 保存至文件
    12. w_data.save(filename='data/info.xlsx')
    13. # 新建表
    14. w_data.create_sheet()
    15. w_data.create_sheet()
    16. # for i in range(20):
    17. # wb.create_sheet()
    18. print(w_data.sheetnames) # ['first_table', 'Sheet', 'Sheet1']
    19. # 新建表时,从Sheet开始一直到Sheet n
    20. w_data.create_sheet('second_table')
    21. # `工作簿对象.create_sheet(title, index)` - 在指定工作簿中的指定位置(默认是最后)创建指定名字的表,并且返回表对象
    22. w_data.create_sheet('third_table', 1)
    23. print(w_data.sheetnames) # ['first_table', 'third_table', 'Sheet', 'Sheet1', 'second_table']
    24. # 删除表
    25. w_data.remove(w_data['Sheet1'])
    26. w_data.save(filename='data/info.xlsx')
    27. # 写入数据
    28. w_data = openpyxl.load_workbook('data/info.xlsx')
    29. sheet = w_data['first_table'] # 获取表
    30. sheet['A1'] = '姓名'
    31. sheet['B1'] = '年龄'
    32. sheet['C1'] = '性别'
    33. sheet['A2'] = '张三'
    34. sheet['B2'] = 25
    35. sheet['C2'] = '男'
    36. w_data.save('data/info.xlsx')

    运行结果:

    2.2 案例分析一 :爬取数据并保存excel中

    示例代码:

    1. # 利用requests获取天行数据中疫情数据,并且将获取到的数据使用excel文件保存到表中。
    2. import requests
    3. import openpyxl
    4. from openpyxl.utils import get_column_letter
    5. # 1.获取数据
    6. url = 'http://api.tianapi.com/txapi/ncovabroad/index?key=c9d408fefd8ed4081a9079d0d6165d43'
    7. rep = requests.get(url)
    8. news_list = rep.json()['newslist']
    9. # 2.设置表头信息
    10. headers = {'continents': ('洲', 'A'),
    11. 'provinceName': ('国家', 'B'),
    12. 'currentConfirmedCount': ('现有确诊', 'C'),
    13. 'confirmedCount': ('累计确诊', 'D'),
    14. 'curedCount': ('治愈', 'E'),
    15. 'deadCount': ('死亡', 'F')}
    16. # 3.创建工作表
    17. wb = openpyxl.Workbook()
    18. sheet = wb.active
    19. # 4.写入数据
    20. # 先写入第一行的表头
    21. column_num = 1
    22. for key in headers:
    23. column = get_column_letter(column_num)
    24. location = f'{column}1'
    25. sheet[location] = headers[key][0]
    26. column_num += 1
    27. # 再从第二行开始写入爬取到的数据
    28. row = 2
    29. for news in news_list: # 遍历每条数据项,一个数据项对应一个字典
    30. for key in news: # 遍历数据键值
    31. if key in headers: # 保证键是表头中的某一项我们需要的数据
    32. location = f'{headers[key][1]}{row}' # 存在表中的位置
    33. value = news[key] # 需要的数据
    34. sheet[location] = value # 写入
    35. row += 1
    36. wb.save(filename='data/epidemic.xlsx')

    运行结果:

    2.3 案例分析二: 操作单元格中内容样式并保存数据

    示例代码:

    1. import openpyxl
    2. from openpyxl.styles import Font, PatternFill, Border, Side, Alignment # 字体、填充图案、边框、侧边、对齐方式
    3. # 1.打开工作簿
    4. data = openpyxl.load_workbook('data/体检表.xlsx')
    5. sheet = data.active
    6. # 2.设置单元格字体样式
    7. """
    8. Font(
    9. name=None, # 字体名,可以用字体名字的字符串
    10. strike=None, # 删除线,True/False
    11. color=None, # 文字颜色
    12. size=None, # 字号
    13. bold=None, # 加粗, True/False
    14. italic=None, # 倾斜,Tue/False
    15. underline=None # 下划线, 'single', 'singleAccounting', 'double','doubleAccounting'
    16. )
    17. """
    18. # 创建字体对象,并调整合适的参数
    19. font1 = Font(
    20. name='微软雅黑',
    21. size=15,
    22. italic=False,
    23. color='ff0000',
    24. bold=False,
    25. strike=False,
    26. underline='single',
    27. )
    28. # 设置指定单元格的字体
    29. # 单元格对象.font = 字体对象
    30. area = sheet['A1':'E1']
    31. for row in area:
    32. for _ in row:
    33. _.font = font1 # 调整字体
    34. # 3.设置单元格填充样式
    35. """
    36. PatternFill(
    37. fill_type=None, # 设置填充样式: 'darkGrid', 'darkTrellis', 'darkHorizontal', 'darkGray', 'lightDown', 'lightGray', 'solid', 'lightGrid', 'gray125', 'lightHorizontal', 'lightTrellis', 'darkDown', 'mediumGray', 'gray0625', 'darkUp', 'darkVertical', 'lightVertical', 'lightUp'
    38. # '深色网格“,”深色网格“,”深色水平“,”深色灰色“,”浅色向下“,”浅灰色“,”纯色“,”浅色网格“,”灰色125“,”浅色水平“,”浅色网格“,”深色向下“,”中灰色“,”灰色0625“,”深色向上“,”深色垂直“,”浅色垂直“,”浅色向上“
    39. start_color=None# 设置填充颜色
    40. )
    41. """
    42. # 设置填充对象
    43. fill = PatternFill(fill_type='solid', start_color='FFC0CB')
    44. # 设置单元格的填充样式
    45. # 单元格对象.fill = 填充对象
    46. area = sheet['A1':'E1']
    47. for row in area:
    48. for _ in row:
    49. _.fill = fill # 调整填充格式
    50. # 4. 设置单元格对齐样式
    51. # 创建对象
    52. al = Alignment(
    53. horizontal='right', # 水平方向:center, left, right
    54. vertical='top', # 垂直方向: center, top, bottom
    55. )
    56. # 设置单元格的对齐方式
    57. sheet['B2'].alignment = al
    58. # 5. 设置边框样式
    59. # 设置边对象(四个边的边可以是一样的也可以不同,如果不同就创建对个Side对象)
    60. # border_style取值('dashDot','dashDotDot', 'dashed','dotted','double','hair', 'medium', 'mediumDashDot', 'mediumDashDotDot','mediumDashed', 'slantDashDot', 'thick', 'thin')
    61. # 单点划线,双点划线,点划线,双划线,头发,中划线,单点中划线,双点中划线,中划线,斜划线,粗划线,细划线
    62. side = Side(border_style='thin', color='000000')
    63. # 设置边框对象
    64. # left、right、top、bottom表示的是边框的四个边,四个边可以使用一个边对象
    65. bd = Border(left=side, right=side, top=side, bottom=side)
    66. # 设置单元格的边框
    67. area = sheet['A1':'E1']
    68. for row in area:
    69. for _ in row:
    70. _.border = bd
    71. # 6.设置单元格的宽度和高度
    72. # 设置列宽
    73. sheet.column_dimensions['A'].width = 10
    74. # 设置行高
    75. sheet.row_dimensions[1].height = 30
    76. # 7. 保存
    77. data.save(filename='data/体检表2.xlsx')

    运行结果:

    2.4 案例分析三:将列表数据写入excel中

    示例代码:

    1. import openpyxl
    2. import datetime
    3. datas = [
    4. ('学号', '姓名', '年龄', '专业', '考试时间'),
    5. ('B00001', '张1', 18, '语文', datetime.datetime(2019, 6, 18, 0, 0)),
    6. ('B00002', '张2', 19, '数学', datetime.datetime(2019, 6, 19, 0, 0)),
    7. ('B00003', '张3', 20, '英语', datetime.datetime(2019, 6, 20, 0, 0)),
    8. ('B00004', '张4', 21, '物理', datetime.datetime(2019, 6, 21, 0, 0)),
    9. ('B00005', '张5', 22, '化学', datetime.datetime(2019, 6, 22, 0, 0)),
    10. ('B00006', '张6', 23, '生物', datetime.datetime(2019, 6, 23, 0, 0)),
    11. ('B00007', '张7', 24, '历史', datetime.datetime(2019, 6, 24, 0, 0))
    12. ]
    13. # 创建空的Workbook对象
    14. w_data = openpyxl.Workbook()
    15. # 获取活动表
    16. sheet = w_data.active
    17. for i in range(1, len(datas) + 1):
    18. for j in range(1, 6):
    19. sheet.cell(row=i, column=j, value=datas[i - 1][j - 1])
    20. w_data.save('data/info.xlsx')

    运行结果:

    2.5 案例分析四:将列表数据写入excel中的多个sheet中,并设置标题行

    示例代码:

    1. import openpyxl
    2. import datetime
    3. datas = [
    4. ('B00001', '张1', 18, '语文', datetime.datetime(2019, 6, 18, 0, 0)),
    5. ('B00002', '张2', 19, '数学', datetime.datetime(2019, 6, 19, 0, 0)),
    6. ('B00003', '张3', 20, '英语', datetime.datetime(2019, 6, 20, 0, 0)),
    7. ('B00004', '张4', 21, '物理', datetime.datetime(2019, 6, 21, 0, 0)),
    8. ('B00005', '张5', 22, '化学', datetime.datetime(2019, 6, 22, 0, 0)),
    9. ('B00006', '张6', 23, '生物', datetime.datetime(2019, 6, 23, 0, 0)),
    10. ('B00007', '张7', 24, '历史', datetime.datetime(2019, 6, 24, 0, 0))
    11. ]
    12. # 创建空的Workbook对象
    13. w_data = openpyxl.Workbook()
    14. # 创建 sheet 对象
    15. sheet1 = w_data.active
    16. sheet1.title = 'Sheet1'
    17. sheet2 = w_data.create_sheet("Sheet2")
    18. sheet3 = w_data.create_sheet("Sheet3")
    19. # 添加标题行
    20. headers = ['学号', '姓名', '年龄', '专业', '考试时间']
    21. sheet1.append(headers)
    22. sheet2.append(headers)
    23. sheet3.append(headers)
    24. # 注意:添加了标题行,下面写入数据时,sheet.cell中的row要往下移动一行,否则会覆盖掉标题行
    25. # 将数据写入sheet1
    26. for i in range(1, len(datas) + 1):
    27. for j in range(1, 6):
    28. sheet1.cell(row=i + 1, column=j, value=datas[i - 1][j - 1])
    29. # 将数据写入sheet2
    30. for i in range(1, len(datas) + 1):
    31. for j in range(1, 6):
    32. sheet2.cell(row=i + 1, column=j, value=datas[i - 1][j - 1])
    33. # 将数据写入sheet3
    34. for i in range(1, len(datas) + 1):
    35. for j in range(1, 6):
    36. sheet3.cell(row=i + 1, column=j, value=datas[i - 1][j - 1])
    37. w_data.save('data/info.xlsx')

    运行结果:

  • 相关阅读:
    力扣练习——59 从二叉搜索树到更大和树
    记录一次远程仓库删除.idea文件,Git提交冲突问题
    Gateway--服务网关
    StorageReview公布浪潮固态硬盘与浪潮服务器性能测试报告
    部署elasticsearch需要调整的系统参数
    使用HTML制作静态网站:传统文化戏剧锡剧带psd设计图(2个页面)
    Arthas快速入门
    一篇文章让你入门【MySQL】
    两例典型的C++软件异常排查实例分享
    c4d和blender哪个简单?哪个好用?
  • 原文地址:https://blog.csdn.net/weixin_44799217/article/details/126861088