Python筆記(十四):操作excel openpyxl模塊


(一)  常遇到的情況

        就我自己來說,常遇到的情況可能就下面幾種:

  1. 讀取excel整個sheet頁的數據。
  2. 讀取指定行、列的數據
  3. 往一個空白的excel文檔寫數據
  4. 往一個已經有數據的excel文檔追加數據

下面就以這幾種情況為例進行說明。

(二)  涉及的模塊及函數說明

就我知道的,有3個模塊可以操作excel文檔,3個模塊通過pip都可以直接安裝。

xlrd:讀數據

xlwt:寫數據

openpyxl:可以讀數據,也可以寫數據

這里就就只說明openpyxl了,因為這個模塊能滿足上面的需要了。

openpyxl函數

函數

說明

load_workbook(filename)

打開excel,並返回所有sheet頁

訪問指定sheet頁的方法:

#打開excel文檔
wb = openpyxl.load_workbook(file_name)
#訪問sheet頁
sheet = wb[‘sheet頁的名稱’]

#關閉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')

執行完后:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM