使用Python第三方庫
這一節我們學習如何使用Python去操作Excel文檔。如果大家有人不知道Excel的話,那么建議先學一學office辦公基礎。這里想要操作Excel,必須安裝一個Python第三方庫。
有人可能會疑問,第三方庫是什么?其實第三方庫就是非Python官方提供的庫,也就是民間好心人開發出來的開源庫,供大家免費使用。那這里肯定又有人會疑問,庫是什么呢?我們前面已經知道了Python模塊,其實庫就是一個或多個相關連的Python模塊合在一起,這樣說很容易理解吧。通常Python中的所謂庫,其實就是一個文件夾,這個文件夾中放了幾個Python模塊,而一個Python源代碼文件就是一個模塊。
安裝
第三方庫和Python的標准庫不同,它需要我們手動去安裝,不安裝是沒法使用的。這里簡要說一下如何安裝Python第三方庫。通常一些書籍或網絡博客中,推薦使用pip
命令去自動下載安裝第三方庫,但是前提是需要我們將pip
配置到環境變量中。這樣去使用存在一些問題,當我們電腦裝了多個Python版本時,極容易造成pip
環境混亂。我在這里介紹一個小技巧,不需要去配置pip
到環境變量中,且不會造成環境混亂。當我們需要使用pip
命令時,在它前面加上python -m
去使用,如下
1python -m pip install 第三方庫名稱
好了,今天我們要使用的第三方庫叫做openpyxl
,大家一定要記住這個庫名字哦,按照我們上面學習的公式,打開WIndows上面的cmd
命令行,輸入如下命令安裝
1python -m pip install openpyxl
如果大家的網絡不好,就需要耐心等待,安裝完成之后,命令行中會看到如下內容
1Successfully installed et-xmlfile-1.0.1 jdcal-1.4 openpyxl-2.6.0
如果大家的命令行中出現以下內容You should consider upgrading via the 'python -m pip install --upgrade pip' command
則按照英文提示,先輸入python -m pip install --upgrade pip
執行一下,這個命令是升級我們的pip
版本的,升級成功后,再去執行python -m pip install openpyxl
使用
實際上Excel文檔也是一個文件,它雖然不是我們之前學的純文本文件,但它也是文件,脫離不了文件的讀與寫兩種操作。
先讓我們認識一下Excel的一些概念,有助於我們理解代碼,這里主要是三個概念,行、列和Sheet表。如下圖
當我們選中第一行的第A列小格子時,可以看到上面的顯示框中顯示的是A1
,再次選中第二行的第A列小格子時,則會顯示A2
,由此我們即可掌握規律,Excel中的行列坐標,是使用列號+行號
的方式定位。
寫Excel文檔
1import openpyxl as exl
2
3# 創建一個工作簿對象
4wb = exl.Workbook()
5
6# 獲取一個激活的sheet表,相當於獲取第一個Sheet表
7sheet = wb.active
8# 給sheet表取一個名字
9sheet.title = '一班'
10
11sheet['A1'] = '學號'
12sheet['B1'] = '姓名'
13sheet['C1'] = '語文'
14sheet['D1'] = '數學'
15sheet['E1'] = '英語'
16
17sheet['A2'] = '201901'
18sheet['B2'] = '王五'
19sheet['C2'] = 81.5
20sheet['D2'] = 90
21sheet['E2'] = 85
22
23wb.save('test.xlsx')
運行如上代碼后,我們可以看到代碼當前目錄下生成了一個test.xlsx
的Excel文檔。
可以看到,我們通過幾行簡單代碼就創建了一個Excel文檔。當然,上述代碼中,我們是純手動的去填表的,如果我們的表有1000行,我們不可能這樣手寫代碼填入信息,因此我們應當借助循環去完成這種枯燥的事情,還記得我們前面學過的章節嗎,循環是重復的藝術。
1# 導入我們已安裝的第三方庫openpyxl
2import openpyxl as exl
3
4# 創建一個存放數據的列表,該列表中元素也是一個列表,每一個元素代碼一行數據
5data = [
6 ['學號', '姓名', '語文', '數學', '英語'],
7 ['201901', '張三', 90, 68.5, 95],
8 ['201902', '李四', 50, 71, 83],
9 ['201903', '王五', 73, 91, 69],
10 ['201904', '趙六', 85.6, 36, 77],
11]
12
13
14# 定義一個函數,用於寫入一行數據,參數i用於Excel中的行號,參數row是一個列表,存放的是一行數據
15def write_row(i, row):
16 # 獲取全局變量sheet
17 global sheet
18 # 字符串使用 “+”連接符進行拼接。這里變量i必須是字符串,只有字符串才能和字符串拼接
19 sheet['A' + i] = row[0]
20 sheet['B' + i] = row[1]
21 sheet['C' + i] = row[2]
22 sheet['D' + i] = row[3]
23 sheet['E' + i] = row[4]
24
25
26# 創建一個工作簿對象
27wb = exl.Workbook()
28
29# 創建一個激活的sheet表
30sheet = wb.active
31# 給sheet表取一個名字
32sheet.title = '一班'
33
34for index, line in enumerate(data):
35 print(index, line)
36 # Excel中行號從1開始,而列表的序號是從0開始,因此要加1,並將該整數轉換為字符串變量
37 write_row(str(index + 1), line)
38
39wb.save('test.xlsx')
特別注意:
大家在用Python操作Excel時,請務必將相應的文檔關閉。如果你操作的文檔已經被打開了,那么代碼運行是會報錯退出的。如遇報錯,請檢查是否關閉了Excel文檔 。
以上代碼比較簡單,只有一個新知識點需要說明一下,我們以前也使用for
循環去遍歷列表,這里和以往不同的地方在於我們在in
之后調用了一個enumerate
函數,該函數的作用是可以返回兩個參數,第一個參數是返回元素在列表中的索引,即序號,第二個參數才是元素的內容,即元素的值。
大家如果對這個用法不熟悉,可以稍加練習一下
1infos = ["Python", "Java", "C", "C++", "Go"]
2for i, item in enumerate(infos):
3 print(i, item)
輸出結果
10 Python
21 Java
32 C
43 C++
54 Go
美化
這里簡單說一下關於美化的問題,我們的Excel表格沒有加邊框,看起來沒有主次感覺,我們可以添加一點代碼美化一下
1import openpyxl as exl
2# 導入openpyxl庫的styles模塊
3import openpyxl.styles as sl
4
5# 創建一個存放數據的列表,該列表中元素也是一個列表,每一個元素代碼一行數據
6data = [
7 ['學號', '姓名', '語文', '數學', '英語'],
8 ['201901', '張三', 90, 68.5, 95],
9 ['201902', '李四', 50, 71, 83],
10 ['201903', '王五', 73, 91, 69],
11 ['201904', '趙六', 85.6, 36, 77],
12]
13
14
15# 定義一個函數,用於寫入一行數據
16def write_row(i, row):
17 # 獲取全局變量sheet, align, side, border
18 global sheet, align, side, border
19 sheet['A' + i] = row[0]
20 sheet['A' + i].border = border
21 sheet['A' + i].alignment = align
22
23 sheet['B' + i] = row[1]
24 sheet['B' + i].border = border
25 sheet['B' + i].alignment = align
26
27 sheet['C' + i] = row[2]
28 sheet['C' + i].border = border
29 sheet['C' + i].alignment = align
30
31 sheet['D' + i] = row[3]
32 sheet['D' + i].border = border
33 sheet['D' + i].alignment = align
34
35 sheet['E' + i] = row[4]
36 sheet['E' + i].border = border
37 sheet['E' + i].alignment = align
38
39
40# 創建一個工作簿對象
41wb = exl.Workbook()
42
43# 創建一個激活的sheet表
44sheet = wb.active
45# 給sheet表取一個名字
46sheet.title = '一班'
47
48# 設置單元格文本對齊方式,這里設置橫向和水平都居中
49align = sl.Alignment(horizontal='center', vertical='center', wrap_text=True)
50
51# 設置邊框線的樣式和顏色
52side = sl.Side(border_style='thin', color='FF000000')
53
54# 設置單元格的上下左右四個方向都加邊框線
55border = sl.Border(left=side, right=side, top=side, bottom=side)
56
57for index, line in enumerate(data):
58 print(index, line)
59 write_row(str(index + 1), line)
60
61wb.save('test.xlsx')
更多的樣式設置方式,請大家查詢openpyxl
庫的文檔進行學習 openpyxl 文檔https://openpyxl.readthedocs.io/en/stable/tutorial.htm
讀Excel文檔
我們上面已經學會了寫,現在來學習一下怎么去讀取Excel文檔。
1import openpyxl as exl
2
3# 根據文件名打開一個Excel工作簿,並返回工作簿對象
4wb = exl.load_workbook('test.xlsx')
5
6# 根據sheet表的名字,獲取到指定的sheet表
7sheet = wb['一班']
8
9# sheet.rows返回當前sheet表的所有行,我們將其轉換為一個列表方便操作
10# 列表中的每一個元素就是一行數據
11all_row = list(sheet.rows)
12
13# 取第二行第一列單元格中的值
14print(all_row[1][0].value)
輸出結果:
1201901
以上代碼中,大家可能看不習慣一種寫法,這里多寫多看就會習慣,這種語法正是Python簡潔的特性。
1# 簡潔表達
2print(all_row[1][0].value)
3
4# 相當於以下寫法
5# 取全部行列表中的第二個元素,即第二行
6line = all_row[1]
7
8# 該行也是列表,取第一個元素,則相當於第二行第一列。
9# 由於這個列表中的元素是單元格對象,並不是字符串,因此需要調用其value屬性獲取單元格的值
10print(line[0].value)
以上代碼是純手工取值的,接下來我們通過循環去自動遍歷全部值
1import openpyxl as exl
2
3# 根據文件名打開一個Excel工作簿,並返回工作簿對象
4wb = exl.load_workbook('test.xlsx')
5
6# 根據sheet表的名字,獲取到指定的sheet表
7sheet = wb['一班']
8
9# sheet.rows返回當前sheet表的所有行,並將其轉換為一個列表,列表中的每一個元素就是一行數據
10all_row = list(sheet.rows)
11
12for cell in all_row:
13 print(cell[0].value, cell[1].value, cell[2].value, cell[3].value, cell[4].value)
輸出結果:
1學號 姓名 語文 數學 英語
2201901 張三 90 68.5 95
3201902 李四 50 71 83
4201903 王五 73 91 69
5201904 趙六 85.6 36 77
現在讓我們利用代碼,做一點實際應用
1import openpyxl as exl
2
3# 根據文件名打開一個Excel工作簿,並返回工作簿對象
4wb = exl.load_workbook('test.xlsx')
5
6# 根據sheet表的名字,獲取到指定的sheet表
7sheet = wb['一班']
8
9# sheet.rows返回當前sheet表的所有行,並將其轉換為一個列表,列表中的每一個元素就是一行數據
10all_row = list(sheet.rows)
11
12for i, cell in enumerate(all_row):
13 # 跳過第一行表頭(i等於0時,是表頭)
14 if i != 0:
15 # 給每個人算一下三門課總分
16 count = cell[2].value + cell[3].value + cell[4].value
17 print(cell[1].value, count)
18
19sum = 0
20# 計算一班所有人的語文平均分。
21for i, cell in enumerate(all_row):
22 # 跳過第一行表頭(i等於0時,是表頭)
23 if i != 0:
24 # 使用累加法,求得所有人的語文成績總和
25 sum += cell[2].value
26
27# 使用內置函數len 獲取列表中的元素個數,即總行數
28lenght = len(all_row)
29
30# 求平均分,除以總人數。總行數要減去表頭那行
31print("語文平均分", sum / (lenght - 1))
輸出結果:
1張三 253.5
2李四 204
3王五 233
4趙六 198.6
5語文平均分 74.65
我們今天學習的內容是很有實用性的,特別有用的一種情景是,當100個人每人填完了一份Excel文檔發給你匯總時,你只需要簡單的幾行Python代碼,就能將提交的這一百份Excel文檔合並成一份總的Excel文檔。