当前位置:   article > 正文

python第三方库——openpyxl_openpyxl官网

openpyxl官网

Bokeh是一个Python库,用于对Excel 2010 xlsx/xlsm/xltx/xltm文件进行读写操作。

官网对该工具的介绍为:

  1. openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files.
  2. It was born from lack of existing library to read/write natively from Python the Office Open XML format.
  3. All kudos to the PHPExcel team as openpyxl was initially based on PHPExcel.
官网地址为:https://foss.heptapod.net/openpyxl/openpyxl

本文档只说明某些接口的使用,作为对该工具的学习总结。

文件的打开,创建,保存

创建一个工作簿

  1. from openpyxl import Workbook
  2. wb = Workbook()

打开一个已经存在的工作簿

  1. from openpyxl import load_workbook
  2. wb = load_workbook('sample.xlsx')

在load_workbook()中存在几个可选参数:

  • data_only=True表示只读取单元格的值,而不是公式
  • read_only=True表示以只读模式打开Excel文件,这样可以提高读取速度
  • keep_vba=True表示保留Excel文件中的宏代码

保存为工作薄

wb.save('sample.xlsx')

创建一个工作表

  1. ws = wb.create_sheet("Mysheet") # insert at the end (default)
  2. ws = wb.create_sheet("Mysheet", 0) # insert at first position
  3. ws = wb.create_sheet("Mysheet", -1) # insert at the penultimate position

激活某个工作表

ws = wb.active

该值默认为0,除非手动修改活动工作表,否则通过该方法只会获取第一个工作表的引用。不然要明确指明激活的工作表,下面代码就是获取名字为new_sheet的工作表的引用:

ws = wb["new_sheet"]

重命名工作表

在使用Workbook创建工作簿时,会自动创建一个名为Sheet的工作表。并且在工作薄中创建的工作表会采用自动命名的形式,如Sheet1、Sheet2、Sheet3。如果需要对该名称进行修改,可以使用title属性进行修改,如下所示:

ws.title = "New Title"

获取工作薄中所有工作表的名称

wb.sheetnames

或者采用遍历工作薄的形式:

  1. for sheet in wb:
  2.     print(sheet.title)

复制工作表

new_ws = wb.copy_worksheet(ws)

单元格的操作

获取单元格的引用

  1. cell = ws["A4"]
  2. cell = ws.cell(row=4, column=1)

但需注意的是,ws["A4"]的引用方式和excel中单元格的表示方式相同,但是使用cell()方法时,row和column的索引都是从1开始的数字,而不是字母,这意味着,需要将A4转换为(4,1)。

获取单元格的值

  1. value = ws["A4"].value
  2. value = ws.cell(row=4, column=1).value

单元格赋值

  1. ws["A4"] = 10
  2. ws["A4"].value = 10
  3. ws.cell(row=4, column=1, value=10)

当创建工作薄时,虽然它包含一个工作表,但是该工作表中并不包含任何单元格。只有在访问单元格时,才会创建它们。因此使用ws.cell(row=4, column=1)虽然没有赋值,但是也会在内存中创建单元格,因此要尽量避免对空单元格的引用。

插入整行或整列、删除整行或整列

  1. ws.insert_rows(7, 3)            # 表示在原来idx=7的行前插入3行,默认一行
  2. ws.insert_cols(2, 3)            # 表示在原来idx=2的列前插入3列,默认一列
  3. ws.append([1, 2, 3])            # 表示在最后一行插入数据,不足的部分用None填充
  4. ws.delete_cols(6, 3)            # 表示删除idx=6的列,删除3列,默认一列
  5. ws.delete_rows(6, 3)            # 表示删除idx=6的行,删除3行,默认一行

访问整列或整行

  1. cells = ws["A"]              # 获取A列的所有单元格
  2. cells = ws[1]                # 获取第一行的所有单元格

访问矩形区域

  1. cells = ws["A:C"]       # 获取A到C列的所有单元格
  2. cells = ws[1:3]         # 获取第1到3行的所有单元格
  3. cells = ws["A1:C3"]     # 获取A1到C3的所有单元格

但需要注意,对于整列或整行的访问返回的是一维元组,而对于矩形区域的访问返回的是二维元组。因此,对于矩形区域的访问,需要使用两层循环来遍历。

或者可以通过ws.iter_rows()或ws.iter_cols()来获取单元格:

  1. for rows in ws.iter_rows():
  2.     for cell in rows:
  3.         print(cell.value)
  4. for cols in ws.iter_cols(min_row=1, max_col=3, max_row=2):
  5.     for cell in cols:
  6.         print(cell.value)
  7. for values in ws.iter_cols(min_row=1, max_col=3, max_row=2, values_only=True):
  8.     for value in values:
  9.         print(value)

从上面可以看出

  • iter_rows()和iter_cols()方法都可以接收min_row、max_row、min_col、max_col、values_only这四个参数
  • 这几个参数都是可选的,如果不指定,则默认为min_row=1、max_row=ws.max_row、min_col=1、max_col=ws.max_column,values_only=False
  • iter_rows()方法按行遍历,iter_cols()方法按列遍历
  • values_only = True表示只迭代值

