python操作excel

今天學(xué)習(xí)了下xlwings這個庫桶现,目的是為了讓計算機(jī)自動化操作excel表,當(dāng)某天需要做一些很繁瑣的事情卖词,就可以派上用場啦。

基本對象

網(wǎng)上刮來的圖,很好此蜈。

  • 大概就是xlwings中可以有多個excel程序即横。
  • 一個excel程序中可以有多個工作簿。
  • 一個工作簿中可以有多張表格裆赵。
  • 一張表格中的內(nèi)容就看你寫什么了东囚。

1.包肯定是要導(dǎo)入的

import xlwings as xw

2. 先創(chuàng)建一個app對象,就是打開一個excel程序战授。

>>>app = xw.App(visible=True,add_book=True)
>>>app
<Excel App 39156>

提醒:
  • 創(chuàng)建一個excel程序页藻,默認(rèn)會創(chuàng)建一個工作簿(book對象)。
  • 里面主要的兩個參數(shù),visible可不可見植兰,add_book添不添加book份帐,默認(rèn) 都是 True 。

看下app有什么方法

[ 'activate', 'api', 'books', 'calculate', 'calculation', 
'display_alerts', 'hwnd', 'impl', 'kill', 'macro', 'pid', 'quit', 'range', 
'screen_updating', 'selection', 'version', 'visible']
  • activate(steal_focus=False):激活工作簿楣导,里面有個參數(shù)废境,steal_focus,默認(rèn)為False,選擇True時筒繁,會獲取工作簿的焦點噩凹。

  • api:應(yīng)該是返回本地對象所使用引擎,我是window的office就跟下圖的結(jié)果.

    api方法

  • books:所有book對象的集合毡咏。

  • calculate():計算所有打開的books驮宴。

  • calculation:選擇或設(shè)置計算模式:manual(手動),automatic(自動)semiautomatic(半自動)。

  • display_alerts:默認(rèn)值為True,但為False時:當(dāng)excel響應(yīng)呕缭,會選擇默認(rèn)響應(yīng)堵泽。

  • hwnd:返回window的句柄。

  • kill():終止進(jìn)程臊旭,強制退出落恼。

  • macro(name):python調(diào)用excel中的自定義的Sub和function。

  • pid:返回app的pid离熏。

  • quit():在不保存的情況下佳谦,退出excel程序。

  • range:獲取當(dāng)前工作簿中的當(dāng)前表格中的范圍滋戳。

    一行钻蔑,一列,一個區(qū)域內(nèi)的范圍都能獲得

  • screen_updating:屏幕更新奸鸯,就是說你在excel表中的操作會實時更新咪笑,關(guān)閉實時更新可以加快腳本運行。默認(rèn)是True娄涩。

  • selection:將所選定的單元格(cells)以Range對象返回窗怒。

    選定了如下的表格
    運行結(jié)果顯

  • version:顯示xlwings版本映跟。
  • visiable:設(shè)置可不可見,默認(rèn)是True扬虚。

3. app中的book對象

我們就用剛剛app中創(chuàng)建的book對象
>>>wb = app.books[0]
>>>wb
<Book [工作簿1]>
當(dāng)然也可以這樣創(chuàng)建book對象
>>>wb =xw.Book()

比較下兩種創(chuàng)建對象方式
xw.Book xw.books
創(chuàng)建工作簿 xw.Book() xw.books.add()
還沒保存的工作簿 xw.Book('Book1') xw.books['Book1']
根據(jù)路徑打開工作簿 xw.Book(r'C:/path/to/file.xlsx') xw.books.open(r'C:/path/to/file.xlsx')
已經(jīng)打開的book數(shù)量 xw.books.count

在來看看book對象有什么方法

['activate', 'api', 'app', 'caller', 'close',
 'fullname', 'impl', 'macro', 'name','names',
 'open_template', 'save', 'selection', 'set_mock_caller', 'sheets']
  • activate(steal_focus=False):激活book努隙,可以選擇獲不獲取焦點。

  • api:返回正在使用的引擎的本地對象辜昵。

  • app:返回創(chuàng)建這個book的app對象荸镊。

  • caller():當(dāng)通過runpython從excel中調(diào)用python函數(shù)時,引用這個book堪置,還會將其打包成excel中的函數(shù)躬存。
    例子:

 import xlwings as xw
             def my_macro():
                wb = xw.Book.caller()
                wb.sheets[0].range('A1').value = 1

當(dāng)需要在調(diào)試的時候可以使用xw.set_mock_caller()函數(shù)。
*close():在沒有保存的情況下關(guān)閉舀锨。

