OpenPyXL的使用教程(一)

最近在網(wǎng)上爬取奧運(yùn)項(xiàng)目資料矛市,并寫入Excel中界牡。在寫到Excel中是用到了OpenPyXL淤齐,翻譯了一部分自己用到的知識(shí)點(diǎn)。

創(chuàng)建一個(gè)工作簿


  • 使用openpyxl沒有必要先在系統(tǒng)中新建一個(gè).xlsx潮饱,我們需要做的只需要引入Workbook這個(gè)類,接著開始調(diào)用它诫给。
>>> from openpyxl import Workbook
>>> wb = Workbook()
  • 一個(gè)工作簿(workbook)在創(chuàng)建的時(shí)候同時(shí)至少也新建了一張工作表(worksheet)香拉。你可以通過openpyxl.workbook.Workbook.active()調(diào)用得到正在運(yùn)行的工作表。
>>> ws = wb.active

注意:該函數(shù)調(diào)用工作表的索引(_active_sheet_index)中狂,默認(rèn)是0凫碌。除非你修改了這個(gè)值,否則你使用該函數(shù)一直是在對(duì)第一張工作表進(jìn)行操作胃榕。

  • 使用openpyxl.workbook.Workbook.create_sheet()新建一張表
>>> ws1 = wb.create_sheet() #默認(rèn)插在工作簿末尾
# or
>>> ws2 = wb.create_sheet(0) # 插入在工作簿的第一個(gè)位置
  • 在創(chuàng)建工作表的時(shí)候系統(tǒng)自動(dòng)命名盛险。他們按照序列依次命名 (Sheet, Sheet1, Sheet2, ...)。你可以通過調(diào)用下面的屬性修改工作表的名稱:
ws.title = "New Title"
  • 標(biāo)簽欄的背景色默認(rèn)為白色勋又。你可以通過提供一個(gè)RRGGBB顏色碼改變標(biāo)簽欄的字體顏色:
ws.sheet_properties.tabColor = "1072BA"
修改顏色效果.png
  • 一旦你獲取工作表的名字苦掘,你可以通過workbook的key或者** openpyxl.workbook.Workbook.get_sheet_by_name()
    **方法得到該工作表
>>> ws3 = wb["New Title"]
>>> ws4 = wb.get_sheet_by_name("New Title")
>>> ws is ws3 is ws4
True
  • 你可以通過**openpyxl.workbook.Workbook.get_sheet_names()
    **方法得到工作簿的所有工作表。
>>> print(wb.get_sheet_names())
['Sheet2', 'New Title', 'Sheet1']

你也可以循環(huán)得到所有的工作表

>>> for sheet in wb:
              print(sheet.title)

操作數(shù)據(jù)


使用一個(gè)單元格

現(xiàn)在我們已經(jīng)知道如何使用一張工作表了楔壤,下面我我們開始修改工作表中單元格的內(nèi)容

  • 單元格可以直接根據(jù)他們的索引直接獲得
>>> c = ws['A4']

通過上述的語句鹤啡,將返回在A4處的單元格,如果不存在將在A4新建一個(gè)挺邀。* * 單元格的值也可以直接賦值

>>> ws['A4'] = 4
  • 還提供** openpyxl.worksheet.Worksheet.cell()
    **方法獲取單元格
>>> c = ws.cell('A4')
  • 也可以根據(jù)行列值獲取單元格
>>> d = ws.cell(row = 4, column = 2)

注意:當(dāng)一個(gè)工作表被創(chuàng)建是揉忘,其中不包含單元格。只有當(dāng)單元格被獲取是才被創(chuàng)建端铛。這種方式我們不會(huì)創(chuàng)建我們從不會(huì)使用的單元格泣矛,從而減少了內(nèi)存消耗。

警告:由于上述特性禾蚕,你如果遍歷了單元格而非想要使用它們也將會(huì)在內(nèi)存當(dāng)中創(chuàng)建您朽。比如下面:

>>> for i in range(1,101):
              for j in range(1,101):
                   ws.cell(row = i, column = j)

上述代碼將會(huì)在內(nèi)存中創(chuàng)建100*100個(gè)單元格。
當(dāng)然,這里也有方法來清理這些不想要的單元格哗总,在后續(xù)我們將會(huì)介紹几颜。

使用多個(gè)單元格
  • 使用切片獲取多個(gè)單元格
>>> cell_range = ws['A1':'C2']
  • 使用**openpyxl.worksheet.Worksheet.iter_rows()
    **方法獲得多個(gè)單元格
>>> tuple(ws.iter_rows('A1:C2'))
((<Cell Sheet1.A1>, <Cell Sheet1.B1>, <Cell Sheet1.C1>),
 (<Cell Sheet1.A2>, <Cell Sheet1.B2>, <Cell Sheet1.C2>))
>>> for row in ws.iter_rows('A1:C2'):
              for cell in row:
                    print cell
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
  • 如果你需要迭代文件中所有的行或者列,你可以使用openpyxl.worksheet.Worksheet.rows()
>>> ws = wb.active
>>> ws['C9'] = 'hello world'
>>> ws.rows
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
(<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))

或者使用openpyxl.worksheet.Worksheet.columns()方法

