最详细的Excel模块Openpyxl教程(二)-单元格操作详解

在以前的文章中,我们介绍了操作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).value
set_value_1 = ws.cell(column=1, row=9).value = 8
set_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 = 'www.baidu.com'

接下来我们查看一个单元格常见的属性值看看:

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)
输出结果为:
B
B9
2
utf-8

False
s

上述代码的输出我这里就不再进行解释了。输出的结果是一些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_only
s_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,但是想到一个大概的方法:遍历列,找到最长的字符串,然后据此设置列的宽。这里我也正好给大家分享一个http://stackoverflow.com上一位开发者提供的代码:

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.value
            if 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] + 2
        ws.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:E5
print(ws.merged_cell_ranges)
# [, ]

第一行代码直接使用单元格样式指出需要合并的单元格,第二行代码则是使用行列的方式来指明需要合并的单元格,第三行代码输出我们已经合并的单元格:A1:B1 C3:E5。第四行代码输出我们已经合并的单元格所组成的列表。

4.单元格样式设置

单元格常见的样式设置主要为:Font 字体、Side 边线、Border 边框、PatternFill 填充、Aignment 对齐的设置。

假设我们的数据样例为:

(一)接下来我们来进行Font的设置,代码如下

from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side

wbook = 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 = font
wbook.save("cell_property_sets.xlsx")
wbook.close()

设置后的结果如下,显然单元格A2被设置为我们想要设置的值,上述代码的设置的一些含义或属性为:字体名称、字体大小、字体颜色、加粗、斜体、垂直对齐方式、下划线、删除线。

(二)接下来我们来进行Border和Side的设置,代码如下:

from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
wbook = 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 = border
wbook.save("cell_property_sets.xlsx")
wbook.close()

A3单元格设置后的样式如下:


其中属性值border_style的值在源代码中给出了以下几种,大家可以试验一下,看看设置不同的值会有什么样的效果。


(三)接下来我们来进行PatternFill填充的设置,代码如下:

from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
wbook = load_workbook("cell_property_sets.xlsx")
wsheet = wbook['Sheet1']
fill = PatternFill(fill_type = 'darkDown',start_color='A6DA70D6',end_color='000000')
wsheet['A4'].fill = fill
wbook.save("cell_property_sets.xlsx")
wbook.close()
image.gif

设置结果如下:

这里有一些说明:

首先是参数fill_type,这个参数是填充的类型,openpyxl提供了以下几种属性。

值的注意的是如果fill_type为None,则后续的参数都是不生效的。另外start_color代表前景色,这些颜色都是十六进制的aRGB颜色,a代表透明度。如果想要纯色填充的话可以就可以使用用fill_type = solid,然后使用前景色就可以了。

为方便大家使用颜色填充,这里对颜色的选择做出一个小的说明:

首先十六进制颜色码大家可以直接搜索相关的网站(或百度)就可以获取到,比如以下这个网页链接:https://www.sioe.cn/yingyong/yanse-rgb-16/

然后透明度怎么设置呢?这给出一个表:(透明度和对应的值,其中100%为完全不透明)

假设现在我们有一个DA70D6十六进制颜色码,在其头部拼上一个透明度如B3,则这个aRGB颜色的值为:B3DA70D6。还是很简单的。

(四)接下来我们来进行Aignment 填充的设置,代码如下:

from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
wbook = 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 = align
wbook.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 Font
fsheet1 = Font(name='Arial', size=10)
# 复制时指定字体为“微软雅黑”,其他属性来自fsheet1
fsheet2 = fsheet1.copy(name="微软雅黑")

(五)接下来我们来进行单元格数字格式设置,代码如下:

单元格的数字格式也是常见的,大家可以在openpyxl中的numbers.py文件中找到数字的格式,这里贴一些:

from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
wbook = 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中使用公式,进行表格的数据的过滤等操作。大家在学习的时候有什么疑问,也欢迎在评论区留言。

你可能感兴趣的:(最详细的Excel模块Openpyxl教程(二)-单元格操作详解)