*fullname:以字符串的形式返回對象的名稱跟路徑岭洲。

  • macro(name):python調(diào)用excel中的自定義的Sub和function。

  • name:返回book的名稱雁竞。

  • names:返回一個Names對象集合钦椭。

  • open_template:創(chuàng)建一個已經(jīng)包含xlwings VBA模塊的Excel文件(必須從交互式python shell中調(diào)用此方法)

  • save(path=None):保存工作簿,若為指定路徑碑诉,保存在當(dāng)前工作目錄彪腔。

  • selection:將所選定的單元格(cells)以Range對象返回。

  • set_mock_caller:設(shè)置用于調(diào)試caller()的excel文件进栽,可以直接在python里運行德挣。
    例子:

def my_macro():
    sht = xw.Book.caller().sheets[0]
    sht.range('A1').value = 'Hello xlwings!'
if __name__ == '__main__':
    xw.Book().set_mock_caller()
    my_macro()

調(diào)用函數(shù)會在A1格子上打印,hello xlwings.

  • sheets:返回所有的工作表(sheet)的集合快毛。


    sheets返回的對象

4.book中的sheet對象

同樣的格嗅,我們使用上面那個book對象。
>>>sht = wb.sheets[0]
>>>sht
<Sheet [工作簿1]Sheet1>


看下sheet中有什么方法

['activate', 'api', 'autofit', 'book', 'cells',
 'charts', 'clear', 'clear_contents', 'delete',
 'impl', 'index', 'name', 'names', 'pictures',
 'range', 'select', 'shapes', 'used_range']
  • activate(steal_focus=False):激活sheet,并返回唠帝,可以選擇獲不獲取焦點屯掖。

  • api:返回正在使用的引擎的本地對象。

  • autofit(axis=None):自動調(diào)整表中的行襟衰,列或兩者的寬度
    wb.sheets[0].autofit(axis='r'):自動匹配行
    wb.sheets[0].autofit(axis= 'c')自動匹配列
    wb.sheets[0].autofit()

  • book:返回創(chuàng)建這個表格的book對象贴铜。

  • cells:返回表示Sheet上所有單元格的Range對象(不僅僅是當(dāng)前使用的單元格)。

  • charts:sheet中的所有圖表集合瀑晒。

  • clear():清除整個sheet的內(nèi)容和格式绍坝。

  • clear_contents():清除整個sheet的內(nèi)容,但格式還在苔悦。

  • delete():刪除sheet轩褐。

  • index:返回sheet的索引。

  • name:獲取或設(shè)置sheet的名字玖详。

  • names:返回一個Names對象集合把介。

  • pictures:返回所有Pictures對象的集合勤讽。

  • range(cell1,cell2=None):在活動的sheet中返回一個Range對象。

  • select():選擇工作表拗踢。

  • shapes:返回所有Shapes對象的集合地技。

  • used_range:返回sheet中所有使用過的Range。

    used_range

5.sheet中Range對象

選了A1單元格
>>>r = sht.range('A1')
>>>r
<Range [工作簿1]Sheet1!A1>


看看Range對象的方法

[ 'add_hyperlink', 'address', 'api', 'autofit', 'clear', 'clear_contents',
 'color', 'column', 'column_width', 'columns', 'count', 'current_region', 'end', 
'expand', 'formula', 'formula_array', 'get_address', 'height', 'hyperlink', 
'impl', 'last_cell', 'left', 'name', 'number_format', 'offset', 'options', 
'raw_value', 'resize', 'row', 'row_height', 'rows', 'select', 'shape', 'sheet', 
'size', 'top', 'value', 'width']
  • add_hyperlink(address, text_to_display=None, screen_tip=None):在單元格上添加超鏈接秒拔。
    address:'超鏈接地址'。
    text_to_display:在單元格上顯示的文本飒硅。
    screen_tip:當(dāng)鼠標(biāo)懸停時砂缩,出現(xiàn)的提示。


  • address:以字符串的形式返回范圍
    >>> r.address
    '$A$1'
    返回了我們A1這個單元格的名稱三娩。

  • api:返回正在使用的引擎的本地對象庵芭。

  • autofit():
    自動調(diào)整Range內(nèi)所有單元格的寬度和高度
    自動調(diào)整列寬:xw.Range('A2:G9').columns.autofit()
    自動調(diào)整行寬:xw.Range('A2:G9').rows.autofit()

  • clear():刪除Range里的內(nèi)容和格式。

  • clear_contents():刪除Range里的內(nèi)容雀监,保留格式双吆。

  • color :獲取或者設(shè)置范圍里單元額的背景顏色。
    設(shè)置顏色時会前,可以使用RGB元組好乐,就像下面這樣。
    >>> r.color = (0,23,234)

    color

  • column:返回Range對象的第一列編號瓦宜。

    column

  • column_width:獲取或設(shè)置Range的寬度蔚万。
    如果范圍中的所有列具有相同的寬度,則返回寬度临庇。
    如果范圍中的列具有不同的寬度反璃,則返回None。

  • columns:返回一個RangeColumns對象,該對象表示指定范圍內(nèi)的列.

  • count返回單元格數(shù)量

  • current_region:返回一個Range對象假夺。選取的范圍跟在window中 Ctrl- *一樣淮蜈。

  • end(direction):返回一個Range對象。相當(dāng)于window中的Ctrl+Up, Ctrl+down, Ctrl+left, 或 Ctrl+right.

  • expand(mode='table'):根據(jù)選定的模式已卷,擴(kuò)展范圍梧田。
    A1單元格選擇'right'會擴(kuò)展成A1~B1。
    A1單元格選擇down會擴(kuò)展成A1~A2悼尾。

   >>> import xlwings as xw
   >>> wb = xw.Book()
   >>> xw.Range('A1').value = [[None, 1], [2, 3]]
   >>> xw.Range('A1').expand().address
   $A$1:$B$2
   >>> xw.Range('A1').expand('right').address
   $A$1:$B$1
   >>>xw.Range('A1').expand('down').address
   $A$1:$A$2
  • formula:獲取或設(shè)置Range的公式柿扣。
