国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Python操作Excel文件(3):優(yōu)雅干將openpyxl | silaoA的博客
本文共4000余字,預(yù)計(jì)閱讀時(shí)間16分鐘,本文同步發(fā)布于知乎專欄和微信公眾號(hào)平臺(tái)。
關(guān)注學(xué)習(xí)了解更多的Cygwin、Linux、Python技術(shù)。
openpyxl誕生于Python生態(tài)中缺乏原生讀寫Office Open XML格式文件(也就是xlsx格式)的背景下,由一群志愿者在業(yè)余時(shí)間開發(fā)維護(hù),項(xiàng)目地址http://bitbucket.org/openpyxl/openpyxl。相較pyexcel、xlrd/xlwt/xlutils,openpyxl對(duì)Excel的功能支持更加豐富,同時(shí)在實(shí)現(xiàn)上又十分優(yōu)雅,操作邏輯與直接用Excel軟件接近,運(yùn)行效率也很高,堪稱Excel文件操作的優(yōu)雅干將。
本文所用openpyxl版本為3.0,舊版本可能部分API有所不同。
0x00 讀文件
openpyxl設(shè)計(jì)比pyexcel、xlrd/xlwt/xlutils,openpyxl更復(fù)雜一點(diǎn),包下有workbook、worksheet、cell、formattint、chart、formula等子包,功能劃分清晰,實(shí)現(xiàn)了openpyxl.workbook.workbook.Workbook(以下簡稱Workbook)、openpyxl.worksheet.worksheet.Worksheet(以下簡稱Worksheet)和openpyxl.cell.cell.Cell(以下簡稱Cell)類型,與Excel中的工作簿、表單、單元格概念相對(duì)應(yīng)。讀寫Excel文件,就是圍繞這3種對(duì)象開展。
API
openpyxl對(duì)外的API十分簡練,加載已有表格文件就1個(gè)函數(shù)——load_workbook,返回Workbook對(duì)象,總共接收5個(gè)參數(shù):
filename,必選參數(shù),指定要打開的Excel文件路徑;
read_only,默認(rèn)參數(shù),指定是否只讀,默認(rèn)False,如果不需要編輯內(nèi)容可設(shè)為True;
keep_vba,默認(rèn)參數(shù),指定是否保留VBA內(nèi)容,但即使保留也不能使用,默認(rèn)False;
data_only,默認(rèn)參數(shù),指定含公式的單元格保留公式內(nèi)容還是公式值,默認(rèn)False;
keep_links,默認(rèn)參數(shù),指定單元格中的外部鏈接是否保存,默認(rèn)True。
示例
假使當(dāng)前路徑下,樣例文件名稱是data.xlsx,有3個(gè)表單,僅Sheet1有數(shù)據(jù),內(nèi)容如下圖,其中C列2行是公式,sum(A2,B2),C列3行是日期,A列4行是TRUE。
data.xlsx Sheet1
可按下述示例代碼加載文件。
1
2
3
4
5
6
7
8
9
10
11
import openpyxl # 導(dǎo)入包
In [5]: bk = openpyxl.load_workbook('./data.xlsx')
In [6]: type(bk)
Out[6]: openpyxl.workbook.workbook.Workbook
In [7]: bk?
Type: Workbook
String form: <openpyxl.workbook.workbook.Workbook object at 0x000001F51B0F7128>
File: d:\program files\python36\lib\site-packages\openpyxl\workbook\workbook.py
Docstring: Workbook is the container for all other parts of the document.
0x01 數(shù)據(jù)訪問
索引表單
讀入Excel文件拿到Workbook后,下一步就是定位到Worksheet。Workbook類對(duì)象有幾個(gè)重要的屬性和方法,用于索引Sheet。
active屬性,指代工作簿中的激活表單,也就是保存前最后操作的表單;
get_active_sheet方法,作用與active屬性相同,已廢棄,建議直接用active屬性;
sheetnames屬性,即工作簿中所有表單的名稱所組成的列表;
get_sheet_names方法,作用與sheetnames屬性相同,已廢棄,建議直接用sheetnames屬性;
get_sheet_by_name方法,使用名稱索引表單,已廢棄,建議直接用名稱作關(guān)鍵字,按字典的方式索引,可以說相當(dāng)優(yōu)雅了;
index、get_index方法,均用于指示W(wǎng)orksheet對(duì)象的序號(hào),后者已廢棄,建議用index方法。
Workbook類對(duì)象還支持直接for循環(huán)迭代,遍歷Worksheet對(duì)象。
比較詭異的是,Workbook類對(duì)象給表單分配了序號(hào),卻不支持通過序號(hào)索引表單,也沒有 get_sheet_by_index 方法,官方認(rèn)為用名稱作關(guān)鍵字、按字典的方式索引更自然。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
In [8]: bk.active # 建議使用
Out[8]: <Worksheet "Sheet1">
In [9]: bk.get_active_sheet()
D:\Program Files\Python36\Scripts\ipython3:1: DeprecationWarning: Call to deprecated function get_active_sheet (Use the .active property).
Out[9]: <Worksheet "Sheet1">
In [10]: bk.sheetnames # 建議使用
Out[10]: ['Sheet1', 'Sheet2', 'Sheet3']
In [11]: bk.get_sheet_names()
D:\Program Files\Python36\Scripts\ipython3:1: DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
Out[11]: ['Sheet1', 'Sheet2', 'Sheet3']
In [12]: sh1 = bk.get_sheet_names('Sheet1')
D:\Program Files\Python36\Scripts\ipython3:1: DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
In [13]: sh1 = bk.get_sheet_by_name('Sheet1')
D:\Program Files\Python36\Scripts\ipython3:1: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
In [14]: sh2 = bk['Sheet2']
In [15]: sh4 = bk['Sheet4'] # 不存在的名字作關(guān)鍵字,報(bào)錯(cuò)
-----------------------------------------------------
KeyError Traceback (most recent call last)
KeyError: 'Worksheet Sheet4 does not exist.'
In [18]: bk.index(sh1) # 建議使用
Out[18]: 0
In [19]: bk.get_index(sh2)
D:\Program Files\Python36\Scripts\ipython3:1: DeprecationWarning: Call to deprecated function get_index (Use wb.index(worksheet)).
Out[19]: 1
索引單元格
拿到Worksheet對(duì)象后,下一步就是要索引行/列/單元格,并讀取數(shù)據(jù),openpyxl中行/列只不過是Cell對(duì)象組成的元組。Worksheet類對(duì)象有幾個(gè)重要的屬性和方法,用于支持后續(xù)操作。
title屬性,指示表單名稱;
dimensions屬性,指示表單中單元格的范圍,風(fēng)格與Excel一致;
calculate_dimension方法,作用與dimensions屬性相同;
min_row、max_row、min_column、max_column屬性,指示表單當(dāng)前最小、最大的行序號(hào)和列序號(hào),注意行列序號(hào)從1起始,可以說非常人性化了;
cell方法,一共接受3個(gè)參數(shù),前2個(gè)是必選參數(shù),指定行、列序號(hào),第3個(gè)是可選參數(shù),指定單元格的值,由此索引或創(chuàng)建1個(gè)Cell對(duì)象;
rows、columns屬性,按行(列)順序組織的Cell對(duì)象生成器;
iter_rows、iter_cols,接受5個(gè)參數(shù),前4個(gè)參數(shù)指定最小、最大行(列)序號(hào)和列(行)序號(hào),劃出單元格范圍,第5個(gè)參數(shù)values_only指示是否僅返回值,默認(rèn)False,返回按行(列)排序的單元格生成器;
除了上述cell、iter_rows、iter_cols方法,Worksheet對(duì)象支持通過切片方式索引單元格,返回嵌套元組,既接受行(列)序號(hào)的形式,也接受Excel風(fēng)格地址的形式,而且不必區(qū)分大小寫(說的就是xlrd/xlwt,必須大寫,小寫錯(cuò)誤)。無論切片方式索引或調(diào)用iter_rows、iter_cols方法,返回的是可迭代對(duì)象,可以直接用在for循環(huán)迭代中,可謂相當(dāng)優(yōu)雅。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
In [23]: sh1.dimensions
Out[23]: 'A1:C5'
In [24]: sh1.max_row,sh1.max_column
Out[24]: (5, 3)
In [25]: sh1.min_row,sh1.min_column
Out[25]: (1, 1)
In [27]: sh1.title
Out[27]: 'Sheet1'
In [32]: sh1.cell(3,2) # 第3行B列
Out[32]: <Cell 'Sheet1'.B3>
In [33]: sh1['B3'] # 第3行B列
Out[33]: <Cell 'Sheet1'.B3>
# A2至B3,按行排序,結(jié)果可直接用在for循環(huán)中,如 for row in sh1['A2':'B3']
In [34]: sh1['A2':'B3']
Out[34]:
((<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>),
(<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>))
# 第2至4行,注意4也包括在內(nèi),結(jié)果可直接用在for循環(huán)中,如 for row in sh1[2:4]
In [35]: sh1[2:4]
Out[35]:
((<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>),
(<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>),
(<Cell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>))
# A2至B3,按行排序,結(jié)果可直接用在for循環(huán)中,如 for row in sh1.iter_rows(2,3,1,2)
In [37]: tuple(sh1.iter_rows(2,3,1,2))
Out[37]:
((<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>),
(<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>))
# A2至B3,按列排序,結(jié)果可直接用在for循環(huán)中,如 for col in sh1.iter_cols(1,2,2,3)
In [39]: tuple(sh1.iter_cols(1,2,2,3))
Out[39]:
((<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.A3>),
(<Cell 'Sheet1'.B2>, <Cell 'Sheet1'.B3>))
In [40]: sh1.iter_cols(1,2,2,3) # A2至B3,返回生成器
Out[40]: <generator object Worksheet._cells_by_col at 0x000001F51BB0D830>
讀取單元格的值
Cell類對(duì)象有個(gè)value屬性,指示單元格的值,除此外還有類型、顯示、風(fēng)格等屬性值得關(guān)注。
row、column屬性,指示單元格的行列序號(hào);
column_letter屬性,指示單元格列名稱;
coordinate屬性,指示單元格Excel風(fēng)格的地址名稱;
data_type屬性,指示單元格value的類型,openpyxl中分類如下圖;
internal_value屬性,值在openpyxl內(nèi)部表示;
hyperlink屬性,單元格指向的外部鏈接;
is_date屬性,指示是否為日期。
openpyxl單元格值類型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
In [44]: cC3 = sh1['C3'] # C3單元格
In [45]: cA4 = sh1['A4'] # A4單元格
In [46]: cC3.row,cC3.column
Out[46]: (3, 3)
In [47]: cA4.row, cA4.column
Out[47]: (4, 1)
In [48]: cA4.column_letter, cA4.coordinate
Out[48]: ('A', 'A4')
In [50]: cA4.data_type, cC3.data_type
Out[50]: ('b', 'd')
# 注意含公式的單元格,返回是公式字符串,不是求值
In [53]: sh1['c2'].value # 單元格地址小寫也不影響
Out[53]: '=SUM(A2,B2)'
In [54]: sh1['B2'].value
Out[54]: 3
In [56]: sh1['c2'].internal_value
Out[56]: '=SUM(A2,B2)'
In [57]: cC3.internal_value
Out[57]: datetime.datetime(2019, 1, 1, 0, 0)
In [58]: cC3.is_date
Out[58]: True
In [59]: cC3.style_id,cC3.style
Out[59]: (2, '常規(guī)')
In [60]: cC3.font, cC3.fill # 字體和填充對(duì)象較復(fù)雜
Out[60]:
(<openpyxl.styles.fonts.Font object>
Parameters:
name='宋體', charset=134, family=None, b=False, i=False, strike=None, outline=None,
shadow=None, condense=None, color=None, extend=None, sz=12.0, u=None, vertAlign=None, scheme=None,
<openpyxl.styles.fills.PatternFill object>
Parameters:
patternType=None, fgColor=<openpyxl.styles.colors.Color object>
Parameters:
rgb='00000000', indexed=None, auto=None, theme=None, tint=0.0, type='rgb', bgColor=<openpyxl.styles.colors.Color object>
Parameters:
rgb='00000000', indexed=None, auto=None, theme=None, tint=0.0, type='rgb')
除了通過value屬性獲取單元格的值,還可以在迭代時(shí)明確僅返回值,也就是Worksheet對(duì)象的iter_rows、iter_cols方法第5個(gè)參數(shù)設(shè)為True。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 按行遍歷,生成器轉(zhuǎn)換為元組
In [63]: tuple(sh1.iter_rows(sh1.min_row,sh1.max_row,sh1.min_column,sh1.max_column, True))
Out[63]:
(('列A', '列B', '列C'),
(1, 3, '=SUM(A2,B2)'),
(0.5, -100, datetime.datetime(2019, 1, 1, 0, 0)),
(True, -0.2, 0),
('A5', None, None))
# 按列迭代,訪問單元格的值
In [64]: for col in sh1.iter_cols(sh1.min_column,sh1.max_column,sh1.min_row,sh1.max_row,True):
for val in col:
print(val)
列A
1
0.5
True
A5
列B
3
-100
-0.2
None
列C
=SUM(A2,B2)
2019-01-01 00:00:00
0
None
0x02 改寫文件
流程概述
基本流程包括:
創(chuàng)建工作簿,即Workbook對(duì)象;
向Workbook對(duì)象中增加、刪除Worksheet對(duì)象,也可直接索引需要編輯的Worksheet;
編輯Worksheet對(duì)象,包括對(duì)單元格賦值,單元格合并、分拆,設(shè)置單元格風(fēng)格,增加、刪除行(列),插入圖片、圖表等;
保存Workbook對(duì)象至xlsx格式文件。
創(chuàng)建工作簿
load_workbook函數(shù)從已有Excel文件基礎(chǔ)上創(chuàng)建,前文已描述。
Workbook函數(shù)創(chuàng)建新的工作簿,有2個(gè)可選參數(shù):
write_only,指示是否僅寫入,默認(rèn)False;
iso_dates,指示日期格式,默認(rèn)False。1
2
3
4
5
6
7
In [67]: bk2 = openpyxl.Workbook() # 創(chuàng)建新工作簿
In [68]: bk2.sheetnames # 默認(rèn)帶了1個(gè)表單
Out[68]: ['Sheet']
In [69]: bk2.active
Out[69]: <Worksheet "Sheet">
創(chuàng)建、刪除表單
openpyxl中除了Worksheet類,還有個(gè)Chartsheet類,文檔對(duì)其如何使用描述不多,Workbook對(duì)象的create_sheet、create_chartsheet方法,分別用于創(chuàng)建這2種表單,均接受2個(gè)可選參數(shù):
title,指定表單名稱,默認(rèn)None;
index,指定表單序號(hào),默認(rèn)None,默認(rèn)插在最后,0為最前,負(fù)數(shù)表示逆序位置。
Workbook對(duì)象還有個(gè)copy_worksheet方法用于復(fù)制表單,但僅限于復(fù)制同一個(gè)工作簿內(nèi)的表單,不可跨Workbook對(duì)象,而且表單內(nèi)圖片、圖表均忽略,接受1個(gè)必選參數(shù),即源Worksheet對(duì)象,該Workbook自動(dòng)將復(fù)制的表單插在最后。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
In [74]: bk2.create_sheet('表單A')
Out[74]: <Worksheet "表單A">
In [75]: bk2.active # 激活表單并未變化
Out[75]: <Worksheet "Sheet">
In [76]: bk2.index(bk2['表單A']) # 遞增分配序號(hào)
Out[76]: 1
In [77]: bk2.index(bk2.active)
Out[77]: 0
In [78]: bk2['表單A'].title = 'sheetA' # 通過賦值修改表單名稱
In [79]: bk2.sheetnames
Out[79]: ['Sheet', 'sheetA']
# sh1是前文In [13]賦值的表單,即data.xlsx中Sheet1
In [81]: sh1cp = bk.copy_worksheet(sh1)
In [82]: bk.sheetnames # 默認(rèn)插在最后
Out[82]: ['Sheet1', 'Sheet2', 'Sheet3', 'Sheet1 Copy']
In [83]: sh1cp.title # 默認(rèn)分配的名稱
Out[83]: 'Sheet1 Copy'
Workbook對(duì)象的remove、remove_sheet方法均可刪除表單對(duì)象,后者已廢棄,建議用前者,僅接受1個(gè)必選參數(shù),即要?jiǎng)h除的Worksheet對(duì)象。這是xlwt所不具備的。
1
2
3
4
5
6
7
8
9
In [92]: bk2.remove(bk2['Sheet'])
In [93]: bk2.sheetnames
Out[93]: ['sheetA']
In [94]: bk.remove(bk['Sheet2'])
In [95]: bk.sheetnames
Out[95]: ['Sheet1', 'Sheet3', 'Sheet1 Copy']
編輯數(shù)據(jù)
Worksheet對(duì)象支持通過賦值直接改寫單元格,可以寫入數(shù)字、字符串、日期、公式等等,merge_cells、unmerge_cells可以合并、拆分單元格,整個(gè)操作基本和Excel軟件的邏輯相近。支持的公式放在openpyxl.utils.FORMULAE變量中,當(dāng)前3.0版本支持352個(gè)公式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
In [97]: for cx in range(2,4):
col = openpyxl.utils.get_column_letter(cx)
sh1[col+'5'] = col+'5' # 第5行B、C列寫入字符串
In [100]: sh1['A5'] = '=SUM(A1:A4)' # 寫入公式
In [101]: import datetime
In [102]: sh1['B1'] = datetime.datetime(2019,12,31) # 寫入日期
In [103]: sh1['C1'] = -0.0001
In [104]: tuple(sh1.values)
Out[104]:
(('列A', datetime.datetime(2019, 12, 31, 0, 0), -0.0001),
(1, 3, '=SUM(A2,B2)'),
(0.5, -100, datetime.datetime(2019, 1, 1, 0, 0)),
(True, -0.2, 0),
('=SUM(A1:A4)', 'B5', 'C5'))
In [105]: sh1.merge_cells('B4:C4') #合并單元格,注意值的變化
In [106]: tuple(sh1.values)
Out[106]:
(('列A', datetime.datetime(2019, 12, 31, 0, 0), -0.0001),
(1, 3, '=SUM(A2,B2)'),
(0.5, -100, datetime.datetime(2019, 1, 1, 0, 0)),
(True, -0.2, None),
('=SUM(A1:A4)', 'B5', 'C5'))
In [108]: len(openpyxl.utils.FORMULAE)
Out[108]: 352
Worksheet對(duì)象以下方法用于整行(列)增加和刪除,但需要注意,增刪行列后,公式所引用的單元格地址并未自動(dòng)更新,與Excel軟件的邏輯 不一致 !
insert_rows、insert_cols方法,插入空白行(列),接受2個(gè)參數(shù),idx為必選參數(shù),指示插入位置,序號(hào)從1起始,amount為默認(rèn)參數(shù),指示插入多少行(列),默認(rèn)為1;
delete_rows、delete_cols方法,刪除行(列),參數(shù)意義與上同。
append方法,在當(dāng)前表單末尾追加值,如果傳入?yún)?shù)是可迭代對(duì)象(如list、tuple)就按序填1行,如果傳入?yún)?shù)是字典,則按關(guān)鍵字給指定的列填值,關(guān)鍵字可以是列序號(hào)或列名。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
In [110]: sh1.insert_rows(1,2)
In [111]: sh1.dimensions
Out[111]: 'A3:C7'
In [112]: sh1.delete_rows(5)
In [113]: sh1.insert_cols(3)
# 注意公式所引用單元格地址并未自動(dòng)變化,與Excel軟件邏輯不一致!
In [114]: tuple(sh1.values)
Out[114]:
((None, None, None, None),
(None, None, None, None),
('列A', datetime.datetime(2019, 12, 31, 0, 0), None, -0.0001),
(1, 3, None, '=SUM(A2,B2)'),
(True, -0.2, None, None),
('=SUM(A1:A4)', 'B5', None, 'C5'))
In [115]: sh1.dimensions
Out[115]: 'A1:D6'
In [120]: sh1.append(range(7)) # 末尾插入整行
In [122]: sh1.append({2:'B列',4:'D列'}) # 尾行只在B、D列插入值
In [124]: sh1.append({'B':'同上','D':'同上'}) # 尾行只在B、D列插入值
In [125]: tuple(sh1.values)
Out[125]:
((None, None, None, None, None, None, None),
(None, None, None, None, None, None, None),
('列A',datetime.datetime(2019, 12, 31, 0, 0), None, -0.0001, None, None, None),
(1, 3, None, '=SUM(A2,B2)', None, None, None),
(True, -0.2, None, None, None, None, None),
('=SUM(A1:A4)', 'B5', None, 'C5', None, None, None),
(0, 1, 2, 3, 4, 5, 6),
(None, 'B列', None, 'D列', None, None, None),
(None, '同上', None, '同上', None, None, None))
其他高階編輯
openpyxl.utils包提供了一些工具函數(shù),輔助數(shù)據(jù)處理,如前面用到的get_column_letter將列序號(hào)轉(zhuǎn)換為列名,還有absolute_coordinate函數(shù)將單元格相對(duì)引用地址轉(zhuǎn)換為絕對(duì)引用地址等等。
openpyxl.drawing包可將圖片文件轉(zhuǎn)換為Image對(duì)象,但需要在Python中事先安裝Pillow做后端支持,否則轉(zhuǎn)換報(bào)錯(cuò)。Worksheet對(duì)象支持通過add_image方法插入圖片,接受2個(gè)參數(shù):
img,必選參數(shù),即Image對(duì)象;
anchor,可選參數(shù),指定圖片錨定坐標(biāo)。1
2
3
In [126]: img = openpyxl.drawing.image.Image('../pic/python-logo.jpg')
In [128]: sh1.add_image(img,'F7')
openpyxl.chart包實(shí)現(xiàn)了各種圖表類型及對(duì)象創(chuàng)建、繪制方法,Worksheet對(duì)象支持通過add_chart方法插入圖表。圖表的繪制過程無法交互,不能實(shí)時(shí)反映出效果,不如直接在Excel軟件中繪制。
openpyxl.style包實(shí)現(xiàn)了字體、顏色、邊框、對(duì)齊、填充、風(fēng)格等多種類型及對(duì)象創(chuàng)建、制作方法,Cell對(duì)象的font、fill、alignment、style等屬性可以直接賦值,實(shí)現(xiàn)單元格風(fēng)格自定義。
openpyxl.formatting包實(shí)現(xiàn)了風(fēng)格、規(guī)則等類型及對(duì)象創(chuàng)建、制作方法,Worksheet對(duì)象的conditional_formatting屬性,提供了add方法用于添加規(guī)格和應(yīng)用的風(fēng)格,實(shí)現(xiàn)單元格的條件格式。
openpyxl.comments包實(shí)現(xiàn)了注釋類型及對(duì)象創(chuàng)建、制作方法,Cell對(duì)象的comment屬性可以直接賦值,實(shí)現(xiàn)單元格添加注釋。
openpyxl.worksheet包實(shí)現(xiàn)了數(shù)據(jù)有效性等類型及對(duì)象創(chuàng)建、制作方法,Worksheet對(duì)象提供了add_data_validation方法進(jìn)行添加,實(shí)現(xiàn)單元格數(shù)據(jù)有效性提示和檢驗(yàn)。
上述高階編輯屬于數(shù)據(jù)處理之后“錦上添花”的功能,但同時(shí)編寫代碼的邏輯繁瑣,不如在Excel軟件中交互式操作更直觀、方便,本文不推薦也不做描述。
保存
將Workbook對(duì)象保存到文件,就1個(gè)方法——save,接受參數(shù)就1個(gè)——文件名。以下示例將上述編輯過的Workbook對(duì)象保存至新的Excel文件。
1
2
3
In [136]: bk.save('data-openpyxl.xlsx')
In [138]: bk2.save('bk2-openpyxl.xlsx')
保存后ata-openpyxl.xlsx文件內(nèi)容如下圖。
data-openpyxl.xlsx
對(duì)于保存,有幾點(diǎn)需要提醒:
Python所有涉及Excel操作的庫都不支持“原地編輯與保存”,openpyxl也不例外,“保存”實(shí)際上是“另存為”,只是指定保存到原文件的話,原文件被覆蓋;
openpyxl僅支持xlsx格式,保存的文件名必須使用.xlsx擴(kuò)展名;
如果創(chuàng)建Workbook對(duì)象時(shí)使用了write_only模式,則僅能調(diào)用save方法一次,不可多次保存。
0x03 總結(jié)
從上述讀寫的示例來看,openpyxl實(shí)現(xiàn)一套Workbook、Worksheet、Cell對(duì)象用于讀寫操作,對(duì)比之下xlrd/xlwt就顯得精神分裂、要逼死強(qiáng)迫癥的節(jié)奏了。openpyxl對(duì)表單、單元格進(jìn)行索引、訪問、賦值等操作的方式和Excel軟件的邏輯天然地接近,毫無違和感,覆蓋了Excel軟件操作的大部分常用功能,同時(shí)對(duì)外提供的API、參數(shù)也不多,易于掌握,對(duì)比之下pyexcel滿天花式操作、數(shù)不清的API和參數(shù)讓人眼花繚亂。
openpyxl堪稱優(yōu)雅的得力干將,唯一的遺憾,大概就是缺少對(duì)xls格式的支持。
參考
openpyxl Documentation,2019.https://openpyxl.readthedocs.io.
更多閱讀
Python操作Excel文件(0):盤點(diǎn)
Python項(xiàng)目如何合理組織規(guī)避import天坑
Cygwin前傳:從割據(jù)到互補(bǔ)
Cygwin系列(一):Cygwin是什么
Cygwin系列(九):Cygwin學(xué)習(xí)路線
Linux Cygwin知識(shí)庫(一):一文搞清控制臺(tái)、終端、shell概念
Linux Cygwin知識(shí)庫(二):目錄、文件及基本操作
專欄:偽碼人We_Coder
如本文對(duì)你有幫助,或內(nèi)容引起極度舒適,歡迎分享轉(zhuǎn)發(fā)或點(diǎn)擊下方捐贈(zèng)按鈕打賞 ^_^
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Python操作Excel 模塊,你猜哪家強(qiáng)?
Python讀寫EXCEL文件常用方法大全
python word excel ppt自動(dòng)化辦公教程
python讀取excel文件
利用Python讀取和修改Excel文件(包括xls文件和xlsx文件)
Python Excel 讀寫及追加寫入(xlrd、xlwt、openpyxl、XlsxWriter)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服