最詳細的Excel模塊Openpyxl教程——基礎操作

在以前的推文中,我們介紹了操作Excel的模塊Xlwings的知識,相關推文可以從本公眾號的底部相關菜單獲取。有小伙伴反映自己在一些文章中看到openpyxl也能對Excel進行相關的操作,于是留言想在本公眾號里也能看到相關的教程。于是我開始了本專題的寫作。另外,在推文《操作Excel的Xlwings教程(一)》中,我對比了幾種操作Excel的模塊,大家可以去了解一下。

1.openpyxl簡介

openpyxl是用于讀取/寫入Excel 2010 xlsx/xlsm文件的Python庫,也就是說openpyxl這個Python庫不支持xls文件的讀取和操作,如果在工作中遇到xls文件我們就不能使用這個庫。官方說它的誕生是因為缺少可從Python本地讀取/寫入Office Open XML格式的庫,為了方便大家就開發了這個庫,這是非常棒的。

2.文件轉換

上述提到openpyxl只能操作xlsx文件,當我們遇到xls文件的時候就需要進行轉化,轉換方式這里提供幾種方案供大家參考:

方法一:手動打開xlsx文件,然后另存為xlsx類型的文件。

方法二:使用pywin32模塊進行轉換,示例代碼如下:

import os
import win32com.client as win32
filename = r'C:\Users\XH\Desktop\1.xls'
Excelapp = win32.gencache.EnsureDispatch('Excel.Application')
workbook = Excelapp.Workbooks.Open(filename)
# 轉xlsx時: FileFormat=51,
# 轉xls時:  FileFormat=56,
workbook.SaveAs(filename.replace('xls', 'xlsx'), FileFormat=51)
workbook.Close()
Excelapp.Application.Quit()
# 刪除源文件
# os.remove(filename)

# 如果想將xlsx的文件轉換為xls的話,則可以使用以下的代碼:
# workbook.SaveAs(filename.replace('xlsx', 'xls'), FileFormat=56)

方法三:使用pandas模塊進行轉換,代碼如下:

import pandas as pd
filename = r'C:\Users\XH\Desktop\1.xls'
filename2 = r'C:\Users\XH\Desktop\1.xlsx'
read_res = pd.read_excel(filename)
read_res.to_excel(filename2, index=False)

方法三在很多情況下出現一定的錯誤,比如在很多時候因為源表格的問題會造成數據丟失類的錯誤。個人推薦使用第二種方法。

3.基本操作-創建工作簿

安裝openpyxl這個模塊非常簡單,cmd窗口中輸入: pip install openpyxl。無需在文件系統上創建文件即可開始使用openpyxl。接下來我們來進行一個簡單操作:

1、創建一個新的名為Mytest.xlsx文件。

2、在工作簿上第一個位置新建一個名為“mytest”的sheet頁。

我們可以這樣來實現,代碼中每一個操作上都有相應的注釋:

from openpyxl import Workbook
# 創建一個工作簿對象
wb = Workbook()
# 在索引為0的位置創建一個名為mytest的sheet頁
ws = wb.create_sheet('mytest',0)
# 對sheet頁設置一個顏色(16位的RGB顏色)
ws.sheet_properties.tabColor = 'ff72BA'
# 將創建的工作簿保存為Mytest.xlsx
wb.save('Mytest.xlsx')
# 最后關閉文件
wb.close()

最后生成的文件樣式如下:

那么打開已有的文件Mytest.xlsx,讀取一些信息怎么操作呢?我們可以這樣:

from openpyxl import load_workbook
# 加載工作簿
wb2 = load_workbook('Mytest.xlsx')
# 獲取sheet頁
ws2 = wb2['mytest']
ws3 = wb2.get_sheet_by_name('mytest')
# 打印sheet頁的顏色屬性值
print('color:',ws2.sheet_properties.tabColor)
wb2.close()

上述代碼的輸出如下,可以看到一些屬性值或參數:

