python 的 openpyxl模塊 讀取 Excel文件的方法
Python 的 openpyxl 模塊可以讓我們能讀取和修改 Excel 文件。
首先讓我們先理解一些 Excel 基礎(chǔ)概念。
1 Excel 基礎(chǔ)概念
Excel 文件也稱做為工作簿。每個工作簿可以包含多個工作表(Sheet)。用戶當(dāng)前查看的表或關(guān)閉 Excel 前最后查看的表,稱為活動表。
每一張表都是由列和行構(gòu)成的。列是以 A 開始的字母表示;而行是以 1 開始的數(shù)字表示的。由特定行和列所指定的方格稱為單元格。每個單元格都可以包含一個數(shù)字或文本。這些單元格就構(gòu)成了這張表。
2 安裝 openpyxl
通過 pip 就可以安裝最新版的 openpyxl。
pip install openpyxl
3 讀取 Excel
假設(shè)有這樣一份世界人口統(tǒng)計 Excel 文檔,內(nèi)容如下:
3.1 加載
wb = openpyxl.load_workbook('population.xlsx') print('wb 類型 :') print(type(wb), '\n')
運(yùn)行結(jié)果:
wb 類型 : <class 'openpyxl.workbook.workbook.Workbook'>
導(dǎo)入 openpyxl 模塊之后,就可以使用 openpyxl.load_workbook()
函數(shù)來加載 Excel 文檔咯。這個 Excel 文件表示為 Workbook 對象。
注意:load_workbook()
函數(shù)中的文件,必須在當(dāng)前工作目錄??梢詫?dǎo)入 os 模塊,利用 os.getcwd() 來獲悉當(dāng)前工作目錄。os 還提供了 chdir() 方法,可以改變當(dāng)前工作目錄。
import os print('當(dāng)前工作目錄 :') print(os.getcwd(), '\n')
運(yùn)行結(jié)果:
3.2 讀取 Excel 工作表(sheet)
... print('取得所有工作表的表名 :') print(wb.sheetnames, '\n') print('取得某張工作表 :') sheet = wb['Sheet3'] print(type(sheet)) print('表名 - ' + sheet.title, '\n') print('取得活動工作表 :') active_sheet = wb.active print('表名 - ' + active_sheet.title, '\n')
運(yùn)行結(jié)果:
取得所有工作表的表名 : ['Sheet1', 'Sheet2', 'Sheet3']
取得某張工作表 : <class 'openpyxl.worksheet.worksheet.Worksheet'>
表名 - Sheet3
取得活動工作表 : 表名 - Sheet1
- Workbook 對象的 sheetnames 屬性可以獲取所有 sheet 表的表名列表。
- Workbook 對象的 active 屬性,會獲取當(dāng)前活動表,即打開 Excel 時出現(xiàn)的工作表。
- 獲取 Worksheet 對象后,我們就可以通過 title 屬性得到 sheet 的名稱。
3.3 讀取單元格 (Cell)
... print('取得 A1 單元格 :') cell = active_sheet['A1'] print(cell) print(cell.value, '\n') print('取得 B1 單元格 :') cell = active_sheet['B1'] print(cell) print(cell.value, '\n') print('行號為 ' + str(cell.row) + ',列號為 ' + str(cell.column) + ' 的單元格,其值為 ' + cell.value, '\n') print('單元格 ' + cell.coordinate + ' 其值為 ' + cell.value, '\n') print('取得 C1 單元格的值 :') print(active_sheet['C1'].value, '\n') print('通過指定行與列,來獲取單元格:') print(active_sheet.cell(row=1, column=2)) print(active_sheet.cell(row=1, column=2).value) print('迭代行與列,來獲取單元格的值:') for i in range(1, 8, 2): print(i, active_sheet.cell(row=i, column=2).value) print('\n')
運(yùn)行結(jié)果:
取得 A1 單元格 : <Cell 'Sheet1'.A1> 排名
取得 B1 單元格 : <Cell 'Sheet1'.B1> 國家
行號為 1,列號為 2 的單元格,其值為 國家
單元格 B1 其值為 國家
取得 C1 單元格的值 : 人口
通過指定行與列,來獲取單元格: <Cell 'Sheet1'.B1> 國家 迭代行與列,來獲取單元格的值: 1 國家 3 印度 5 印度尼西亞 7 巴基斯坦
可以通過單元格的名字(比如:A1)來獲取 Cell 對象。
- Cell 對象的 value 屬性,存放的是該單元格中所保存的值。
- Cell 對象的 row、 column 和 coordinate 屬性,存放的是該單元格的位置信息。
- 用字母來指定列比較奇怪,因此我們也可以通過 sheet 的 cell 方法直接指定行(row)與列(column),來獲取單元格 Cell 對象。
3.4 獲取工作表大小
print('獲取工作表的大小:') print('總行數(shù) -> ' + str(active_sheet.max_row)) print('總列數(shù) -> ' + str(active_sheet.max_column))
運(yùn)行結(jié)果:
獲取工作表的大小: 總行數(shù) -> 11 總列數(shù) -> 4
Worksheet 對象的 max_row 與 max_column,可以獲取工作表的總行數(shù)與總列數(shù),即工作表的大小。
3.5 列轉(zhuǎn)換函數(shù)
openpyxl 提供了兩個函數(shù),用于轉(zhuǎn)換列號:
- openpyxl.utils.get_column_letter -> 會把數(shù)字轉(zhuǎn)化為字母。
- openpyxl.utils.column_index_from_string -> 會把字母轉(zhuǎn)化為數(shù)字。
import openpyxl from openpyxl.utils import get_column_letter, column_index_from_string ... print('列轉(zhuǎn)換函數(shù):') print('[數(shù)字轉(zhuǎn)換為字母]') print('第 1 列 -> ' + get_column_letter(1)) print('第 2 列 -> ' + get_column_letter(2)) print('第 37 列 -> ' + get_column_letter(37)) print('第 818 列 -> ' + get_column_letter(818)) print('[字母轉(zhuǎn)換為數(shù)字]') print('第 A 列 -> ' + str(column_index_from_string('A'))) print('第 CC 列 -> ' + str(column_index_from_string('CC')))
運(yùn)行結(jié)果:
[數(shù)字轉(zhuǎn)換為字母] 第 1 列 -> A 第 2 列 -> B 第 37 列 -> AK 第 818 列 -> AEL [字母轉(zhuǎn)換為數(shù)字] 第 A 列 -> 1 第 CC 列 -> 81
3.6 切片
我們可以對 Worksheet 對象切片,取得表格中的一個矩形區(qū)域,迭代遍歷這個區(qū)域中的所有 Cell 對象。
print(tuple(active_sheet['A2':'D4'])) for row_objects in active_sheet['A2':'D4']: for cell_object in row_objects: print(cell_object.coordinate, cell_object.value) print('-- 當(dāng)前行獲取結(jié)束 --')
運(yùn)行結(jié)果:
((<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.D2>), (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.D3>), (<Cell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>, <Cell 'Sheet1'.D4>)) A2 1 B2 中國 C2 13.83億人(2016) D2 9634057 -- 當(dāng)前行獲取結(jié)束 -- A3 2 B3 印度 C3 1339180127 D3 2973190 -- 當(dāng)前行獲取結(jié)束 -- A4 3 B4 美國 C4 324459463 D4 9147420 -- 當(dāng)前行獲取結(jié)束 --
- 這里首先通過 tuple() 方法,展示出了切片后的所有 Cell 對象。
- 然后使用了兩個 for 循環(huán),外層 for 循環(huán)會遍歷這個切片中的每一行;而內(nèi)層 for 循環(huán)會遍歷該行中的每個單元格。
3.7 獲取指定行或指定列
我們可以使用 Worksheet 對象的 rows 和 columns 屬性,來獲取指定行或者列:
print('獲取特定行:') print(list(active_sheet.rows)[2]) for cell_object in list(active_sheet.rows)[2]: print(cell_object.value) print('獲取特定列:') print(list(active_sheet.columns)[2]) for cell_object in list(active_sheet.columns)[2]: print(cell_object.value)
運(yùn)行結(jié)果:
獲取特定行: (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.D3>) 2 印度 1339180127 2973190 獲取特定列: (<Cell 'Sheet1'.C1>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.C4>, <Cell 'Sheet1'.C5>, <Cell 'Sheet1'.C6>, <Cell 'Sheet1'.C7>, <Cell 'Sheet1'.C8>, <Cell 'Sheet1'.C9>, <Cell 'Sheet1'.C10>, <Cell 'Sheet1'.C11>) 人口 13.83億人(2016) 1339180127 324459463 263991379 209288278 197015955 190886311 164669751 143989754 129163276
- Worksheet 對象的 rows 或者 columns 屬性,都會返回一個由 “行元組” 構(gòu)成的元組。每個行元組都擁有該行中的所有 Cell 對象。
- 可以通過行元組的下標(biāo),來訪問具體的 Cell 對象。
讀取 Excel 步驟,總結(jié)如下:
- 導(dǎo)入 openpyxl 模塊。調(diào)用 openpyxl.load_workbook() 函數(shù),加載 excel 文檔,獲取 Workbook 對象。
- 調(diào)用 workbook#active 或 workbook[${sheet_name}],獲取 sheet 工作簿。
- 傳入 row 和 column 關(guān)鍵字參數(shù)并調(diào)用索引或工作表的 cell() 方法,獲取 Cell 對象。
- 有了 Cell 對象,就可以執(zhí)行具體的業(yè)務(wù)邏輯咯。
總結(jié)
以上所述是小編給大家介紹的python 的 openpyxl模塊 讀取 Excel文件的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
python+selenium 腳本實現(xiàn)每天自動登記的思路詳解
這篇文章主要介紹了python+selenium 腳本實現(xiàn)每天自動登記,本文你給大家分享基本的思路,通過實例代碼截圖的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03django 連接數(shù)據(jù)庫 sqlite的例子
今天小編就為大家分享一篇django 連接數(shù)據(jù)庫 sqlite的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08