說到Python操作Excel,,有好多模塊都可以支持這個(gè)工作,。比如最底層的win32模塊不僅可以操作Excel,,還可以操作其他一眾windows的軟件,。 其他的比較熟悉的有xlrd,,xlwt和xlutils這三個(gè)。分別負(fù)責(zé)Excel文件的讀,、寫,、讀寫轉(zhuǎn)換工作。雖然一般情況下的Excel操作都可以通過這三個(gè)模塊來完成,,但是還是有很多不便的地方,。比如單元格格式的寫入和讀取很麻煩,通過xlutils將一個(gè)Excel讀取再寫入到一個(gè)新文件中時(shí)格式也不會(huì)被一起復(fù)制過去,。 另外最近我遇到的需求就是,,基于一個(gè)Excel模板,往里面填充數(shù)據(jù),。雖然可以將模板轉(zhuǎn)化為xlwt的代碼寫死在生成腳本中,,但是每次都要重新生成一個(gè)文件未免太過麻煩,而且一個(gè)格子一個(gè)格子地寫入會(huì)讓代碼量飛速上漲,。,。無奈之下另尋他路,嘗試著用了xlwings這個(gè)模塊,。
■ 基本使用 和xlrd等不同,,xlwings設(shè)計(jì)的基礎(chǔ)理念不是面向單個(gè)的Excel文檔進(jìn)行的,而是可以處理一個(gè)包含了多個(gè)Excel文檔的“Excel項(xiàng)目”,。通過建立其app等邏輯組分概念,,可以讓整個(gè)Excel項(xiàng)目可以更加有序方便地進(jìn)行計(jì)算和互相通訊。xlwings中設(shè)計(jì)的各個(gè)模型的概念層級(jí)如下圖所示: 其中App是作為一個(gè)邏輯的分組,,一個(gè)Book可以認(rèn)為對(duì)應(yīng)一個(gè)Excel文檔,,Sheet對(duì)應(yīng)一張工作表,Range對(duì)應(yīng)具體表中的一片區(qū)域的內(nèi)容,。首先,,下面是一個(gè)最為常見的,打開一個(gè)Excel文檔并進(jìn)行處理的簡(jiǎn)單過程: import xlwings as xw book = xw.Book(‘/path/to/test.xlsx‘) # 此時(shí)界面上會(huì)彈出Excel窗口,如果test.xlsx文件不存在則會(huì)報(bào)錯(cuò),,如果test.xlsx已經(jīng)被打開,,直接返回這個(gè)文件對(duì)象 print book.name,book.fullname # 打印文件名和絕對(duì)路徑 print book.app # 可以查看book所在哪個(gè)APP print book.sheets # 又是一個(gè)類列表結(jié)構(gòu),存放各種Sheet對(duì)象 book.activate() # 如果Excel沒有獲得當(dāng)前系統(tǒng)的焦點(diǎn),,調(diào)用這個(gè)方法可以回到Excel中去 book.close() # 關(guān)閉Excel文檔,,但只是關(guān)閉文件本身,不關(guān)閉excel程序,。,。若要關(guān)閉Excel程序則需要調(diào)用響應(yīng)APP實(shí)例的kill方法。經(jīng)過試驗(yàn),,先調(diào)用close會(huì)導(dǎo)致默認(rèn)創(chuàng)建的app實(shí)例自動(dòng)消失,,從而無法調(diào)用kill,從而關(guān)不掉Excel
上面說到了獲取一個(gè)具體的sheet,,然一個(gè)sheet可以調(diào)用的方法有: sheet.activate sheet.charts sheet.index
sheet.api sheet.clear sheet.name
sheet.autofit sheet.clear_contents sheet.names
sheet.book sheet.delete sheet.pictures
sheet.cells sheet.impl sheet.range
其中activate,autofit,cliear_content等這些方法都還挺有意思的。最為核心的方法應(yīng)該就是range了,,通過它可以獲取到具體的某一段范圍的數(shù)據(jù),。 例如sheet.range(‘A1‘)獲取到A1單元格的對(duì)象,通過調(diào)取此對(duì)象的value屬性,,就可以讀取/改變單元格的值,,并且這一切都不會(huì)影響單元格本身的格式。 更加imba的一種做法是sheet.range(‘A1:C3‘)這樣的形式可以一次性獲取到一個(gè)區(qū)域內(nèi)所有單元格的對(duì)象,。調(diào)取其value對(duì)象的話得到的也是一個(gè)二維列表形式的數(shù)據(jù)集合,,可以形象方便地把Excel中的數(shù)據(jù)映射到python中來。對(duì)于設(shè)置數(shù)據(jù)時(shí),,傳入數(shù)據(jù)可以是一個(gè)不符合指出區(qū)域規(guī)定的結(jié)構(gòu),,但是這樣結(jié)果會(huì)比較微妙。,。建議實(shí)驗(yàn) 需要指出的是和xlrd一樣,,讀取value時(shí)合并單元格只在其左上角的子單元格中有值,其余的和未填寫的單元格一樣,,都是None,。
■ 對(duì)于range,能做的還有更多 除了簡(jiǎn)單的調(diào)用value和為value賦值來讀寫Excel外,,還有如下接口可以使用 range.add_hyperlink range.clear_contents range.count
range.address range.color range.current_region
range.api range.column range.end
range.autofit range.column_width range.expand
range.clear range.columns range.formula
一些接口的用法提示: range.add_hyperlink(‘https://www.baidu.com‘,‘百度‘) range.color = (128,128,128) RGB通道顏色,,可獲取or設(shè)置 range.row/column 獲取第幾行/列,注意是第幾而不是下標(biāo) range.formula 可以設(shè)置計(jì)算表達(dá)式,,用來進(jìn)行表內(nèi)計(jì)算 range.current_region 返回當(dāng)前range所在區(qū)域的區(qū)域表達(dá),,這個(gè)比較難描述,,好比一個(gè)Excel中互相連接的單元格都是連城一片,兩個(gè)片之間沒有任何相鄰就是互相獨(dú)立的,。 range.count 返回這個(gè)range中共有多少單元格,,合并單元格仍然按未合并的算 range.offset(a,b) 獲取到當(dāng)前range向右a格,向下移動(dòng)b格同樣大小的那片區(qū)域,,ab可以為負(fù)值 range.rows/columns 返回行/列的各個(gè)range對(duì)象
■ 關(guān)于App 其實(shí)App還沒有仔細(xì)研究過,,簡(jiǎn)單來說,當(dāng)通過xw.Book創(chuàng)建一個(gè)實(shí)例的時(shí)候,,默認(rèn)向xw.apps中添加一個(gè)App實(shí)例,,而book就屬于這個(gè)App。 如上面所說,,解決Excel程序無法關(guān)閉的問題可以用這個(gè)app實(shí)例的kill方法,。app.kill()可以把Excel程序連同文件一并關(guān)閉。另外,,如果不想讓Excel程序跳出來則可以置app.visible=False,,即時(shí)設(shè)置即時(shí)生效
|
|