color: <openpyxl.styles.colors.Color object>
Parameters:
rgb='00ff72BA', indexed=None, auto=None, theme=None, tint=0.0, type='rgb'

另外,有些小伙伴可能看到上述代碼中,ws2和ws3都是獲取sheet頁簽的。的確這兩種方法的效果是一樣的,大家在平時的工作中都可以使用。

如果想獲取這個工作簿的所有sheet頁,可以這樣:

print(wb2.sheetnames)

注意sheetnames屬性值是一個列表,輸出的結果為一個列表:['mytest', 'Sheet']使用for循環也是可以的:

for each_sheet in wb2.sheetnames:
    print('each_sheet:',each_sheet)

4.基本操作-訪問單元格

使openpyxl訪問單元格很簡單,分單個單元格訪問和多個單元格的訪問。我們接著來學習:訪問單元格的方式一般也有兩種做法:假設現在我們要訪問單個單元格A1,我們可以這樣:

cell_1 = ws2['A1']cell_2 = ws2.cell(row=1, column=1)

如果要取得這個單元格的內容,只需要在結尾加上value屬性就可以了:

value_1 = ws2['A1'].value
value_2 = ws2.cell(row=1, column=1).value

如果需要給單元格進行設置值,則可以這樣實現,比如給單元格A1設置內容:

ws2['A1'].value = 'python知識學堂'
ws2.cell(row=1, column=1).value ='python知識學堂'

對于多個單元格的設置就要借助for循環了。注意,設置后要保存工作簿,否則沒有效果。

多個單元格的獲取一般需要用到列表切片的知識或者使用for循環來進行:

# 訪問A1至C3范圍單元格
cell_range = ws2['A1':'C3']
# 訪問A列所有存在數據的單元格
colA = ws2['A']
# 訪問A列到C列所有存在數據的單元格
col_range = ws2['A:C']
# 訪問第1行所有存在數據的單元格
row1 = ws2[1]
# 訪問第1行至第5行所有存在數據的單元格
row_range = ws2[1:5]

注意,上述cell_range等對象都是<class 'tuple'>類型的。如果先獲取這些單元格中的值,我們可以這樣:

for each_cell in cell_range:
    for each in each_cell:
     print(each.value)

for each_cell in colA:
    print(each_cell.value)
image.gif

至于為什么獲取cell_range和colA的for循序的次數不一樣,這個問題就留給大家自己了。

for循環的方式訪問多個單元格可以這樣:

for row in ws2.iter_rows(min_row=1, max_col=2, max_row=2):
    for cell in row:
        print(cell)
#輸出:
<Cell 'mytest'.A1>
<Cell 'mytest'.B1>
<Cell 'mytest'.A2>
<Cell 'mytest'.B2>

for col in ws2.iter_cols(min_row=1, max_col=2, max_row=2):
         for cell in col:
             print(cell)
#輸出:
<Cell 'mytest'.A1>
<Cell 'mytest'.A2>
<Cell 'mytest'.B1>
<Cell 'mytest'.B2>

這兩個方法是按行優先和列優先的順序進行訪問單元格的。

大家可以新建一個工作簿,然后在工作簿中寫入一些數據,之后運行以下代碼看看打印一些什么:

print(tuple(ws2.rows))
print(tuple(ws2.columns))

注意:ws2.rows和ws2.columns是generator對象,因此需要使用tuple進行“解析”下。

5.最后的注意

使用openpyxl進行工作的時候,當一個工作結束的時候我們需要進行Excel文件的保存操作:wb.save('Mytest.xlsx')這個保存唯一需要注意的是:文件是默認替換的。也就是說我們在保存文件的時候,openpyxl將進行替換而不發出告警。如果大家想保存不同階段的文件,則可以在保存文件的時候加一個時間戳。

6.總結

以上就是本次的推文,推文介紹的內容比較簡單,大家跟著學習的時候最好也跟著實踐一下。后期我們將繼續介紹其他方面的知識。比如在Excel中使用公式,合并單元格等操作。大家在學習的時候有什么疑問,也歡迎在評論區留言。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容