(一) 常遇到的情況
就我自己來說,常遇到的情況可能就下面幾種:
- 讀取excel整個sheet頁的數據。
- 讀取指定行、列的數據
- 往一個空白的excel文檔寫數據
- 往一個已經有數據的excel文檔追加數據
下面就以這幾種情況為例進行說明。
(二) 涉及的模塊及函數說明
就我知道的,有3個模塊可以操作excel文檔,3個模塊通過pip都可以直接安裝。
xlrd:讀數據
xlwt:寫數據
openpyxl:可以讀數據,也可以寫數據
這里就就只說明openpyxl了,因為這個模塊能滿足上面的需要了。
openpyxl函數
函數 |
說明 |
load_workbook(filename) |
打開excel,並返回所有sheet頁 訪問指定sheet頁的方法: #打開excel文檔 #關閉excel文檔 wb.close() |
Workbook() |
創建excel文檔 wb = openpyxl.Workbook() #保存excel文檔 wb.save('文件名.xlsx') |
下面的函數是針對sheet頁的 sheet = wb[‘sheet頁的名稱’] 訪問指定單元格的方式sheet['A1']、sheet['B1']... |
|
min_row |
返回包含數據的最小行索引,索引從1開始 例如:sheet.min_row |
max_row |
返回包含數據的最大行索引,索引從1開始 |
min_column |
返回包含數據的最小列索引,索引從1開始 |
max_column |
返回包含數據的最大列索引,索引從1開始 |
values |
獲取excel文檔所有的數據,返回的是一個generator對象 |
iter_rows(min_row=None, max_row=None, min_col=None, max_col=None)
|
min_row:最小行索引 max_row:最大行索引 min_col:最小列索引 max_col:最大列索引 獲取指定行、列的單元格,沒指定就是獲取所有的 |
現在我有這么一個excel,下面以這個excel進行說明。
關於min_row、max_row這些,看下面的輸出就很直觀了
1 import openpyxl 2 3 def get_data_openpyxl(file_name,sheet): 4 #打開excel文檔 5 wb = openpyxl.load_workbook(file_name) 6 #訪問sheet頁 7 sheet = wb[sheet] 8 # 包含數據的最小行索引,從1開始 9 minRow = sheet.min_row 10 print("最小行索引是:", minRow) 11 #包含數據的最大行索引,從1開始 12 maxRow = sheet.max_row 13 print("最大行索引是:",maxRow) 14 #包含數據的最小列索引 15 minColumn = sheet.min_column 16 print("最小列索引是:",minColumn) 17 #包含數據的最大列索引 18 maxColumn = sheet.max_column 19 print("最大列索引是:", maxColumn) 20 wb.close() 21 get_data_openpyxl('測試.xlsx','Sheet')
(三) 讀取excel整個sheet頁的數據
下面的代碼都是沒加異常處理的,要加的話自己看情況加上異常處理就行了。
1 import openpyxl 2 3 def get_data_openpyxl(file_name,sheet): 4 #打開excel文檔 5 wb = openpyxl.load_workbook(file_name) 6 #訪問sheet頁 7 sheet = wb[sheet] 8 # 獲取excel文檔所有的數據,返回的是一個generator對象 9 data = sheet.values 10 print(data) 11 #迭代輸出所有數據 12 for i in data: 13 print(i) 14 wb.close() 15 get_data_openpyxl('測試.xlsx','Sheet')
(四) 讀取指定行、列的數據
這里有個問題就是,openpyxl模塊貌似沒有讀取指定行、列數據的函數,不過沒關系,自己封裝一個函數去實現就行了,這個是通用的(前提是已經安裝openpyxl),可以創建一個類(可以根據函數的作用創建多個不同的類,這個看自己了),放一些自己寫的常用函數。
1 import openpyxl 2 3 def get_data_iter(file_name,sheet, max_row=None,min_row=None,max_col=None,min_col=None): 4 ''' 5 6 :param file_name: excel文件名稱 7 :param sheet: sheet頁名稱 8 :param max_row:最大行索引,未指定則獲取所有行的數據 9 :param min_row: 最小行索引,未指定則從第一行開始 10 :param min_col:最小列索引,未指定則從第一列開始 11 :param max_col:最大列索引,未指定則獲取所有列的數據 12 :return:返回指定行、列的數據 13 ''' 14 # 打開excel文檔 15 wb = openpyxl.load_workbook(file_name) 16 # 訪問sheet頁 17 sheet = wb[sheet] 18 # 獲得指定行列的單元格 19 cell = sheet.iter_rows(max_row=max_row, min_row=min_row, max_col=max_col, min_col=min_col) 20 all_rows = [] 21 # 獲取單元格的值 22 for row in cell: 23 rows = [] 24 for c in row: 25 rows.append(c.value) 26 all_rows.append(tuple(rows)) 27 wb.close() 28 return all_rows 29 30 rows = get_data_iter('測試.xlsx','Sheet',max_row=10,min_row=5,max_col=3,min_col=1) 31 print(rows) 32 for i in rows: 33 print(i)
(五) 往空白的excel文檔寫數據
1 import openpyxl 2 3 #創建excel文檔 4 wb =openpyxl.Workbook() 5 sheet = wb['Sheet'] 6 sheet['A1'] = '顏色' 7 sheet['B1'] = '版本' 8 x = 2 9 for i in range(10): 10 sheet['A'+str(x)] = i+1 11 sheet['B'+str(x)] = i+1 12 x += 1 13 14 wb.save('測試寫數據.xlsx')
執行后,可以在當前工作目錄下看到這個excel文檔
(六) 往一個已經有數據的excel文檔追加數據
要追加數據的話,獲取已經有數據的最大索引就行了,從下一行開始添加數據,這里X的初始值忘記加1了,代碼就不修改了,能看明白就行了
1 import openpyxl 2 3 # 打開excel文檔 4 wb = openpyxl.load_workbook('測試寫數據.xlsx') 5 # 訪問sheet頁 6 sheet = wb['Sheet'] 7 #獲取最大行索引 8 maxRow = sheet.max_row 9 x = maxRow 10 for i in range(10): 11 sheet['A'+str(x)] = '追加數據' 12 sheet['B'+str(x)] = '追加數據' 13 x += 1 14 15 wb.save('測試寫數據.xlsx')
執行完后: