簡介
????????openpyxl是一個用于讀取和編寫Excel 2010 xlsx/xlsm/xltx/xltm文件的Python庫。openpyxl以Python語言和MIT許可證發(fā)布。
????????openpyxl可以處理Excel文件中的絕大多數(shù)內(nèi)容,包括圖表、圖像和公式。它可以處理大量數(shù)據(jù),支持Pandas和NumPy庫導入和導出數(shù)據(jù)。Openpyxl還支持自定義矩陣和PivotTable,以及通過API自動化Excel應用程序。
目錄
1. 創(chuàng)建和打開工作簿
1.1. 創(chuàng)建工作表
1.2. 保存Excel文件
1.3. 關(guān)閉Excel工作簿
1.4. 獲取正在活動的表
1.5. 獲取表名
1.6. 移除工作表
1.7. 復制工作表
1.8. 添加數(shù)據(jù)到末行
2. 寫入和讀取Excel
2.1. 設置表名
2.2. 寫入數(shù)據(jù)
2.3. 插入空白行/列
2.4. 迭代讀取指定行、列
2.5. 遍歷所有數(shù)據(jù)行
2.6. 遍歷所有數(shù)據(jù)列
2.7. 讀取最大行號/列號
2.8. 判斷空行、列
3.?設置Excel格式
3.1. 56種顏色代碼
3.2. 設置字體屬性
3.3. 設置填充屬性
3.4. 設置對齊屬性
3.5.?設置邊框?qū)傩?/p>
3.6. 合并單元格
3.7. 設置組合樣式
4. 其他方法
4.1. csv文件導入Excel
4.2. 畫圖
① 模塊語法
② 折線圖
③ 柱狀圖
1. 創(chuàng)建和打開工作簿
1.1. 創(chuàng)建工作表
- 創(chuàng)建一個新的工作表,并添加到工作簿中??梢酝ㄟ^index參數(shù)來指定插入工作表的位置,默認為在末尾添加。
語法
workbook.create_sheet(
title=None #可選參數(shù),指定工作表的名稱,默認為Sheet+數(shù)字(Sheet1)
index=None #可選參數(shù),指定工作表的插入位置,從0開始計數(shù)。默認將工作表添加到末尾位置。
)
示例
from openpyxl import Workbook
# 創(chuàng)建一個新的工作簿
workbook = Workbook()
# 創(chuàng)建一個 AAA 的工作簿,從第1個位置添加(索引從0開始)
wb_AAA = workbook.create_sheet('AAA', 0)
# 創(chuàng)建一個 BBB 的工作簿,默認添加到末尾
wb_BBB = workbook.create_sheet('BBB')
# 創(chuàng)建一個不指定名稱的工作簿
wb_sheet = workbook.create_sheet()
# 查看所有的工作表名稱
for i in workbook.worksheets:
print(i.title)
# 將這些表保存到磁盤
workbook.save('tmp.xlsx')
結(jié)果
AAA
Sheet
BBB
Sheet1
?文章來源地址http://www.zghlxwxcb.cn/news/detail-495138.html
如果表名已存在,則會報錯
?文章來源:http://www.zghlxwxcb.cn/news/detail-495138.html
1.2. 保存Excel文件
- 保存工作簿為一個Excel文件,需要指定文件的路徑和文件名。
語法
workbook.save('文件名')
舉例
from openpyxl import Workbook
# 創(chuàng)建一個新的工作簿
workbook = Workbook()
# 保存工作簿
workbook.save('tmp.xlsx')
會默認創(chuàng)建一個sheet頁
?
1.3. 關(guān)閉Excel工作簿
- 在處理完工作簿之后,應該使用close()方法將其關(guān)閉。這可以確保文件在使用后得以正常關(guān)閉,避免內(nèi)存泄漏和其他問題。同時,關(guān)閉Excel文件還可以防止其他應用程序無法訪問或編輯相同的文件。
語法
workbook.close()
如果使用 with,則會自動關(guān)閉,無需手動操作
from openpyxl import Workbook
# 使用with語句打開Excel文件,并創(chuàng)建一個新的工作簿
with Workbook() as workbook:
worksheet = workbook.active
"""操作Excel文件"""
# 自動關(guān)閉Excel文件
?
1.4. 獲取正在活動的表
- 獲取或設置當前活動的工作表,可以通過該屬性來切換不同的工作表或獲取當前活動的工作表。
語法
# 設置一張活動的表
Workbook().active = [表名]
# 查看正在活動的表
print(Workbook().active)
#僅查看表名
print(Workbook().active.title)
舉例(如果沒有活動的表,返回None。使用Workbook就會有一張默認的sheet表活動)
>>> from openpyxl import Workbook
>>> print(Workbook().active)
<Worksheet "Sheet">
>>> print(Workbook().active.title)
Sheet
設置一張活動的表?
>>> from openpyxl import Workbook
# 創(chuàng)建一個新的工作簿
>>> workbook = Workbook()
# 設置一張表為正在活動的表
>>> wb_AAA = workbook.create_sheet('AAA')
>>> workbook.active = wb_AAA
# 查看活動的表
>>> print(workbook.active.title)
AAA
?
1.5. 獲取表名
- 返回工作簿中所有工作表的名稱列表。
from openpyxl import load_workbook
# 打開工作簿
f = load_workbook('./tmp.xlsx')
# 查看工作簿中所有工作表名
print(f.get_sheet_names())
如果在高版本出現(xiàn)了這樣的提示
那么按照提示要求,將?get_sheet_names() 替換為?sheetnames 即可
from openpyxl import load_workbook
# 打開工作簿
f = load_workbook('./tmp.xlsx')
# 查看工作簿中所有工作表名
print(f.sheetnames)
?
?
1.6. 移除工作表
- 從工作簿中移除指定的工作表或命名范圍。
語法
workbook.remove([表名])
刪除 AAA 表
>>> from openpyxl import Workbook
# 創(chuàng)建一個新的工作簿
>>> workbook = Workbook()
# 創(chuàng)建兩個工作表
>>> AAA = workbook.create_sheet('AAA')
>>> BBB = workbook.create_sheet('BBB')
# 查看所有表名
>>> for i in workbook.worksheets:
>>> print(i.title)
Sheet
AAA
BBB
# 刪除工作簿中的第二個工作表
>>> workbook.remove(AAA)
# 再次查看所有表名
>>> for i in workbook.worksheets:
>>> print(i.title)
Sheet
BBB
?
1.7. 復制工作表
- 將指定的工作表復制一份,并添加到工作簿中??梢允褂眠@個方法來快速復制工作表,并進行一些定制化操作。
直接拷貝工作表,插入的最后面。名稱為:[舊名稱] + copy
from openpyxl import load_workbook
# 打開工作簿
f = load_workbook('./tmp.xlsx')
# 選擇復制的工作表(AAA)
f_copy = f['AAA']
# 復制并插入表(新表為:[舊名]+copy)
ws = f.copy_worksheet(f_copy)
# 保存文件
f.save('./tmp.xlsx')
# 關(guān)閉文件
f.close()
?
拷貝工作表后重命名
from openpyxl import load_workbook
# 打開工作簿
f = load_workbook('./tmp.xlsx')
# 復制插入新的工作表,賦值給變量
f_copy = f.copy_worksheet(f['AAA'])
# 重命名工作表
f_copy.title = 'new_copyAAA'
# 保存文件
f.save('./tmp.xlsx')
# 關(guān)閉文件
f.close()
?
1.8. 添加數(shù)據(jù)到末行
自動追加到有數(shù)據(jù)的末行,從第1列開始追加
from openpyxl import load_workbook
# 打開工作簿
f = load_workbook('./tmp.xlsx')
# 選擇需要追加的工作表
f_sheet = f['Sheet1']
# 追加數(shù)據(jù)
data = ['A', 'B', 'C', 'D']
f_sheet.append(data)
# 保存文件
f.save('./tmp.xlsx')
?
多行數(shù)據(jù)使用循環(huán)遍歷的方式添加
from openpyxl import load_workbook
# 打開工作簿
f = load_workbook('./tmp.xlsx')
# 選擇需要追加的工作表
f_sheet = f['Sheet1']
# 準備多行數(shù)據(jù)
data_list = [
['A', 'B', 'C', 'D'],
['E', 'F', 'G', 'H'],
[1, 2, 3, 4]
]
# 循環(huán)添加
for i in data_list:
f_sheet.append(i)
# 保存文件
f.save('./tmp.xlsx')
?
?
? ?
2. 寫入和讀取Excel
2.1. 設置表名
- 獲取或設置工作表的名稱。
title 只能獲取已賦值的對象,查看表名?get_sheet_names?更合適
title 修改表名(將原 Sheet1 修改為 new_Sheet1)
from openpyxl import load_workbook
# 打開工作簿
f = load_workbook('./tmp.xlsx')
# 獲取工作表對象
sheet = f['Sheet1']
# 修改工作表名稱
sheet.title = 'new_Sheet1'
# 保存文件
f.save('./tmp.xlsx')
?
2.2. 寫入數(shù)據(jù)
- 獲取或設置工作表中指定單元格的數(shù)據(jù)、樣式等信息。該方法需要指定行列索引,例如cell(row=1, column=1)表示獲取第1行第1列的單元格數(shù)據(jù)。
語法
[工作表].cell(
row: #必選參數(shù),指定單元格的行號
column: #必選參數(shù),指定單元格的列號
value: #可選參數(shù),單元格的值,默認值為None
coordinate: #可選參數(shù),單元格的坐標,默認值為None。如果同時設置了row和column參數(shù),那么coordinate參數(shù)會被自動計算。
)
指定 某行、某列 寫入數(shù)據(jù)。注意:這種方式會將指定文件的原有內(nèi)容覆蓋,工作表留一個Sheet1?
import openpyxl
# 創(chuàng)建一個 工作簿
wb = openpyxl.Workbook()
# 獲取工作表對象
ws = wb.active
# 第1行、1列:插入字符串
ws.cell(1, 1, 'Hello')
# 第1行、2列:插入數(shù)字
ws.cell(1, 2, 1)
# 第1行、3列:插入數(shù)字
ws.cell(1, 3, 10)
# 第1行、4列:插入公式
ws.cell(1, 4, '=B1+C1')
# 第1行、5列:設置格式
ws.cell(row=1, column=5, value='測試')
# 保存文件
wb.save('./tmp.xlsx')
?
向已有數(shù)據(jù)的文件中,寫入指定內(nèi)容
import openpyxl
# 打開一個工作簿
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
sheet = wb['Sheet1']
# 向文件中寫入內(nèi)容
sheet.cell(2, 1, 'abc') #第2行、1列
sheet.cell(2, 2, '無敵') #第2行、2列
# 保存文件
wb.save('./tmp.xlsx')
?
向某個工作簿插入多條數(shù)據(jù)
import openpyxl
# 打開一個工作簿
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
sheet = wb['Sheet2']
# 準備每行內(nèi)容
data = [
['包子', '面條', '稀飯', '油條', '豆?jié){'],
['賣火柴', '賣火機', '賣石油', '賣火石'],
['西瓜', '香蕉', '蘋果', '藍莓', '石榴']
]
# 設置開始行、列
start_row = 2
start_col = 3
# 記錄初始列
init_col = start_col
for data_list in data: #遍歷這個列表
for value in data_list: #遍歷列表中的列表,這才是要插入的數(shù)據(jù)
sheet.cell(row=start_row, column=start_col, value=value) #指定行、列,插入數(shù)據(jù)
start_col += 1 #每次遍歷,列數(shù)+1
start_row += 1 #每次遍歷一個列表,行數(shù)+1
start_col = init_col #每次遍歷一個列表,列數(shù)回到初始值
# 保存文件
wb.save('./tmp.xlsx')
# 關(guān)閉文件
wb.close()
?
2.3. 插入空白行/列
- 分別用于在指定的行或列插入新的空白行或空白列。
插入空白行(原本行的數(shù)據(jù)會下移n行,n取決于插入的空白行數(shù))
insert_rows(
[行號] #必選參數(shù),指定插入的行號
[行數(shù)] #可選參數(shù),指定插入n行空白,默認1
)
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 第2行插入1行空白行
wb_sheet.insert_rows(2)
# 第2行插入3行空白行
wb_sheet.insert_rows(2, 3)
# 保存文件
wb.save('./tmp.xlsx')
?
?插入空白列(原本列的數(shù)據(jù)會右移n列,n取決于插入的空白列數(shù))
insert_cols(
[列號] #必選參數(shù),指定插入的列號
[列數(shù)] #可選參數(shù),指定插入n列空白,默認1
)
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 第2列插入1列空白列
wb_sheet.insert_cols(2)
# 第2列插入3列空白列
wb_sheet.insert_cols(2, 3)
# 保存文件
wb.save('./tmp.xlsx')
? ??
2.4. 迭代讀取指定行、列
語法
iter_rows(
min_row:要迭代的起始行號,默認值為1。
max_row:要迭代的最后行號,默認值為最大行號,即ws.max_row的值。
min_col:要迭代的起始列號,默認值為1。
max_col:要迭代的最后列號,默認值為最大列號,即ws.max_column的值。
values_only:默認為False,如果設置為True,則僅返回單元格的值,而不是單元格對象。
)
?表內(nèi)容如圖
?
指定開始行、結(jié)束行和開始列、結(jié)束列
import openpyxl
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 指定讀取 2-3 行,返回值(而非對象)
rows = wb_sheet.iter_rows(min_row=2, max_row=3, values_only=True)
# 遍歷2-3行
for i in rows:
print(i)
# 指定讀取 2-3 行和 3-4 列
rows = wb_sheet.iter_rows(min_row=2, max_row=3, min_col=3, max_col=4, values_only=True)
# 遍歷2-3行,3-4列
for i in rows:
print(i)
?
2.5. 遍歷所有數(shù)據(jù)行
- 分別返回一個生成器對象,用于遍歷工作表中所有的行。
?表內(nèi)容如圖
? ?
遍歷所有存在數(shù)據(jù)的行(從第1行開始,無論第1行是否有數(shù)據(jù))
import openpyxl
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 遍歷所有有數(shù)據(jù)的行
for row in wb_sheet.rows:
# 再遍歷這一行的所有值
for i in row:
# 輸出單元格名和值
print(i.coordinate, i.value)
# 每行做一個間隔
print('-------------- 下一行 --------------')
輸出結(jié)果如下:
A1 None
B1 None
C1 None
D1 None
E1 None
F1 None
G1 None
-------------- 下一行 --------------
A2 None
B2 None
C2 包子
D2 面條
E2 稀飯
F2 油條
G2 豆?jié){
-------------- 下一行 --------------
A3 None
B3 None
C3 賣火柴
D3 賣火機
E3 賣石油
F3 賣火石
G3 None
-------------- 下一行 --------------
A4 None
B4 None
C4 西瓜
D4 香蕉
E4 蘋果
F4 藍莓
G4 石榴
-------------- 下一行 --------------
? ?
指定遍歷第2行?
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 遍歷第2行
for i in wb_sheet[2]:
# 輸出單元格名和值
print(i.coordinate, i.value)
?
2.6. 遍歷所有數(shù)據(jù)列
- 分別返回一個生成器對象,用于遍歷工作表中所有的列。
?表內(nèi)容如圖
?
遍歷所有存在數(shù)據(jù)的列(從第1列開始,無論第一列是否有數(shù)據(jù))
import openpyxl
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 遍歷所有有數(shù)據(jù)的列
for col in wb_sheet.columns:
# 再遍歷這一列的所有值
for i in col:
# 輸出單元格名和值
print(i.coordinate, i.value)
# 每列做一個間隔
print('-------------- 下一列 --------------')
輸出結(jié)果
A1 None
A2 None
A3 None
A4 None
-------------- 下一列 --------------
B1 None
B2 None
B3 None
B4 None
-------------- 下一列 --------------
C1 None
C2 包子
C3 賣火柴
C4 西瓜
-------------- 下一列 --------------
D1 None
D2 面條
D3 賣火機
D4 香蕉
-------------- 下一列 --------------
E1 None
E2 稀飯
E3 賣石油
E4 蘋果
-------------- 下一列 --------------
F1 None
F2 油條
F3 賣火石
F4 藍莓
-------------- 下一列 --------------
G1 None
G2 豆?jié){
G3 None
G4 石榴
-------------- 下一列 --------------
?
2.7. 讀取最大行號/列號
- 分別返回當前工作表中最大的行數(shù)和最大的列數(shù),可以用來遍歷整個工作表的數(shù)據(jù)。
語法
# 查看最后一行的行號
[工作表].max_row
# 查看最后一列的列號
[工作表].max_column
?
查看最后一行行號,輸出最后一行的值
import openpyxl
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 獲取最大行
max_rows = wb_sheet.max_row
print(f'存在數(shù)據(jù)的最大行為:{max_rows}')
# 通過行號遍歷最后一行的數(shù)據(jù)
for i in wb_sheet[max_rows]:
print(i.coordinate, i.value)
?
查看最后一列的列號
import openpyxl
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 獲取最大行
max_col = wb_sheet.max_column
print(f'存在數(shù)據(jù)的最大列為:{max_col}')
?
2.8. 判斷空行、列
openpyxl 中沒有直接判斷的方法,使用循環(huán)判斷。判斷圖表如下:
?
判斷空行
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 獲取最大行數(shù)、最大列數(shù)
max_row = wb_sheet.max_row
max_col = wb_sheet.max_column
# 通過行數(shù)、列數(shù)去遍歷
for row in wb_sheet.iter_rows(max_row=max_row, max_col=max_col):
# 判斷空行
if all(cell.value is None for cell in row):
print(f'第{row[0].row}行是空行')
?
判斷空列的方法與空行相似
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 獲取最大行數(shù)、最大列數(shù)
max_row = wb_sheet.max_row
max_col = wb_sheet.max_column
# 通過行數(shù)、列數(shù)去遍歷
for col in wb_sheet.iter_cols(max_row=max_row, max_col=max_col):
# 判斷空列
if all(cell.value is None for cell in col):
print(f'第{col[0].column_letter}行是空列')
?
?
3.?設置Excel格式
3.1. 56種顏色代碼
索引值 | 顏色名稱 | 顏色代碼 |
0 | 黑色 | 000000 |
1 | 白色 | FFFFFF |
2 | 紅色 | FF0000 |
3 | 深紅色 | 800000 |
4 | 黃色 | FFFF00 |
5 | 綠色 | 00FF00 |
6 | 深綠色 | 8000 |
7 | 藍色 | 0000FF |
8 | 深藍色 | 80 |
9 | 洋紅色 | FF00FF |
10 | 深洋紅色 | 800080 |
11 | 青色 | 00FFFF |
12 | 深青色 | 8080 |
13 | AutoCAD | FF9933 |
14 | 自定義1 | FF6600 |
15 | 自定義2 | FFCC00 |
16 | 棕色 | 993300 |
17 | 橄欖綠 | 333300 |
18 | 深橄欖綠 | 333333 |
19 | 深灰色 | 808080 |
20 | 淺灰色 | C0C0C0 |
21 | 橙色 | FF9900 |
22 | 藍灰色 | 666699 |
23 | 白色網(wǎng)格 | F2F2F2 |
24 | 淡黃色 | FFFFCC |
25 | 亮綠色 | C8D531 |
26 | 光綠松石 | 99CCFF |
27 | 淺天藍 | 99CC00 |
28 | 淡藍色 | CCFFFF |
29 | 玫瑰色 | FF99CC |
30 | 薰衣草色 | CC99FF |
31 | 棕褐色 | CC9966 |
32 | 淺藍色 | 99CCFF |
33 | 水綠色 | 00FFFF |
34 | 石灰色 | CCFF00 |
35 | 黃金色 | CC9900 |
36 | 天藍色 | 0066CC |
37 | 楊李色 | CC99CC |
38 | 淺橙色 | FEBF00 |
39 | 鮮肉色 | FFBF00 |
40 | 深棕色 | 663300 |
41 | 橄欖褐色 | 333300 |
42 | 深紅色 | 660000 |
43 | 暗黃色 | 999900 |
44 | 森林綠色 | 6600 |
45 | 綠松石色 | 3399FF |
46 | 藍灰色 | 666699 |
47 | 藍綠色 | 6699 |
48 | 灰色40 | 969696 |
49 | 灰色?25 | C0C0C0 |
50 | 天藍色 | 0066CC |
51 | 茶色 | FFC000 |
52 | 深綠色 | 3300 |
53 | 淺綠色 | 00FFFF |
54 | 玫瑰紅 | FFAFAF |
55 | 楊李色 | 800080 |
?
3.2. 設置字體屬性
- 例如:字體名稱、字號、顏色和是否加粗等。
語法
openpyxl.styles.Font(
name="Calibri" #字體名稱(Arial、Calibri、Times New Roman、Verdana、Helvetica、Tahoma)
size=11 #字體大小
bold=False #是否加粗
italic=False #是否傾斜
underline="none" #下劃線類型
color="000000" #字體顏色,紅(FF0000)、橙(993300)、黃(FFFF00)、綠(00FF00)、青(00FFFF)、藍(0000FF)、紫(CC99FF)
scheme="None" #字體下劃線顏色方案
strike=False #刪除線。
)
設置單個單元格屬性
import openpyxl
from openpyxl.styles import Font
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet1']
# 指定坐標A1,設置屬性(顏色:紅色)
wb_sheet['A1'].font = Font(color='FF0000')
# 指定坐標(1行2列)和(2行2列)為藍色
wb_sheet.cell(row=1, column=2).font = Font(color='0000FF')
wb_sheet.cell(row=2, column=2).font = Font(color='0000FF')
# 保存文件
wb.save('./tmp.xlsx')
?
設置某個工作表所有存在數(shù)據(jù)的單元格屬性
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 將工作表所有存在數(shù)據(jù)的單元格設置屬性(獲取最大行數(shù)、最大列數(shù))
max_row = wb_sheet.max_row
max_col = wb_sheet.max_column
# 通過行數(shù)、列數(shù)去遍歷
for row in wb_sheet.iter_rows(max_row=max_row, max_col=max_col):
# 遍歷單個單元格
for cell in row:
# 設置屬性(字體大?。?8,字體加粗,字體刪除線)
cell.font = openpyxl.styles.Font(size=18, bold=True,strike=True)
#保存文件
wb.save('./tmp.xlsx')
?
指定表格設置屬性
import openpyxl
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet2']
# 指定開始行、結(jié)束行;開始列,結(jié)束列設置屬性
start_row,end_row = 1,3 #1-3行
start_col,end_col = 2,4 #2-4列
# 通過行數(shù)、列數(shù)去遍歷
for row in wb_sheet.iter_rows(min_row=start_row, max_row=end_row, min_col=start_col, max_col=end_col):
# 遍歷單個單元格
for cell in row:
# 設置屬性(字體顏色:紅色)
cell.font = openpyxl.styles.Font(color='FF0000')
#保存文件
wb.save('./tmp.xlsx')
? ?
3.3. 設置填充屬性
- 例如:填充類型、填充顏色、前景色、背景色等。
語法
openpyxl.styles.PatternFill(
fill_type #填充類型
fg_color #前景顏色
bg_color #背景顏色
start_color #開始顏色
end_color #結(jié)束顏色,僅在 fill_type 為 “gradient” 時有效
pattern_type #填充的圖案類型,只有在 fill_type 為 “solid” 或 “l(fā)ight* / dark*” 等條紋填充時有效
)
填充類型包含:
none #不填充
solid #實心填充
mediumGray, darkGray, lightGray, black: 灰階填充
darkHorizontal, darkVertical, darkDown, darkUp, darkGrid, darkTrellis,lightHorizontal, lightVertical, lightDown, lightUp, lightGrid, lightTrellis: 線條或塊條紋填充
gray0625 #62.5% 灰階填充
gradient #漸變填充
path #自定義填充
填充的圖案類型包括:
none #無圖案
solid #單色圖案
gray0625 #62.5% 灰階圖案
mediumGray, darkGray, lightGray, black: 灰階圖案
darkHorizontal, darkVertical, darkDown, darkUp, darkGrid, darkTrellis, lightHorizontal, lightVertical, lightDown, lightUp, lightGrid, lightTrellis: 線條或塊條紋圖案
示例(設置背景色為綠色)
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
wb = load_workbook('./tmp.xlsx')
wb_sheet = wb['Sheet1']
# 設置A1填充類型為實心填充,背景顏色為綠色
wb_sheet['A1'].fill = PatternFill(fill_type='solid', start_color='00FF00')
# 設置A2填充類型為條紋填充,背景顏色為紅色,條紋顏色為黃色
wb_sheet['A2'].fill = PatternFill(fill_type='lightVertical', start_color='FF0000', end_color='FFFF00')
wb.save('./tmp.xlsx')
?
3.4. 設置對齊屬性
- 例如:水平對齊方式、垂直對齊方式、自動換行等。
語法
openpyxl.styles.Alignment(
horizontal #水平對齊方式, 默認general(一般對齊)
vertical #垂直對齊方式
wrap_text #是否自動換行(True 或 False)
shrink_to_fit #是否縮小字體以適應單元格大小(True 或 False)
indent #縮進級別(0-255)
reading_order #讀取順序(1: 從左到右; 2: 從右到左)
)
水平對齊選項:
general #默認值,一般對齊
left #左對齊
center #居中對齊
right #右對齊
fill #填充對齊
justify #兩端對齊
centerContinuous #連續(xù)居中對齊(僅限于分布居中)
distributed #分布對齊
垂直對齊選項:
top #上對齊
center #居中對齊
bottom #下對齊
justify #兩端對齊
distributed #分布對齊
示例(設置單個單元格對齊方式)
from openpyxl import load_workbook
from openpyxl.styles import Alignment
wb = load_workbook('./tmp.xlsx')
wb_sheet = wb['Sheet1']
# 居中對齊
wb_sheet['A1'].alignment = Alignment(horizontal='center', vertical='center')
# 左對齊,自動換行,縮小字體以適應單元格大小
wb_sheet['A2'].alignment = Alignment(horizontal='left', vertical='top', wrap_text=True, shrink_to_fit=True)
# 分布對齊
wb_sheet['A3'].alignment = Alignment(horizontal='distributed', vertical='center')
wb.save('./tmp.xlsx')
? ?
示例(設置多個單元格對齊)
from openpyxl import load_workbook
from openpyxl.styles import Alignment
wb = load_workbook('./tmp.xlsx')
wb_sheet = wb['Sheet1']
# 設置單元格的對齊方式為居中
alignment = Alignment(horizontal='center', vertical='center')
# 設置開始行號和結(jié)束行號、開始列號和結(jié)束列號
start_rows,end_rows = 2,5
start_col, end_col = 2,5
# 采用遍歷的方式分別對各個單元格設置對齊方式
for row in wb_sheet.iter_rows(min_row=start_rows, max_row=end_rows, min_col=start_col, max_col=end_col):
for cell in row:
# 為每個單元格設置對齊方式
cell.alignment = alignment
wb.save('./tmp.xlsx')
?
3.5.?設置邊框?qū)傩?/h3>
- 例如:邊框樣式、邊框顏色、邊框位置等。
語法
openpyxl.styles.Border(
left #左邊框樣式(參考下方選項)
right #右邊框樣式(參考下方選項)
top #上邊框樣式(參考下方選項)
bottom #下邊框樣式(參考下方選項)
diagonal #對角線樣式(參考下方選項)
diagonal_direction #對角線方向(up: 對角線從下到上; down: 對角線從上到下)
diagonal_color #對角線顏色,同顏色規(guī)范
)
邊框樣式選項:
none #沒有邊框
thin #細邊框
medium #中等邊框
dashed #虛線邊框
dotted #點線邊框
thick #粗邊框
double #雙邊框
hair #細邊框,類似于毛發(fā)
mediumDashDot #中等虛線邊框
dashDot #虛線點線邊框
mediumDashDotDot #中等點線點線邊框
dashDotDot #虛線點線點線邊框
mediumDashed #中等虛線邊框
舉例(設置單個單元格邊框)
from openpyxl import load_workbook
from openpyxl.styles import Border,Side
wb = load_workbook('./tmp.xlsx')
wb_sheet = wb['Sheet1']
# 為 A1 單元格添加雙線邊框,顏色為紅色
border = Border(
left=Side(style='double', color='FF0000'),
right=Side(style='double', color='FF0000'),
top=Side(style='double', color='FF0000'),
bottom=Side(style='double', color='FF0000')
)
wb_sheet['A1'].border = border
# 為 A2 單元格添加細虛線邊框,顏色為藍色
thin_border = Border(
left=Side(style='thin', color='0000FF'),
right=Side(style='thin', color='0000FF'),
top=Side(style='thin', color='0000FF'),
bottom=Side(style='thin', color='0000FF')
)
wb_sheet['A2'].border = thin_border
wb.save('./tmp.xlsx')
?
舉例(設置多個單元格邊框),使用遍歷逐個設置邊框
from openpyxl import load_workbook
from openpyxl.styles import Border,Side
wb = load_workbook('./tmp.xlsx')
wb_sheet = wb['Sheet1']
# 準備一個虛線邊框模板,顏色為紅色
thin_border = Border(
left=Side(style='thin', color='FF0000'),
right=Side(style='thin', color='FF0000'),
top=Side(style='thin', color='FF0000'),
bottom=Side(style='thin', color='FF0000')
)
# 設置開始行號和結(jié)束行號、開始列號和結(jié)束列號
start_rows,end_rows = 2,5
start_col, end_col = 2,5
# 采用遍歷的方式分別對各個單元格設置邊框
for row in wb_sheet.iter_rows(min_row=start_rows, max_row=end_rows, min_col=start_col, max_col=end_col):
for cell in row:
# 為每個單元格設置邊框
cell.border = thin_border
wb.save('./tmp.xlsx')
?
3.6. 合并單元格
- 分別用于合并指定區(qū)域中的單元格和取消已經(jīng)合并的單元格區(qū)域。
合并單元格語法
worksheet.merge_cells(
range_string=None #指定要合并的單元格范圍。例如:A1:A2
start_row=None #是合并范圍的左上角單元格的行號。
start_column=None #是合并范圍的左上角單元格的列號。
end_row=None #是合并范圍的右下角單元格的行號。
end_column=None #是合并范圍的右下角單元格的列號。
)
- 當指定
range_string
參數(shù)時,將自動計算另外4個參數(shù)。 - 如果同時指定了5個參數(shù)參數(shù),則以
range_string
參數(shù)為準。
取消合并單元格語法
worksheet.unmerge_cells(
range_string=None #指定要取消的合并單元格的范圍。
start_row=None #是要取消的合并單元格的左上角單元格的行號。
start_column=None #是要取消的合并單元格的左上角單元格的列號。
end_row=None #是要取消的合并單元格的右下角單元格的行號。
end_column=None #是要取消的合并單元格的右下角單元格的列號。
)
- 用法與合并單元格一致,不做舉例說明
?
同一行合并(A1:B1,如果2個單元格都有數(shù)據(jù),那么只保留A1;B1:A1 這種語法是錯誤的,合并行或列,必須從走往右、從上往下選擇)
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet1']
# 指定A1和B1合并
wb_sheet.merge_cells('A1:B1')
# 保存文件
wb.save('./tmp.xlsx')
斜對行合并
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet1']
# 指定A1和B2合并(自動計算4個單元格)
wb_sheet.merge_cells('A1:B2')
# 保存文件
wb.save('./tmp.xlsx')
?指定開始行、列和結(jié)束行列(自定義方法適用于遍歷)
# 打開文件
wb = openpyxl.load_workbook('./tmp.xlsx')
# 指定工作表名
wb_sheet = wb['Sheet1']
# 指定開始行號、結(jié)束行號;開始列號、結(jié)束列號
wb_sheet.merge_cells(start_row=2, end_row=5, start_column=3, end_column=7)
# 保存文件
wb.save('./tmp.xlsx')
?
3.7. 設置組合樣式
from openpyxl import load_workbook
from openpyxl.styles import Alignment,NamedStyle,Font,Border,Side,PatternFill
# 打開工作簿和對應的工作表
wb = load_workbook('./tmp.xlsx')
wb_sheet = wb['Sheet1']
# 定義一個名為 my_style 的樣式對象
my_style = NamedStyle(name="my_style")
# 設置字體屬性
my_style.font = Font(size=14, bold=True)
# 設置填充屬性
my_style.fill = PatternFill(start_color='FFC7CE', end_color='FFC7CE', fill_type='solid')
# 設置邊框?qū)傩?my_style.border = Border(left=Side(style='thin', color='000000'),
right=Side(style='thin', color='000000'),
top=Side(style='thin', color='000000'),
bottom=Side(style='thin', color='000000'))
my_style.alignment = Alignment(horizontal='center', vertical='center')
# 設置開始行號和結(jié)束行號、開始列號和結(jié)束列號
start_rows,end_rows = 1,3
start_col, end_col = 1,5
# 采用遍歷的方式分別對各個單元格設置對齊方式
for row in wb_sheet.iter_rows(min_row=start_rows, max_row=end_rows, min_col=start_col, max_col=end_col):
for cell in row:
# 為每個單元格設置自定義的屬性
cell.style = my_style
# 保存文件
wb.save('./tmp.xlsx')
# 關(guān)閉文件
wb.close()
?
?
4. 其他方法
4.1. csv文件導入Excel
通過?pandas.read_csv 讀取csv文件內(nèi)容,語法如下
pandas.read_csv(
filepath_or_buffer #必選參數(shù),指定文件
sep #可選參數(shù),指定分隔符(默認逗號)
delimiter #可選參數(shù),指定分隔符,與sep一樣,可用任何長度的字符串作為分隔符。
skipinitialspace #可選參數(shù),忽略分隔符后的空白,默認為False。
header #可選參數(shù),指定第n行作為每列的列名(例如指定第2行,那么不會輸出第1行)
names #可選參數(shù),指定列名(例如:names=['AA','BB','CC','DD'],使用列表給每列取列名)
usecols #可選參數(shù),通過索引指定列數(shù)( [0,1,2] 和 [0,2,1] 讀取的結(jié)果一致,不會更改數(shù)據(jù)的順序)
nrows #指定讀取的行數(shù)(nrows=1 讀取第2行)
skiprows #可選參數(shù),指定跳過某行(skiprows=[0,2] 跳過1和3行)
skipfooter #可選參數(shù),指定跳過尾部行數(shù)(skipfooter=2 跳過最后2行)
encoding #指定編碼格式,默認為None,使用系統(tǒng)默認編碼。
)
通過?to_excel 保存到Excel文件,語法如下
to_excel(
excel_writer #指定工作簿名
sheet_name #指定工作表名
startrow #寫入數(shù)據(jù)的起始行
startcol #寫入數(shù)據(jù)的起始列。
float_format #精度設置。
columns #要寫入的列,默認為None,表示寫入所有列。
header #是否寫入列名,默認為True。
index #是否寫入索引,默認為True。
index_label #索引列的列名。
merge_cells #合并單元格。
encoding #指定編碼格式,默認為None,使用系統(tǒng)默認編碼。
)
讀取csv文件內(nèi)容保存到Excel文件(如果存在該文件自動覆蓋;如果不存在該文件自動創(chuàng)建)
import pandas
# 讀取csv文件,指定分隔符
f = pandas.read_csv('./csv.txt', sep=',')
# 將csv文件內(nèi)容覆蓋到Excel,執(zhí)行工作表名為AAA(默認為Sheet1)
f.to_excel('tmp.xlsx', index=False, sheet_name='AAA')
?
讀取csv文件內(nèi)容,保存到Excel指定一個新的Sheet
import pandas
# 讀取csv文件
f = pandas.read_csv('./csv.txt', sep=',')
# 指定追加模式
with pandas.ExcelWriter('tmp.xlsx', mode='a') as w:
# 將追加一個工作表BBB到Excel文件,如果BBB存在則報錯
f.to_excel(w, sheet_name='BBB', index=False)
?
讀取csv文件內(nèi)容,指定寫入開始行(列)到Excel文件
import pandas
# 讀取csv文件
f = pandas.read_csv('./csv.txt', sep=',')
# 指定追加模式
with pandas.ExcelWriter('tmp.xlsx', mode='a') as w:
# 指定工作表名(ccc),從第11行、4列開始寫入數(shù)據(jù)
f.to_excel(w, sheet_name='CCC', index=False, startrow=10, startcol=3)
?
4.2. 畫圖
① 模塊語法
matplotlib.pyplot 內(nèi)置的方法
matplotlib.pyplot.[方法]
方法如下( plt 為 matplotlib.pyplot 的簡稱):
plt.title() #設置圖表標題;
plt.xlabel() #設置x軸標簽;
plt.ylabel() #設置y軸標簽;
plt.grid() #添加網(wǎng)格線到圖表中;
plt.legend() #在圖表中添加圖例;
plt.savefig() #將圖表保存到指定的文件中。
plt.xticks() #設置x軸刻度標簽;
plt.yticks() #設置y軸刻度標簽;
plt.plot() #繪制折線圖、散點圖、條形圖等;
plt.boxplot() #繪制箱體圖;
plt.bar() #繪制垂直方向的條形圖;
plt.hist() #繪制直方圖;
plt.pie() #繪制餅圖;
plt.imshow() #繪制圖像;
plt.contour() #繪制等高線圖;
plt.scatter() #繪制散點圖;
plt.stem() #繪制干狀圖(即將每個點的值以線的形式展示);
plt.step() #繪制階梯圖;
plt.polar() #繪制極坐標圖;
plt.subplots() #創(chuàng)建Figure對象和多個子圖;
plt.semilogx() #以10為底的對數(shù)刻度繪制x軸;
plt.semilogy() #以10為底的對數(shù)刻度繪制y軸;
plt.loglog() #以10為底的對數(shù)刻度繪制x、y軸;
plt.fill() #填充兩條曲線之間的區(qū)域;
plt.text() #在圖表中添加文本注釋;
折線圖語法(matplotlib.pyplot.plot)
matplotlib.pyplot.plot(
x #橫坐標數(shù)組或一個可迭代對象;
y #縱坐標數(shù)組或一個可迭代對象;
c #散點圖中點的顏色;
label #該圖例標簽的字符串;
linestyle #折線的樣式;
linewidth #折線或線框的線寬;
marker #散點圖的標記樣式;
markersize #標記大小;
alpha #透明度;
edgecolors #散點或折線周圍的顏色;
color #折線或線框的顏色;
markeredgecolor #標記邊界的顏色;
markeredgewidth #標記邊界的線寬;
markerfacecolor #標記內(nèi)部的顏色;
linestyle #折線或線框的樣式;
dash_capstyle #折線中間斷點的樣式;
dash_joinstyle #折線中間斷點的連接樣式;
solid_capstyle #線框起點或終點的樣式;
solid_joinstyle #線框起點或終點在交叉區(qū)域的樣式;
zorder #控制圖層順序,越大的值表示越靠近上層;
drawstyle #折線的繪制方式,可以是"steps-pre"、“steps-mid"或"steps-post”;
dashes #自定義折線的樣式,例如[10, 5, 20, 5]表示線段長10,空隙長5,線段長20,空隙長5;
antialiased #抗鋸齒效果,默認為True;
fillstyle #散點的填充樣式,可以是"full"、“l(fā)eft”、“right"或"bottom”;
solid_joinstyle #線框起點或終點在交叉區(qū)域的樣式;
visible #對象是否可見;
clip_on #是否將對象剪裁為軸范圍內(nèi);
clip_path #剪裁路徑;
markerfacecoloralt #用于面向未填充的標記的交替面顏色。
)
柱狀圖語法(matplotlib.pyplot.bar)
matplotlib.pyplot.bar(
x #柱狀圖中每個柱的橫坐標;
height #每個柱的高度;
width #每個柱的寬度,為浮點數(shù)或數(shù)組;
align #柱的對齊方式,可以是’center’、‘edge’、‘none’,分別表示居中對齊、邊緣對齊和不對齊;
bottom #每個柱底部的高度;
log #是否使用對數(shù)坐標軸;
color #柱狀的顏色,可以是單個顏色字符串,也可以是RGB或RGBA序列、灰度值或html字符串;
edgecolor #每個柱的邊框顏色;
linewidth #每個邊框的線寬;
hatch #每個柱填充的圖案樣式(紋理);
capsize #誤差線末端箭頭的長度;
error_kw #誤差線相關(guān)參數(shù):
elinewidth #誤差線線寬;
capsize #誤差線末端箭頭的長度;
capthick #誤差線末端箭頭的厚度;
ecolor #誤差線顏色。
align #對齊方式,可以是“edge”,“center”。
label #柱狀圖的標簽;
alpha #透明度;
visible #是否可見;
zorder #控制圖層順序,越大的值表示越靠近上層;
tick_label #柱狀圖的刻度標簽;
xerr #繪制誤差線;
yerr #繪制誤差線。
)
顏色寫法
red:紅色
g:綠色
b:藍色
c:青色
m:品紅
y:黃色
k:黑色
w:白色。
?
② 折線圖
Excel數(shù)據(jù)如下:
??
讀取3列數(shù)據(jù),繪制折線圖
import pandas
import matplotlib.pyplot as plt
# 防止亂碼
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 讀取Excel文件內(nèi)容,如果讀取csv文件,則使用pandas.read_csv
df = pandas.read_excel('./tmp.xlsx', sheet_name='AAA')
# 提取橫坐標的數(shù)據(jù)(常見的:日期,時長)
x = df['data'].to_numpy()
# 通過列名(c1/c2/c3)提取畫圖的數(shù)據(jù)
y1 = df['c1'].to_numpy()
y2 = df['c2'].to_numpy()
y3 = df['c3'].to_numpy()
# 繪制折線圖
plt.plot(x, y1, label='c1') # 指定縱坐標y1,并自定義圖例標題為c1
plt.plot(x, y2, label='c2') # 指定縱坐標y2,并自定義圖例標題為c2
plt.plot(x, y3, label='c3') # 指定縱坐標y3,并自定義圖例標題為c3
plt.legend() # 顯示圖例標題
plt.xlabel('橫坐標名稱')
plt.ylabel('縱坐標名稱')
plt.title('折線圖標題')
plt.savefig('./aa.jpg') # 保存圖片
plt.show() #查看圖片
??
如果列名沒有在第一行,那么在讀取的時候直接跳過n行
# 讀取Excel文件內(nèi)容,header跳過前10行
df = pandas.read_excel('./tmp.xlsx', sheet_name='AAA', header=10)
??
增加屬性(標記點、網(wǎng)格、跳過n行)
import pandas
import matplotlib.pyplot as plt
# 防止亂碼
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 讀取Excel文件內(nèi)容,如果讀取csv文件,則使用pandas.read_csv
df = pandas.read_excel('./tmp.xlsx', sheet_name='AAA', header=40)
# 提取橫坐標的數(shù)據(jù)(常見的:日期,時長)
x = df['data'].to_numpy()
# 通過列名(c1/c2/c3)提取畫圖的數(shù)據(jù)
y1 = df['c1'].to_numpy()
y2 = df['c2'].to_numpy()
y3 = df['c3'].to_numpy()
# 定義圖表大小(長15,高8)
plt.figure(figsize=(15,8))
# 繪制折線圖。label自定義圖例名稱,marker自定義標記樣式,markersize指定標記大小
plt.plot(x, y1, label='c1', marker='o', markersize=3)
plt.plot(x, y2, label='c2', marker='o', markersize=3)
plt.plot(x, y3, label='c3', marker='o', markersize=3)
plt.legend() #顯示圖例標題
plt.grid() #顯示網(wǎng)格線
plt.xlabel('橫坐標名稱')
plt.ylabel('縱坐標名稱')
plt.title('折線圖標題')
plt.savefig('./aa.jpg') # 保存圖片
plt.show() #查看圖片
??
③ 柱狀圖
多條柱狀圖重疊
import pandas
import matplotlib.pyplot as plt
# 防止亂碼
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 讀取Excel文件內(nèi)容
df = pandas.read_excel('./tmp.xlsx', sheet_name='AAA', header=40)
# 提取橫坐標的數(shù)據(jù)(常見的:日期,時長)
x = df['data'].to_numpy()
# 通過列名(c1/c2/c3)提取畫圖的數(shù)據(jù)
y1 = df['c1'].to_numpy()
y2 = df['c2'].to_numpy()
y3 = df['c3'].to_numpy()
# 定義圖表大小(長15,高8)
plt.figure(figsize=(15,8))
# 繪制折線圖(label為自定義圖例名稱;width為柱狀寬0-1;alpha為透明度0-1;edgecolor為邊框顏色)
plt.bar(x, y1, label='c1', width=0.5, alpha=0.5, edgecolor='black')
plt.bar(x, y2, label='c2', width=0.5, alpha=0.5, edgecolor='black')
plt.bar(x, y3, label='c3', width=0.5, alpha=0.5, edgecolor='black')
plt.legend() # 顯示圖例標題
plt.xlabel('橫坐標名稱')
plt.ylabel('縱坐標名稱')
plt.title('折線圖標題')
# plt.savefig('./aa.jpg') # 保存圖片
plt.show() #查看圖片
??
多條圖形重疊顏色難以區(qū)分,讓x軸+n(右移動n)
import pandas
import matplotlib.pyplot as plt
# 防止亂碼
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 讀取Excel文件內(nèi)容
df = pandas.read_excel('./tmp.xlsx', sheet_name='AAA', header=40)
# 提取橫坐標的數(shù)據(jù)(常見的:日期,時長)
x = df['data'].to_numpy()
# 通過列名(c1/c2/c3)提取畫圖的數(shù)據(jù)
y1 = df['c1'].to_numpy()
y2 = df['c2'].to_numpy()
y3 = df['c3'].to_numpy()
# 定義圖表大小(長15,高8)
plt.figure(figsize=(15,8))
# 繪制折線圖(label為自定義圖例名稱;width為柱狀寬0-1;alpha為透明度0-1;edgecolor為邊框顏色;color為柱狀顏色)
plt.bar(x, y1, label='c1', width=0.2, alpha=0.5, edgecolor='black',color='g')
plt.bar(x+0.2, y2, label='c2', width=0.2, alpha=0.5, edgecolor='black',color='c')
plt.bar(x+0.4, y3, label='c3', width=0.2, alpha=0.5, edgecolor='black',color='m')
plt.legend() # 顯示圖例標題
plt.xlabel('橫坐標名稱')
plt.ylabel('縱坐標名稱')
plt.title('折線圖標題')
plt.savefig('./aa.jpg') # 保存圖片
plt.show() #查看圖片
?
?
到了這里,關(guān)于Python模塊openpyxl & 操作Excel文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!