另外ws.iter_rows()无参数的调用即可遍历所有行,ws.iter_cols()无参数的调用即可遍历所有列。等效于下面的用法:

  1. for rows in ws.rows:
  2. for cell in rows:
  3. print(cell.value)
  4. for cols in ws.columns:
  5. for cell in cols:
  6. print(cell.value)

不过因为性能问题,只读模式下ws.iter_cols()方法和ws.columns不可用。

而如果只是想要获取单元格中的内容,则可以使用ws.values:

  1. for values in ws.values:
  2.     for value in values:
  3.         print(value)

从结果可以看出,ws.values是按行迭代的。

移动区域

ws.move_range("D4:F10", rows=-1, cols=2)        # 表示将D4:F10的单元格向上移动一行,向右移动两列,即移动到E3:G9

合并/拆分单元格

  1. ws.merge_cells('A2:D2')
  2. ws.unmerge_cells('A2:D2')
  3. # 与下面的设置等效
  4. ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
  5. ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)

而对比合并后的单元格的格式设置,只需要对合并单元格的左上角单元格进行设置即可。

字体、颜色、样式

默认设置为:

  1. from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font
  2. font = Font(name='Calibri',
  3.                 size=11,
  4.                 bold=False,
  5.                 italic=False,
  6.                 vertAlign=None,
  7.                 underline='none',
  8.                 strike=False,
  9.                 color='FF000000')
  10. fill = PatternFill(fill_type=None,
  11.                 start_color='FFFFFFFF',
  12.                 end_color='FF000000')
  13. border = Border(left=Side(border_style=None,
  14.                           color='FF000000'),
  15.                 right=Side(border_style=None,
  16.                            color='FF000000'),
  17.                 top=Side(border_style=None,
  18.                          color='FF000000'),
  19.                 bottom=Side(border_style=None,
  20.                             color='FF000000'),
  21.                 diagonal=Side(border_style=None,
  22.                               color='FF000000'),
  23.                 diagonal_direction=0,
  24.                 outline=Side(border_style=None,
  25.                              color='FF000000'),
  26.                 vertical=Side(border_style=None,
  27.                               color='FF000000'),
  28.                 horizontal=Side(border_style=None,
  29.                                color='FF000000')
  30.                )
  31. alignment=Alignment(horizontal='general',
  32.                     vertical='bottom',
  33.                     text_rotation=0,
  34.                     wrap_text=False,
  35.                     shrink_to_fit=False,
  36.                     indent=0)
  37. protection = Protection(locked=True,
  38.                         hidden=False)

设置字体、颜色、大小

  1. from openpyxl.styles import Font
  2. # 斜体,红色,20号,字体为Arial,加粗
  3. ft = Font(name='Arial', size=20, bold=True, italic=True, color='FF0000')
  4. ws["A4"].font = ft
  5. wb.save('sample.xlsx')

设置单元格填充

  1. from openpyxl.styles import PatternFill
  2. # 红色填充
  3. ft = PatternFill(fill_type='solid', fgColor='FF0000')
  4. ws["A3"].fill = ft
  5. wb.save('sample.xlsx')

设置对齐方式

  1. from openpyxl.styles import Alignment
  2. # 左对齐,上对齐
  3. al = Alignment(horizontal='left', vertical='top')
  4. ws["A3"].alignment = al
  5. wb.save('sample.xlsx')

在选择对齐方式中:

  • horizontal的参数选择范围为:'fill', 'right', 'justify', 'general', 'distributed', 'center', 'centerContinuous', 'left'
  • vertical的参数选择范围为:'bottom', 'top', 'distributed', 'justify', 'center'

单元格边框

  1. from openpyxl.styles import Border, Side
  2. left_side = Side(border_style='thin', color='FF0000')
  3. right_side = Side(border_style='thin', color='00FF00')
  4. top_side = Side(border_style='thin', color='0000FF')
  5. bottom_side = Side(border_style='thin', color='FFFF00')
  6. ws["A3"].border = Border(left=left_side, right=right_side, top=top_side, bottom=bottom_side)
  7. wb.save('sample.xlsx')

border_style可以为:'dashDot', 'mediumDashDot', 'slantDashDot', 'thick', 'dashed', 'hair', 'mediumDashDotDot', 'medium', 'thin', 'dotted', 'double', 'mediumDashed', 'dashDotDot'

应用到整行或整列

  1. col = ws.column_dimensions['A']
  2. col.font = Font(bold=True)
  3. row = ws.row_dimensions[1]
  4. row.font = Font(underline="single")

列宽和行高

在openpyxl中,column_dimensions和rows_dimensions都是一个字典,key为列或行的索引,value为ColumnDimension或RowDimension对象。该对象为表格中每行或每列的信息,主要包括:

  • width 属性:获取或设置列的宽度。
  • hidden 属性:获取或设置列的隐藏状态。
  • bestFit 属性:获取或设置列的自动调整大小。
  • style 属性:获取或设置列的样式。
  • number_format 属性:获取或设置列的数字格式。
  1. col = ws.column_dimensions['A']
  2. col.width = 20.0
  3. col.hidden = False
  4. col.bestFit = True
  5. col.number_format = "0.00"
  6. row = ws.row_dimensions[1]
  7. row.height = 40.0
  8. row.hidden = False
  9. row.bestFit = True
  10. row.number_format = "0.00"