>>> ws.columns
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
<Cell Sheet.A4>,
<Cell Sheet.A5>,
<Cell Sheet.A6>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
<Cell Sheet.C2>,
<Cell Sheet.C3>,
<Cell Sheet.C4>,
<Cell Sheet.C5>,
<Cell Sheet.C6>,
<Cell Sheet.C7>,
<Cell Sheet.C8>,
<Cell Sheet.C9>))
數(shù)據(jù)存儲(chǔ)
  • 一旦我們有一個(gè)openpyxl.cell.Cell讯屈,我們可以直接為該單元格賦值
>>> c.value = 'hello, world'
>>> print(c.value)
'hello, world'
>>> d.value = 3.14
>>> print(d.value)
3.14
  • 你也可以使用Python中的其他類型和格式
>>> wb = Workbook(guess_types=True)
>>> c.value = '12%'
>>> print(c.value)
0.12
>>> import datetime
>>> d.value = datetime.datetime.now()
>>> print d.value
datetime.datetime(2010, 9, 10, 22, 25, 18)
>>> c.value = '31.50'
>>> print(c.value)
31.5

保存到文件


  • 保存工作簿最簡(jiǎn)單最安全的方式是使用openpyxl.workbook.Workbook的**openpyxl.workbook.Workbook.save()
    **方法
>>> wb = Workbook()
>>> wb.save('balances.xlsx')

蛋哭!特別警告:這個(gè)操作將會(huì)在沒有認(rèn)識(shí)提示的情況下用現(xiàn)在寫的內(nèi)容,覆蓋掉原文件中的所有內(nèi)容

  • 你也可以 as_template=True涮母,將文件保存稱為一個(gè)模板
>>> wb = load_workbook('document.xlsx')
>>> wb.save('document_template.xltx', as_template=True)
  • 如果as_template=False(默認(rèn))谆趾,則將文件或模板保存為文件
>>> wb = load_workbook('document_template.xltx')
>>> wb.save('document.xlsx', as_template=False)
>>> wb = load_workbook('document.xlsx')
>>> wb.save('new_document.xlsx', as_template=False)

警告:在保存文件到文件模板中的時(shí)候你應(yīng)該監(jiān)控?cái)?shù)據(jù)的屬性和文件擴(kuò)展名,反之亦然叛本;否則沪蓬,你得到的工作簿可能無法打開。
比如下面的:

>>> wb = load_workbook('document.xlsx')
>>> # Need to save with the extension *.xlsx
>>> wb.save('new_document.xlsm')
>>> # MS Excel can't open the document
>>>
>>> # or
>>>
>>> # Need specify attribute keep_vba=True
>>> wb = load_workbook('document.xlsm')
>>> wb.save('new_document.xlsm')
>>> # MS Excel can't open the document
>>>
>>> # or
>>>
>>> wb = load_workbook('document.xltm', keep_vba=True)
>>> # If us need template document, then we need specify extension as *.xltm.
>>> # If us need document, then we need specify attribute as_template=False.
>>> wb.save('new_document.xlsm', as_template=True)
>>> # MS Excel can't open the document

從文件中導(dǎo)入


  • 和寫入文件的方式相同来候,你可以引入openpyxl.load_workbook()來打開一個(gè)已經(jīng)存在的工作簿
>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
>>> print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']

翻譯原文


Manipulating a workbook in memory

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跷叉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子营搅,更是在濱河造成了極大的恐慌云挟,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剧防,死亡現(xiàn)場(chǎng)離奇詭異植锉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)峭拘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門俊庇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸡挠,你說我怎么就攤上這事辉饱。” “怎么了拣展?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵彭沼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我备埃,道長(zhǎng)姓惑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任按脚,我火速辦了婚禮于毙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辅搬。我一直安慰自己唯沮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著介蛉,像睡著了一般萌庆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上币旧,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天践险,我揣著相機(jī)與錄音,去河邊找鬼佳恬。 笑死捏境,一個(gè)胖子當(dāng)著我的面吹牛于游,可吹牛的內(nèi)容都是我干的毁葱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼贰剥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼倾剿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚌成,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤前痘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后担忧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芹缔,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年瓶盛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了最欠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惩猫,死狀恐怖芝硬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轧房,我是刑警寧澤拌阴,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站奶镶,受9級(jí)特大地震影響迟赃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厂镇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一纤壁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剪撬,春花似錦摄乒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斋否。三九已至,卻和暖如春拭荤,著一層夾襖步出監(jiān)牢的瞬間茵臭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工舅世, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旦委,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓雏亚,卻偏偏與公主長(zhǎng)得像缨硝,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罢低,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 使用首先需要了解他的工作原理 1.POI結(jié)構(gòu)與常用類 (1)創(chuàng)建Workbook和Sheet (2)創(chuàng)建單元格 (...
    長(zhǎng)城ol閱讀 8,402評(píng)論 2 25
  • 用openpyxl操作excel表格 openpyxl 是一個(gè)用來操作excel 2010 的xlsx/xlsm的...
    stone46閱讀 7,382評(píng)論 0 17
  • openpyxl中的三個(gè)概念: workbooks:excel工作表 sheets:工作表中的一張表頁 cells...
    henYee閱讀 6,523評(píng)論 2 0
  • 本例為設(shè)置密碼窗口 (1) If Application.InputBox(“請(qǐng)輸入密碼:”) = 1234 Th...
    浮浮塵塵閱讀 13,602評(píng)論 1 20
  • 原文鏈接 翻譯自官方文檔 開始在內(nèi)存中使用 創(chuàng)建一個(gè)workbook 在剛開始使用openpyxl的時(shí)候查辩,不需要直...
    TryEnough閱讀 32,934評(píng)論 1 44