最详细的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
<bound method Cell.offset of >
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)
# [<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, 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中使用公式,进行表格的数据的过滤等操作。大家在学习的时候有什么疑问,也欢迎在评论区留言。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容