页面设置

工作表中页面设置可以通过page_setup属性进行设置,page_setup属性是一个PageSetup对象,该对象包含了页面设置的各种属性,如纸张大小、方向、页边距等。

以下是一些常用的 PageSetup 类的属性和方法:

  • orientation 属性:设置页面的方向,可以是 PageSetup.ORIENTATION_PORTRAIT(纵向)或 PageSetup.ORIENTATION_LANDSCAPE(横向)。
  • paperSize 属性:设置纸张大小,可以是预定义的常量,如 PageSetup.PAPERSIZE_A4。
  • leftMargin、rightMargin、topMargin、bottomMargin 属性:设置工作表的左、右、上、下页边距。
  • printArea 属性:设置打印区域。

示例代码如下:

  1. # 设置页面方向为横向
  2. ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE
  3. # 设置纸张大小为A4
  4. ws.page_setup.paperSize = ws.PAPERSIZE_A4
  5. # 设置边距
  6. ws.page_setup.leftMargin = 0.5
  7. ws.page_setup.rightMargin = 0.5
  8. ws.page_setup.topMargin = 0.5
  9. ws.page_setup.bottomMargin = 0.5
  10. # 设置打印区域
  11. ws.page_setup.printArea = 'A1:F20'
  12. # 保存工作簿
  13. wb.save("sample.xlsx")

样式保存

上面的格式配置可以保存为NamedStyle对象,然后应用到单元格上:

  1. from openpyxl.styles import NamedStyle
  2. my_style = NamedStyle(name='my_style')
  3. my_style.font = Font(bold=True, size=20)
  4. my_style.alignment = Alignment(horizontal='center', vertical='center')
  5. wb.add_named_style(my_style)        # 创建样式后,可以将该样式注册到工作簿中
  6. # ws["A1"].style = my_style           # 将样式赋值给单元格也可以完成自动注册
  7. # 注册完成后,就可以通过以下方式直接使用样式
  8. ws["A1"].style = "my_style"

内建样式

openpyxl中还存在很多内建样式,用户可以直接通过样式名称使用,详情可查看openpyxl.styles.builtins。

‘Normal’:就是无样式

Number formats:

  • ‘Comma’
  • ‘Comma [0]’
  • ‘Currency’
  • ‘Currency [0]’
  • ‘Percent’

Informative:

  • ‘Calculation’
  • ‘Total’
  • ‘Note’
  • ‘Warning Text’
  • ‘Explanatory Text’

Text styles:

  • ‘Title’
  • ‘Headline 1’
  • ‘Headline 2’
  • ‘Headline 3’
  • ‘Headline 4’
  • ‘Hyperlink’
  • ‘Followed Hyperlink’
  • ‘Linked Cell’

Comparisons:

  • ‘Input’
  • ‘Output’
  • ‘Check Cell’
  • ‘Good’
  • ‘Bad’
  • ‘Neutral’

Highlights:

  • ‘Accent1’
  • ‘20 % - Accent1’
  • ‘40 % - Accent1’
  • ‘60 % - Accent1’
  • ‘Accent2’
  • ‘20 % - Accent2’
  • ‘40 % - Accent2’
  • ‘60 % - Accent2’
  • ‘Accent3’
  • ‘20 % - Accent3’
  • ‘40 % - Accent3’
  • ‘60 % - Accent3’
  • ‘Accent4’
  • ‘20 % - Accent4’
  • ‘40 % - Accent4’
  • ‘60 % - Accent4’
  • ‘Accent5’
  • ‘20 % - Accent5’
  • ‘40 % - Accent5’
  • ‘60 % - Accent5’
  • ‘Accent6’
  • ‘20 % - Accent6’
  • ‘40 % - Accent6’
  • ‘60 % - Accent6’
  • ‘Pandas’

图表

图表实际使用的并不多,这里只是简单介绍一下,详细的可以参考官方文档。

  1. from openpyxl.chart import BarChart, Series, Reference
  2. # 创建一个柱状图,指定图表类型为col,标题为Bar Chart,横坐标为time,纵坐标为value
  3. chart = BarChart()
  4. chart.type = "col"
  5. chart.title = "Bar Chart"
  6. chart.x_axis.title = 'time'
  7. chart.y_axis.title = 'value'
  8. chart.legend = None
  9. # 设置数据来源
  10. data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=6)
  11. cats = Reference(ws, min_col=1, min_row=2, max_row=6)
  12. # 将数据添加到图表中
  13. chart.add_data(data, titles_from_data=True)
  14. chart.set_categories(cats)
  15. # 将图表添加到E1单元格中
  16. ws.add_chart(chart, "E1")
  17. wb.save('sample.xlsx')

上面内容只是对openpyxl的一些常见的部分进行了简单的介绍,其他更多内容,如过滤、排序、数据有效性验证等,可以参考官方文档。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/907514
推荐阅读
相关标签
  

闽ICP备14008679号