>>> app.range('A4').formula`
'=SUM(A1:A3)'
formula
  • formula_array:獲取或設(shè)置給定Range的數(shù)組公式。
  • get_address(row_absolute=True, column_absolute=True, include_sheetname=False, external=False):
>>> r.get_address()
'$A$1'

row_absolute :布爾型, 默認(rèn)為True
設(shè)置成False闺魏,將不會在地址上返回行的名稱未状。

>>> r.get_address(row_absolute=False)
'$A1'

column_aosolute:布爾型, 默認(rèn)為True
設(shè)置成false,將不會在地址上返回列的名稱。

>>> r.get_address(column_absolute=False)
'A$1'

include_sheetname:布爾型析桥,默認(rèn)為False
設(shè)置成True,會在地址上返回表名司草。

>>> r.get_address(True,True,True)
'Sheet1!$A$1'

external :布爾型, 默認(rèn)為False
設(shè)置成True,會在地址上返回工作簿和表的名稱艰垂。

>>> r.get_address(external=True)
'[工作簿1]Sheet1!$A$1'
  • height:返回Range的高度。
  • hyperlink: 返回指定Range的超鏈接地址(僅限單個單元格)
>>> import xlwings as xw
        >>> wb = xw.Book()
        >>> xw.Range('A1').value
        'www.xlwings.org'
        >>> xw.Range('A1').hyperlink
        'http://www.xlwings.org'

如果單元格里沒有超鏈接會報錯埋虹。

  • last_cell:返回指定Rnage右下角的單元格(只讀)
>>> app.range('A1','C3').last_cell
<Range [工作簿1]Sheet1!$C$3>
  • left:返回從第一列到Range第一列的距離猜憎。
>>> app.range('C1','C3').left
108.0


如果我把第一列拉長
拉長第一列

>>> app.range('C1','C3').left
138.0
  • name:設(shè)置或獲取Range的名稱。

  • number_format:獲取或設(shè)置Range的內(nèi)容格式搔课。

  • offset(row_offset=0, column_offset=0):返回一個偏移后的Range

現(xiàn)在是第一行胰柑,第一列
>>> r
<Range [工作簿1]Sheet1!$A$1>
A1偏移到右下角,B2
>>> r.offset(1,1)
<Range [工作簿1]Sheet1!$B$2>
A1偏移到下一行爬泥,A2
>>> r.offset(1,0)
<Range [工作簿1]Sheet1!$A$2>

也可以輸入負(fù)數(shù)柬讨,例如offset(-1,-1):偏移到左上方一個單元格。

  • options(convert=None, **options): 允許設(shè)置轉(zhuǎn)換器及其選項. 返Range對象袍啡。
    參數(shù):
    ndim: int類型,維數(shù)踩官,比如ndim=1,ndim=2。
    numbers:數(shù)字類型:比如numbers=int,numbers=float境输。
>>> app.range('A1','C3').value
[[1.0, 2.0, 3.0], [3.0, 3.0, 3.0], [3.0, 3.0, 3.0]]
>>> app.range('A1','C3').options(numbers=int).value
[[1, 2, 3], [3, 3, 3], [3, 3, 3]]

empty:object蔗牡,空單元格的轉(zhuǎn)換 。
transpose: 默認(rèn)為False,轉(zhuǎn)置Range的values嗅剖。


設(shè)置為True辩越,會把矩陣轉(zhuǎn)置了在來獲取value。

>>> app.range('A1','C3').options(transpose=Flase) .value
[[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 9.0]]
>>> app.range('A1','C3').options(transpose=True) .value
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]

expand:str型,默認(rèn)為None.可以為:'table'(右下),'down','right'信粮。

>>> app.range('A1').options(expand ='right') .value
[1.0, 4.0, 7.0]
>>> app.range('A1').options(expand ='down') .value
[1.0, 2.0, 3.0, ' ']
>>> app.range('A1').options(expand ='table') .value
[[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 9.0], [' ', None, None]]
>>> app.range('A1','A3').options(expand ='right') .value
[[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 9.0]]
>>> app.range('A1','C1').options(expand ='down') .value
[[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 9.0], [' ', None, None]]
  • raw_value:直接獲取或設(shè)置傳遞的值区匣,可以加快速度,但可能會不能跨平臺蒋院。

  • resize(row_size=None, column_size=None)`:

  • row:返回指定Range第一行編號亏钩。

  • row_height:獲取或設(shè)置Range的高度(以磅為單位).如果Range中的所有行具有相同的高度,則返回高度,否則返回None.

  • rows:返回表示指定Range內(nèi)的RangeRows對象。

  • select():選擇范圍欺旧,相當(dāng)于用鼠標(biāo)選取范圍姑丑。

  • shape:返回Range的維數(shù),以元組的形式辞友,比如:(1,3) 代表1*3的矩陣栅哀,(4,2)代表4*2的矩陣。

  • sheet: 返回Range所屬的Sheet對象称龙。

  • size:Range中元素數(shù)量留拾。

  • top:返回第一行到Range第一行的距離,跟left很像鲫尊。

  • value:獲取和設(shè)置給定Range的值痴柔。

  • width:返回Range的寬度。

