最詳細的Excel模塊Openpyxl教程——基礎(chǔ)操作

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

1.openpyxl簡介

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

2.文件轉(zhuǎn)換

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

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

方法二:使用pywin32模塊進行轉(zhuǎn)換互墓,示例代碼如下:

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)
# 轉(zhuǎn)xlsx時: FileFormat=51,
# 轉(zhuǎn)xls時:  FileFormat=56,
workbook.SaveAs(filename.replace('xls', 'xlsx'), FileFormat=51)
workbook.Close()
Excelapp.Application.Quit()
# 刪除源文件
# os.remove(filename)

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

方法三:使用pandas模塊進行轉(zhuǎn)換蒋搜,代碼如下:

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)

方法三在很多情況下出現(xiàn)一定的錯誤篡撵,比如在很多時候因為源表格的問題會造成數(shù)據(jù)丟失類的錯誤。個人推薦使用第二種方法豆挽。

3.基本操作-創(chuàng)建工作簿

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

1膛檀、創(chuàng)建一個新的名為Mytest.xlsx文件。

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

我們可以這樣來實現(xiàn)互站,代碼中每一個操作上都有相應(yīng)的注釋:

from openpyxl import Workbook
# 創(chuàng)建一個工作簿對象
wb = Workbook()
# 在索引為0的位置創(chuàng)建一個名為mytest的sheet頁
ws = wb.create_sheet('mytest',0)
# 對sheet頁設(shè)置一個顏色(16位的RGB顏色)
ws.sheet_properties.tabColor = 'ff72BA'
# 將創(chuàng)建的工作簿保存為Mytest.xlsx
wb.save('Mytest.xlsx')
# 最后關(guān)閉文件
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()

上述代碼的輸出如下僵缺,可以看到一些屬性值或參數(shù):

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屬性值是一個列表之景,輸出的結(jié)果為一個列表:['mytest', 'Sheet']使用for循環(huán)也是可以的:

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

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

使openpyxl訪問單元格很簡單,分單個單元格訪問和多個單元格的訪問膏潮。我們接著來學(xué)習(xí):訪問單元格的方式一般也有兩種做法:假設(shè)現(xiàn)在我們要訪問單個單元格A1锻狗,我們可以這樣:

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

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

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

如果需要給單元格進行設(shè)置值焕参,則可以這樣實現(xiàn)轻纪,比如給單元格A1設(shè)置內(nèi)容:

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

對于多個單元格的設(shè)置就要借助for循環(huán)了。注意叠纷,設(shè)置后要保存工作簿刻帚,否則沒有效果。

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

# 訪問A1至C3范圍單元格
cell_range = ws2['A1':'C3']
# 訪問A列所有存在數(shù)據(jù)的單元格
colA = ws2['A']
# 訪問A列到C列所有存在數(shù)據(jù)的單元格
col_range = ws2['A:C']
# 訪問第1行所有存在數(shù)據(jù)的單元格
row1 = ws2[1]
# 訪問第1行至第5行所有存在數(shù)據(jù)的單元格
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循序的次數(shù)不一樣航厚,這個問題就留給大家自己了顷歌。

for循環(huán)的方式訪問多個單元格可以這樣:

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>

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

大家可以新建一個工作簿幔睬,然后在工作簿中寫入一些數(shù)據(jù)衙吩,之后運行以下代碼看看打印一些什么:

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

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

5.最后的注意

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

6.總結(jié)

以上就是本次的推文交胚,推文介紹的內(nèi)容比較簡單,大家跟著學(xué)習(xí)的時候最好也跟著實踐一下盈电。后期我們將繼續(xù)介紹其他方面的知識蝴簇。比如在Excel中使用公式,合并單元格等操作匆帚。大家在學(xué)習(xí)的時候有什么疑問熬词,也歡迎在評論區(qū)留言。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吸重,一起剝皮案震驚了整個濱河市互拾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嚎幸,老刑警劉巖颜矿,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嫉晶,居然都是意外死亡骑疆,警方通過查閱死者的電腦和手機替废,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門箍铭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舶担,你說我怎么就攤上這事”蛏耄” “怎么了衣陶?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闸氮。 經(jīng)常有香客問我剪况,道長,這世上最難降的妖魔是什么蒲跨? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任译断,我火速辦了婚禮,結(jié)果婚禮上或悲,老公的妹妹穿的比我還像新娘孙咪。我一直安慰自己,他們只是感情好巡语,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布翎蹈。 她就那樣靜靜地躺著,像睡著了一般男公。 火紅的嫁衣襯著肌膚如雪荤堪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音澄阳,去河邊找鬼拥知。 笑死,一個胖子當著我的面吹牛碎赢,可吹牛的內(nèi)容都是我干的低剔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼揩抡,長吁一口氣:“原來是場噩夢啊……” “哼户侥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起峦嗤,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蕊唐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烁设,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體替梨,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年装黑,在試婚紗的時候發(fā)現(xiàn)自己被綠了副瀑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡恋谭,死狀恐怖糠睡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疚颊,我是刑警寧澤狈孔,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站材义,受9級特大地震影響均抽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜其掂,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一油挥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧款熬,春花似錦深寥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盔夜,卻和暖如春负饲,著一層夾襖步出監(jiān)牢的瞬間堤魁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工返十, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妥泉,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓洞坑,卻偏偏與公主長得像盲链,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迟杂,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容