電子表格

2018-02-24 15:48 更新

一提到電子表格,可能立刻想到的是excel。殊不知,電子表格,還是“歷史悠久”的呢,比word要長(zhǎng)久多了。根據(jù)維基百科的記載整理一個(gè)簡(jiǎn)史:

VisiCalc是第一個(gè)電子表格程序,用于蘋果II型電腦。由丹·布李克林(Dan Bricklin)和鮑伯·法蘭克斯頓(Bob Frankston)發(fā)展而成,1979年10月跟著蘋果二號(hào)電腦推出,成為蘋果二號(hào)電腦上的「殺手應(yīng)用軟體」。

接下來(lái)是Lotus 1-2-3,由Lotus Software(美國(guó)蓮花軟體公司)於1983年起所推出的電子試算表軟體,在DOS時(shí)期廣為個(gè)人電腦使用者所使用,是一套殺手級(jí)應(yīng)用軟體。也是世界上第一個(gè)銷售超過(guò)100萬(wàn)套的軟件。

然后微軟也開(kāi)始做電子表格,早在1982年,它推出了它的第一款電子制表軟件──Multiplan,並在CP/M系統(tǒng)上大獲成功,但在MS-DOS系統(tǒng)上,Multiplan敗給了Lotus 1-2-3。

1985年,微軟推出第一款Excel,但它只用於Mac系統(tǒng);直到1987年11月,微軟的第一款適用於Windows系統(tǒng)的Excel才誕生,不過(guò),它一出來(lái),就與Windows系統(tǒng)直接捆綁,由于此后windows大行其道,并且Lotus1-2-3遲遲不能適用於Windows系統(tǒng),到了1988年,Excel的銷量超過(guò)了1-2-3。

此后就是微軟的天下了,Excel后來(lái)又并入了Office里面,成為了Microsoft Office Excel。

盡管Excel已經(jīng)發(fā)展了很多代,提供了大量的用戶界面特性,但它仍然保留了第一款電子制表軟件VisiCalc的特性:行、列組成單元格,數(shù)據(jù)、與數(shù)據(jù)相關(guān)的公式或者對(duì)其他單元格的絕對(duì)引用保存在單元格中。

由于微軟獨(dú)霸天下,Lotus 1-2-3已經(jīng)淡出了人們的視線,甚至于誤認(rèn)為歷史就是從微軟開(kāi)始的。

其實(shí),除了微軟的電子表格,在Linux系統(tǒng)中也有很好的電子表格,google也提供了不錯(cuò)的在線電子表格(可惜某國(guó)內(nèi)不能正常訪問(wèn))。

從歷史到現(xiàn)在,電子表格都很廣泛的用途。所以,python也要操作一番電子表格,因?yàn)橛械臄?shù)據(jù),或許就是存在電子表格中。

openpyl

openpyl模塊是解決Microsoft Excel 2007/2010之類版本中擴(kuò)展名是Excel 2010 xlsx/xlsm/xltx/xltm的文件的讀寫(xiě)的第三方庫(kù)。(差點(diǎn)上不來(lái)氣,這句話太長(zhǎng)了。)

安裝

安裝第三方庫(kù),當(dāng)然用法力無(wú)邊的pip install

$ sudo pip install openpyxl

如果最終看到下面的提示,恭喜你,安裝成功。

Successfully installed openpyxl jdcal
Cleaning up...

workbook和sheet

第一步,當(dāng)然是要引入模塊,用下面的方式:

>>> from openpyxl import Workbook

接下來(lái)就用Workbook()類里面的方法展開(kāi)工作:

>>> wb = Workbook()

請(qǐng)回憶Excel文件,如果想不起來(lái),就打開(kāi)Excel,我們第一眼看到的是一個(gè)稱之為工作簿(workbook)的東西,里面有幾個(gè)sheet,默認(rèn)是三個(gè),當(dāng)然可以隨意增刪。默認(rèn)又使用第一個(gè)sheet。

>>> ws = wb.active

每個(gè)工作簿中,至少要有一個(gè)sheet,通過(guò)這條指令,就在當(dāng)前工作簿中建立了一個(gè)sheet,并且它是當(dāng)前正在使用的。

還可以在這個(gè)sheet后面追加:

>>> ws1 = wb.create_sheet()

甚至,還可以加塞:

>>> ws2 = wb.create_sheet(1)

排在了第二個(gè)位置。

在Excel文件中一樣,創(chuàng)建了sheet之后,默認(rèn)都是以"Sheet1"、"Sheet2"樣子來(lái)命名的,然后我們可以給其重新命名。在這里,依然可以這么做。

>>> ws.title = "python"

ws所引用的sheet對(duì)象名字就是"python"了。

此時(shí),可以使用下面的方式從工作簿對(duì)象中得到sheet

>>> ws01 = wb['python']    #sheet和工作簿的關(guān)系,類似鍵值對(duì)的關(guān)系
>>> ws is ws01
True

或者用這種方式

>>> ws02 = wb.get_sheet_by_name("python")    #這個(gè)方法名字也太直接了,方法的參數(shù)就是sheet名字
>>> ws is ws02
True

整理一下到目前為止我們已經(jīng)完成的工作:建立了工作簿(wb),還有三個(gè)sheet。還是顯示一下比較好:

>>> print wb.get_sheet_names()
['python', 'Sheet2', 'Sheet1']

Sheet2這個(gè)sheet之所以排在了第二位,是因?yàn)樵诮⒌臅r(shí)候,用了一個(gè)加塞的方法。這跟Excel中差不多少,如果sheet命名了,就按照那個(gè)名字顯示,否則就默認(rèn)為名字是"Sheet1"形狀的(注意,第一個(gè)字母大寫(xiě))。

也可以用循環(huán)語(yǔ)句,把所有的sheet名字打印出來(lái)。

>>> for sh in wb:
...     print sh.title
... 
python
Sheet2
Sheet1

如果讀者去dir(wb)工作簿對(duì)象的屬性和方法,會(huì)發(fā)現(xiàn)它具有迭代的特征__iter__方法。說(shuō)明,工作簿是可迭代的。

cell

為了能夠清楚理解填數(shù)據(jù)的過(guò)程,將電子表中約定的名稱以下圖方式說(shuō)明:

對(duì)于sheet,其中的cell是它的下級(jí)單位。所以,要得到某個(gè)cell,可以這樣:

b4 = ws['B4']

如果B4這個(gè)cell已經(jīng)有了,用這種方法就是將它的值賦給了變量b4;如果sheet中沒(méi)有這個(gè)cell,那么就創(chuàng)建這個(gè)cell對(duì)象。

請(qǐng)讀者注意,當(dāng)我們打開(kāi)Excel,默認(rèn)已經(jīng)畫(huà)好了好多cell。但是,在python操作的電子表格中,不會(huì)默認(rèn)畫(huà)好那樣一個(gè)表格,一切都要?jiǎng)?chuàng)建之后才有。所以,如果按照前面的操作流程,上面就是創(chuàng)建了B4這個(gè)cell,并且把它作為一個(gè)對(duì)象被b4變量引用。

如果要給B4添加數(shù)據(jù),可以這么做:

>>> ws['B4'] = 4444

因?yàn)閎4引用了一個(gè)cell對(duì)象,所以可以利用這個(gè)對(duì)象的屬性來(lái)查看其值:

>>> b4.value
4444

要獲得(或者建立并獲得)某個(gè)cell對(duì)象,還可以使用下面方法:

>>> a1 = ws.cell("A1")

或者:

>>> a2 = ws.cell(row = 2, column = 1)

剛才已經(jīng)提到,在建立了sheet之后,內(nèi)存中的它并沒(méi)有cell,需要程序去建立。上面都是一個(gè)一個(gè)地建立,能不能一下建立多個(gè)呢?比如要類似下面的:

|A1|B1|C1| |A2|B2|C2| |A3|B3|C3|

就可以如同切片那樣來(lái)操作:

>>> cells = ws["A1":"C3"]

可以用下面方法看看創(chuàng)建結(jié)果:

>>> tuple(ws.iter_rows("A1:C3"))
((<Cell python.A1>, <Cell python.B1>, <Cell python.C1>), 
 (<Cell python.A2>, <Cell python.B2>, <Cell python.C2>), 
 (<Cell python.A3>, <Cell python.B3>, <Cell python.C3>))

