在以前的推文中,我们介绍了操作Excel的模块openpyxl的入门知识,相关推文可以从本公众号的底部相关菜单获取。接下来的推文我们来学习一下openpyxl这个python模块中的其他知识,本次推文我们来学习一下单元格(cell)操作的相关知识。
1.读取和设置单元格内容
上篇关于openpyxl的推文中我们介绍了一些基础的操作,也包含了读取和设置单元格内容的操作。我们先复习一下,假设现在有一个“cell_operation.xlsx”文件,文件中的数据如下:
我们来进行读取和设置单元格内容的操作:
from openpyxl import *wb = load_workbook('cell_operation.xlsx')ws = wb['Sheet1']cell_value_1 = ws.cell(column=1, row=1).valueset_value_1 = ws.cell(column=1, row=9).value = 8set_value_2 = ws.cell(column=1, row=10).value = '9'print('cell_value_1:',cell_value_1)wb.save('cell_operation.xlsx')wb.close()
第四行到第六行代码是读取和设置单元格的操作,其中第四行代码为读取该单元格的内容,第五到第六行代码是用来设置单元格内容的,运行后Excel文件的结果如下:
我们可以看到单元格A10中的数据是文本格式的,这第五行代码设置值的时候是一致的。现在,我们还有一种方式的进行设置:
ws.cell(column=2, row=9, value="{0}".format(get_column_letter(1)))
这个方式设置的结果是B9单元格被设置了文本“A”。也就是说函数
get_column_letter将对应的数字转为字母letter,也就是单元格列字母,当然还有一种方式也可以进行设置,使用ASCII值进行获取:
letter = chr(i + 65) # 由ASCII值获得对应的列字母
设置超链接:超链接设置也十分常用,比如在C3单元格进行设置一个超链接:
ws.cell(3,3).hyperlink = ''
接下来我们查看一个单元格常见的属性值看看:
print(ws.cell(column=2, row=9).column_letter)print(ws.cell(column=2, row=9).coordinate)print(ws.cell(column=2, row=9).col_idx)print(ws.cell(column=2, row=9).encoding)print(ws.cell(column=2, row=9).offset)print(ws.cell(column=2, row=9).is_date)print(ws.cell(column=2, row=9).data_type)
输出结果为:BB92utf-8<bound method Cell.offset of >Falses
上述代码的输出我这里就不再进行解释了。输出的结果是一些Cell的属性,除了这些属性还有一些其他的属性如:
cell.has_style、cell.style、cell.style_id、cell.font、cell.alignment
cell.border、cell.fill、cell.number_format、cell.hyperlink
具体的这些属性的实现和意义大家可以在openpyxl中的Cell类中找到相应的解释。
上述就是一些常见的属性值,大家在工程中没有找到自己想要的就去源码类中人去寻找,后面的例子中也会使用到这些属性值,到时候我们可以在稍介绍一些。
注:在cell的方法中,有一个read_only类。如:
from openpyxl.cell import read_onlys_value = read_only.ReadOnlyCell( 'Sheet1', row=2, column=2, value=3, data_type='n')print(s_value.value)print(s_value.internal_value)
很显然这是只读模式下使用的,那么上述代码输出什么大家自己研究。
2.设置单元格宽度和高度
在实际的工作中,有时候我们需要对单元格的大小(即高度和宽度进行设置)。那么这个该怎么实现呢?假设现在我们需要对单元格的宽度和高度进行调整,调整的方式如下:我们以A1单元格为例:
# 调整列宽ws.column_dimensions['A'].width = 20.0# 调整行高ws.row_dimensions[1].height = 40
这种设置还是非常简单的也是非常常见的。如果我们需要对不同的单元格进行设置我们使用for循环就可以了。
那么自适应的单元格该怎么设置呢?
关于这个自适应的单元格size的设置,本人没有找到可以直接使用的API,但是想到一个大概的方法:遍历列,找到最长的字符串,然后据此设置列的宽。这里我也正好给大家分享一个上一位开发者提供的代码:
def adjust_column_dimension(ws, min_row, min_col, max_col):column_widths = []for i, col in enumerate(ws.iter_cols(min_col=min_col, max_col=max_col, min_row=min_row)):for cell in col:value = cell.valueif value is not None:if isinstance(value, str) is False:value = str(value)try:column_widths[i] = max(column_widths[i], len(value))except IndexError:column_widths.append(len(value))for i, width in enumerate(column_widths):col_name = get_column_letter(min_col + i)value = column_widths[i] + 2ws.column_dimensions[col_name].width = value# 使用 adjust_column_dimension(ws, 1,1, ws.max_column)
稍微解释一下代码里面为什么使用了一个try-except呢?这个问题也比较简单,那么也留给大家思考咯!
3.合并单元格
合并单元格在日常中也是非常常见的,合并单元格有两种方式:
ws.merge_cells("A1:B1")ws.merge_cells(start_column=3,end_column=5,start_row=3,end_row=5)print(ws.merged_cells)# A1:B1 C3:E5print(ws.merged_cell_ranges)# [<MergedCellRange A1:B1>, <MergedCellRange C3:E5>]
第一行代码直接使用单元格样式指出需要合并的单元格,第二行代码则是使用行列的方式来指明需要合并的单元格,第三行代码输出我们已经合并的单元格:A1:B1 C3:E5。第四行代码输出我们已经合并的单元格所组成的列表。
4.单元格样式设置
单元格常见的样式设置主要为:Font 字体、Side 边线、Border 边框、PatternFill 填充、Aignment 对齐的设置。
假设我们的数据样例为:
(一)接下来我们来进行Font的设置,代码如下
from openpyxl import*from openpyxl.styles import PatternFill, Font, Alignment, Border, Sidewbook = load_workbook("cell_property_sets.xlsx")wsheet = wbook['Sheet1']font = Font(name='微软雅黑',size=11,color='FF000000',bold=True,italic=True,vertAlign='baseline',underline='double',strike=False)wsheet['A2'].font = fontwbook.save("cell_property_sets.xlsx")wbook.close()
设置后的结果如下,显然单元格A2被设置为我们想要设置的值,上述代码的设置的一些含义或属性为:字体名称、字体大小、字体颜色、加粗、斜体、垂直对齐方式、下划线、删除线。
(二)接下来我们来进行Border和Side的设置,代码如下:
from openpyxl import*from openpyxl.styles import PatternFill, Font, Alignment, Border, Sidewbook = load_workbook("cell_property_sets.xlsx")wsheet = wbook['Sheet1']side_type = Side(border_style='mediumDashDot',color='FF000000')border = Border(left=side_type,right=side_type,top=side_type,bottom=side_type,diagonal=side_type,diagonal_direction=30,outline=side_type,vertical=side_type,horizontal=side_type)wsheet['A3'].border = borderwbook.save("cell_property_sets.xlsx")wbook.close()
A3单元格设置后的样式如下:
其中属性值border_style的值在源代码中给出了以下几种,大家可以试验一下,看看设置不同的值会有什么样的效果。
(三)接下来我们来进行PatternFill填充的设置,代码如下:
from openpyxl import*from openpyxl.styles import PatternFill, Font, Alignment, Border, Sidewbook = load_workbook("cell_property_sets.xlsx")wsheet = wbook['Sheet1']fill = PatternFill(fill_type = 'darkDown',start_color='A6DA70D6',end_color='000000')wsheet['A4'].fill = fillwbook.save("cell_property_sets.xlsx")wbook.close()
设置结果如下:
这里有一些说明:
首先是参数fill_type,这个参数是填充的类型,openpyxl提供了以下几种属性。
值的注意的是如果fill_type为None,则后续的参数都是不生效的。另外start_color代表前景色,这些颜色都是十六进制的aRGB颜色,a代表透明度。如果想要纯色填充的话可以就可以使用用fill_type = solid,然后使用前景色就可以了。
为方便大家使用颜色填充,这里对颜色的选择做出一个小的说明:
首先十六进制颜色码大家可以直接搜索相关的网站(或百度)就可以获取到,比如以下这个网页链接:/yingyong/yanse-rgb-16/
然后透明度怎么设置呢?这给出一个表:(透明度和对应的值,其中100%为完全不透明)
假设现在我们有一个DA70D6十六进制颜色码,在其头部拼上一个透明度如B3,则这个aRGB颜色的值为:B3DA70D6。还是很简单的。
(四)接下来我们来进行Aignment 填充的设置,代码如下:
from openpyxl import*from openpyxl.styles import PatternFill, Font, Alignment, Border, Sidewbook = load_workbook("cell_property_sets.xlsx")wsheet = wbook['Sheet1']align = Alignment(horizontal='center',vertical='center',text_rotation=0,wrap_text=True,shrink_to_fit=True,indent=0)wsheet['A6'].alignment = alignwbook.save("cell_property_sets.xlsx")wbook.close()
参数说明:
# Horizontal:水平方向,左对齐left,居中center对齐和右对齐right可选。
# Vertical:垂直方向,有居中center,靠上top,靠下bottom,两端对齐justify等可选。
# text_rotation:文本旋转度。
# wrap_text:自动换行
# Indent:缩进。
注:单元格的属性是可以复制的,如:
from openpyxl.styles import Fontfsheet1 = Font(name='Arial', size=10)# 复制时指定字体为“微软雅黑”,其他属性来自fsheet1fsheet2 = fsheet1.copy(name="微软雅黑")
(五)接下来我们来进行单元格数字格式设置,代码如下:
单元格的数字格式也是常见的,大家可以在openpyxl中的numbers.py文件中找到数字的格式,这里贴一些:
from openpyxl import*from openpyxl.styles import PatternFill, Font, Alignment, Border, Sidewbook = load_workbook("cell_property_sets.xlsx")wsheet = wbook['Sheet1']wsheet['A9'].number_format = 'd-mmm-yy'wbook.save("cell_property_sets.xlsx")wbook.close()
设置后的结果如下:
5.总结
以上就是本次的推文,推文介绍的内容比较简单,大家跟着学习的时候最好也跟着实践一下。后期我们将继续介绍其他方面的知识。比如在Excel中使用公式,进行表格的数据的过滤等操作。大家在学习的时候有什么疑问,也欢迎在评论区留言。