6.apps,books,sheets異同

apps:app集合疫向。
books:工作簿集合咳蔚。
sheets:表格集合豪嚎。

apps books sheets
add(增添對象)
active(激活)
count(數(shù)量)
keys × ×
api ×
open × ×

7.總結(jié)

看了很多函數(shù)后,會發(fā)現(xiàn)這些對象很多相似的地方谈火,還有事層層遞進(jìn)的 app----book---sheet--Range侈询。
如果有父集可以找到父集,有子集可以找到子集糯耍,沒有可以創(chuàng)建扔字,能查詢名稱,能找到對應(yīng)的集合温技。
1.要創(chuàng)建excel工作簿:(app對象或book對象)
xw.Book()
xw.App()
要打開已經(jīng)存在的工作簿:
xw.books.open(路徑)
2.選定sheet:(Sheet對象)
xw.books[0].sheets[0]
3.選定單元格兩種方式:

  • xw.App().books[0].sheets[0].range(cells,cells)
    可以構(gòu)造列表進(jìn)行excel表的存取啦租。
  • xw.App().books[0].sheets[0][0,1]
    可以用for循環(huán),來進(jìn)行讀取荒揣。

當(dāng)然還有一些問題,自己也沒弄懂焊刹,希望下次可以解決系任。

如果有錯誤或者疑問的話,歡迎指點虐块。
最后最后俩滥,如果有幫助的話,不妨點個喜歡:氐臁K伞!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末儡率,一起剝皮案震驚了整個濱河市挂据,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儿普,老刑警劉巖崎逃,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眉孩,居然都是意外死亡个绍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門浪汪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巴柿,“玉大人,你說我怎么就攤上這事死遭」慊郑” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵呀潭,是天一觀的道長袁波。 經(jīng)常有香客問我瓦阐,道長,這世上最難降的妖魔是什么篷牌? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任睡蟋,我火速辦了婚禮,結(jié)果婚禮上枷颊,老公的妹妹穿的比我還像新娘戳杀。我一直安慰自己,他們只是感情好夭苗,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布信卡。 她就那樣靜靜地躺著,像睡著了一般题造。 火紅的嫁衣襯著肌膚如雪傍菇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天界赔,我揣著相機(jī)與錄音丢习,去河邊找鬼。 笑死淮悼,一個胖子當(dāng)著我的面吹牛咐低,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袜腥,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼见擦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了羹令?” 一聲冷哼從身側(cè)響起鲤屡,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎福侈,沒想到半個月后执俩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡癌刽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年役首,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片显拜。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡衡奥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出远荠,到底是詐尸還是另有隱情矮固,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站档址,受9級特大地震影響盹兢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜守伸,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一绎秒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尼摹,春花似錦见芹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至和二,卻和暖如春徘铝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惯吕。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工惕它, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人混埠。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像诗轻,于是被迫代替她去往敵國和親钳宪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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