這是按照橫向順序數(shù)過(guò)來(lái)來(lái)的,即A1-B1-C1,然后下一橫行。還可以用下面的循環(huán)方法,一個(gè)一個(gè)地讀到每個(gè)cell對(duì)象:

>>> for row in ws.iter_rows("A1:C3"):
...     for cell in row:
...         print cell
... 
<Cell python.A1>
<Cell python.B1>
<Cell python.C1>
<Cell python.A2>
<Cell python.B2>
<Cell python.C2>
<Cell python.A3>
<Cell python.B3>
<Cell python.C3>

也可以用sheet對(duì)象的rows屬性,得到按照橫向順序依次排列的cell對(duì)象(注意觀察結(jié)果,因?yàn)闆](méi)有進(jìn)行范圍限制,所以是目前sheet中所有的cell,前面已經(jīng)建立到第四行了B4,所以,要比上面的操作多一個(gè)row):

>>> ws.rows
((<Cell python.A1>, <Cell python.B1>, <Cell python.C1>), 
 (<Cell python.A2>, <Cell python.B2>, <Cell python.C2>), 
 (<Cell python.A3>, <Cell python.B3>, <Cell python.C3>), 
 (<Cell python.A4>, <Cell python.B4>, <Cell python.C4>))

用sheet對(duì)象的columns屬性,得到的是按照縱向順序排列的cell對(duì)象(注意觀察結(jié)果):

>>> ws.columns
((<Cell python.A1>, <Cell python.A2>, <Cell python.A3>, <Cell python.A4>), 
 (<Cell python.B1>, <Cell python.B2>, <Cell python.B3>, <Cell python.B4>), 
 (<Cell python.C1>, <Cell python.C2>, <Cell python.C3>, <Cell python.C4>))

不管用那種方法,只要得到了cell對(duì)象,接下來(lái)就可以依次賦值了。比如要將上面的表格中,依次填寫(xiě)上1,2,3,...

>>> i = 1
>>> for cell in ws.rows:
...     cell.value = i
...     i += 1

... Traceback (most recent call last): File "", line 2, in AttributeError: 'tuple' object has no attribute 'value'

報(bào)錯(cuò)了。什么錯(cuò)誤。關(guān)鍵就是沒(méi)有注意觀察上面的結(jié)果。tuple里面是以tuple為元素,再里面才是cell對(duì)象。所以,必須要“時(shí)時(shí)警醒”,常常謹(jǐn)慎。

>>> for row in ws.rows:
...     for cell in row:
...         cell.value = i
...         i += 1
... 

如此,就給每個(gè)cell添加了數(shù)據(jù)。查看一下,不過(guò)要換一個(gè)屬性:

>>> for col in ws.columns:
...     for cell in col:
...         print cell.value
... 
1
4
7
10
2
5
8
11
3
6
9
12

雖然看著有點(diǎn)不舒服,但的確達(dá)到了前面的要求。

保存

把辛苦工作的結(jié)果保存一下吧。

>>> wb.save("23401.xlsx")

如果有同名文件存在,會(huì)覆蓋。

此時(shí),可以用Excel打開(kāi)這個(gè)文件,看看可視化的結(jié)果:

讀取已有文件

如果已經(jīng)有一個(gè).xlsx文件,要讀取它,可以這樣來(lái)做:

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook("23401.xlsx")
>>> print wb2.get_sheet_names()
['python', 'Sheet2', 'Sheet1']
>>> ws_wb2 = wb2["python"]
>>> for row in ws_wb2.rows:
...     for cell in row:
...         print cell.value
... 
1
2
3
4
5
6
7
8
9
10
11
12

很好,就是這個(gè)文件。

其它第三方庫(kù)

針對(duì)電子表格的第三方庫(kù),除了上面這個(gè)openpyxl之外,還有別的,列出幾個(gè),供參考,使用方法大同小異。

  • xlsxwriter:針對(duì)Excel 2010格式,如.xlsx,官方網(wǎng)站:https://xlsxwriter.readthedocs.org/,這個(gè)官方文檔寫(xiě)的圖文并茂。非常好讀。

下面兩個(gè)用來(lái)處理.xls格式的電子表表格。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)