引
由于需要解決大批量Excel處理的事情癣漆,與其手工操作還不如寫(xiě)個(gè)簡(jiǎn)單的代碼來(lái)處理骑祟,大致選了一下感覺(jué)還是Python最容易操作晦攒。
安裝庫(kù)
Python環(huán)境
首先當(dāng)然是配環(huán)境,不過(guò)選Python的一個(gè)重要原因就是Mac內(nèi)是自帶Python環(huán)境的植阴,不需要額外的配置環(huán)境蟹瘾,省下了一筆工作,如果你用的是Windows系統(tǒng)掠手,那就還需要配置一下Python的環(huán)境了,我Mac的Python版本是2.7狸捕。
第三方庫(kù)
Python自己是不支持直接操作Excel的喷鸽,但是Python強(qiáng)大之處就在于有大量好用的第三方庫(kù),這里我們選用讀Excel的xlrd庫(kù)和寫(xiě)Excel的xlwt庫(kù)來(lái)操作灸拍。
關(guān)于第三方庫(kù)的安裝很簡(jiǎn)單做祝,首先砾省,去專(zhuān)門(mén)下載Python庫(kù)的網(wǎng)站下載兩個(gè)庫(kù)的源碼:
注意對(duì)于新手來(lái)說(shuō)最簡(jiǎn)單的安裝方式就是源碼安裝,不需要去折騰第三方庫(kù)的管理器混槐,直接點(diǎn)擊這個(gè)先下載兩個(gè)庫(kù)的源碼:
你看他后面也描述了類(lèi)型是源碼嘛编兄。
下載好之后在mac中解壓,得到文件夾声登,可以看到里面都是有一個(gè) setup.py 文件的:
這里當(dāng)然不是直接雙擊安裝了狠鸳,py類(lèi)型表示它是一個(gè)Python代碼文件,雙擊只會(huì)打開(kāi)文件看代碼悯嗓。我們要使用終端件舵,輸入命令號(hào)進(jìn)入當(dāng)前所在的文件夾,比如我把文件放在了“下載”中脯厨,那么做法是:
$ cd Downloads/
$ cd xlwt-1.1.2
$ sudo python setup.py install
這里 cd 的意思是進(jìn)入該文件夾铅祸,sudo 的意思是使用管理員權(quán)限安裝,不使用的話(huà)會(huì)告訴你沒(méi)有權(quán)限的合武,回車(chē)后會(huì)要你輸入電腦密碼临梗,輸入后回車(chē)即可,python 是執(zhí)行 python代碼文件的命令稼跳,install 就是安裝了盟庞。
然后會(huì)看到刷刷刷一堆文字過(guò)去,最后告訴你 finished 了岂贩,就是安裝完成了茫经。
xlrd 也是同樣的安裝方式。
寫(xiě)代碼
讀寫(xiě)Excel的第三方庫(kù)都安裝好了萎津,就可以開(kāi)始寫(xiě)代碼了卸伞。
我們?cè)谝粋€(gè)文件夾下創(chuàng)建一個(gè) hello.py 文件,然后用sublime之類(lèi)的文檔編輯器打開(kāi)它锉屈,開(kāi)始編寫(xiě)代碼荤傲。(PS:Python中 # 號(hào)開(kāi)頭表示注釋?zhuān)?/p>
讀Excel
# -*- coding: utf-8 -*-
import xdrlib ,sys
import xlrd
#打開(kāi)excel文件
def open_excel(file= 'test.xlsx'):
try:
data = xlrd.open_workbook(file)
return data
except Exception,e:
print str(e)
#根據(jù)名稱(chēng)獲取Excel表格中的數(shù)據(jù) 參數(shù):file:Excel文件路徑 colnameindex:表頭列名所在行的索引 ,by_name:Sheet1名稱(chēng)
def excel_table_byname(file= 'test.xlsx', colnameindex=0, by_name=u'Sheet1'):
data = open_excel(file) #打開(kāi)excel文件
table = data.sheet_by_name(by_name) #根據(jù)sheet名字來(lái)獲取excel中的sheet
nrows = table.nrows #行數(shù)
colnames = table.row_values(colnameindex) #某一行數(shù)據(jù)
list =[] #裝讀取結(jié)果的序列
for rownum in range(0, nrows): #遍歷每一行的內(nèi)容
row = table.row_values(rownum) #根據(jù)行號(hào)獲取行
if row: #如果行存在
app = [] #一行的內(nèi)容
for i in range(len(colnames)): #一列列地讀取行的內(nèi)容
app.append(row[i])
list.append(app) #裝載數(shù)據(jù)
return list
#主函數(shù)
def main():
tables = excel_table_byname()
for row in tables:
print row
if __name__=="__main__":
main()
這個(gè)代碼很多我都注釋了颈渊,只講幾個(gè)要注意的地方遂黍,首先最開(kāi)始我們?cè)O(shè)置了utp8編碼,然后一定要記得導(dǎo)入xlrd包俊嗽,這樣才能使用它的函數(shù)去讀取excel雾家。里面的 main() 是主函數(shù),python 會(huì)運(yùn)行這個(gè)函數(shù)绍豁,這個(gè)函數(shù)調(diào)用了其余的函數(shù)來(lái)讀取數(shù)據(jù)芯咧。這個(gè)代碼實(shí)現(xiàn)的是將excel文件 test.xlsx 中的 Sheet1 表中的數(shù)據(jù)一行行讀取出來(lái)并打印。
Excel中內(nèi)容如下:
有兩行內(nèi)容。
要運(yùn)行這個(gè)代碼敬飒,需要用終端使用命令行邪铲,首先 cd 進(jìn)入到代碼所在的文件夾,代碼和Excel文件都要放在這個(gè)文件夾里无拗。然后使用 python hello.py 命令來(lái)運(yùn)行這個(gè)代碼文件:
以上就是 Python 讀取并打印出來(lái)的內(nèi)容带到,u 表示使用的是unicode編碼,可以看到與Excel中是一致的英染。
創(chuàng)建Excel
使用xlwt庫(kù)我們可以創(chuàng)建一個(gè)Excel:
# -*- coding: utf-8 -*-
import xlwt
def testXlwt(file = 'new.xls'):
book = xlwt.Workbook() #創(chuàng)建一個(gè)Excel
sheet1 = book.add_sheet('hello') #在其中創(chuàng)建一個(gè)名為hello的sheet
sheet1.write(0,0,'cloudox') #往sheet里第一行第一列寫(xiě)一個(gè)數(shù)據(jù)
sheet1.write(1,0,'ox') #往sheet里第二行第一列寫(xiě)一個(gè)數(shù)據(jù)
book.save(file) #創(chuàng)建保存文件
#主函數(shù)
def main():
testXlwt()
if __name__=="__main__":
main()
這個(gè)代碼更簡(jiǎn)單揽惹,同樣記得要在開(kāi)頭導(dǎo)入庫(kù)。
代碼中我們創(chuàng)建了一個(gè)excel税迷,在其中添加一個(gè)sheet永丝,寫(xiě)入兩個(gè)數(shù)據(jù),最后按照我們的命名保存了文件箭养。
按照上面同樣的方法運(yùn)行代碼后慕嚷,終端中不會(huì)有打印的內(nèi)容蹋嵌,但是我們?nèi)ノ募A中看會(huì)得到一個(gè)名為 new.xls 的新excel文件蹦魔,打開(kāi)可以看到:
按照我們的方法寫(xiě)了數(shù)據(jù),同時(shí)sheet名字也是hello憎兽。
值得注意的是撼泛,在xlwt庫(kù)的說(shuō)明中有這么一句話(huà):
Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform, with Python 2.6, 2.6, 3.3+
也就是說(shuō)挠说,它只能創(chuàng)建 xls 的文件格式,不能創(chuàng)建現(xiàn)在的 xlsx 格式愿题,其實(shí)有點(diǎn)老了损俭,如果你把文件名寫(xiě)了 xlsx 格式,將會(huì)無(wú)法打開(kāi)潘酗。
處理Excel內(nèi)容
其實(shí)單獨(dú)的讀和寫(xiě)只是基本功杆兵,我們最終是想要處理Excel中的內(nèi)容的。
這里我們假設(shè)一個(gè)使用場(chǎng)景仔夺,我們希望將Excel中所有第一列和第二列相同的行數(shù)據(jù)篩選出來(lái)保存到一個(gè)新的Excel中去琐脏。
那么我們的流程是:
- 打開(kāi)目標(biāo)Excel
- 讀取內(nèi)容
- 讀取每一行的同時(shí)篩選第一列和第二列相等的行保留下來(lái)
- 創(chuàng)建一個(gè)新Excel
- 將篩選出來(lái)的內(nèi)容寫(xiě)進(jìn)去
- 保存新Excel
那么我們看代碼:
# -*- coding: utf-8 -*-
import xdrlib ,sys
import xlrd
import xlwt
#打開(kāi)excel文件
def open_excel(file= 'test.xlsx'):
try:
data = xlrd.open_workbook(file)
return data
except Exception,e:
print str(e)
#根據(jù)索引獲取Excel表格中的數(shù)據(jù) 參數(shù):file:Excel文件路徑 colnameindex:表頭列名所在行的索引 ,by_index:表的索引
def excel_table_byindex(file= 'test.xlsx',colnameindex=0,by_index=0):
data = open_excel(file) #打開(kāi)excel文件
table = data.sheets()[by_index] #根據(jù)sheet序號(hào)來(lái)獲取excel中的sheet
nrows = table.nrows #行數(shù)
ncols = table.ncols #列數(shù)
colnames = table.row_values(colnameindex) #某一行數(shù)據(jù)
list =[] #裝讀取結(jié)果的序列
for rownum in range(0,nrows): #遍歷每一行的內(nèi)容
row = table.row_values(rownum) #根據(jù)行號(hào)獲取行
if row: #如果行存在
app = [] #一行的內(nèi)容
for i in range(len(colnames)): #一列列地讀取行的內(nèi)容
app.append(row[i])
if app[0] == app[1] : #如果這一行的第一個(gè)和第二個(gè)數(shù)據(jù)相同才將其裝載到最終的list中
list.append(app)
testXlwt('new.xls', list) #調(diào)用寫(xiě)函數(shù)缸兔,講list內(nèi)容寫(xiě)到一個(gè)新文件中
return list
#將list中的內(nèi)容寫(xiě)入一個(gè)新的file文件
def testXlwt(file = 'new.xls', list = []):
book = xlwt.Workbook() #創(chuàng)建一個(gè)Excel
sheet1 = book.add_sheet('hello') #在其中創(chuàng)建一個(gè)名為hello的sheet
i = 0 #行序號(hào)
for app in list : #遍歷list每一行
j = 0 #列序號(hào)
for x in app : #遍歷該行中的每個(gè)內(nèi)容(也就是每一列的)
sheet1.write(i, j, x) #在新sheet中的第i行第j列寫(xiě)入讀取到的x值
j = j+1 #列號(hào)遞增
i = i+1 #行號(hào)遞增
# sheet1.write(0,0,'cloudox') #往sheet里第一行第一列寫(xiě)一個(gè)數(shù)據(jù)
# sheet1.write(1,0,'ox') #往sheet里第二行第一列寫(xiě)一個(gè)數(shù)據(jù)
book.save(file) #創(chuàng)建保存文件
#主函數(shù)
def main():
tables = excel_table_byindex()
for row in tables:
print row
if __name__=="__main__":
main()
這次我們開(kāi)頭要導(dǎo)入xlrd和xlwt兩個(gè)庫(kù)日裙,因?yàn)榧纫x也要寫(xiě)。
代碼內(nèi)容基本與上面兩個(gè)差不多惰蜜,有一點(diǎn)點(diǎn)加深昂拂,在讀取的時(shí)候我們判斷了第一列和第二列數(shù)據(jù)相同的行才加到list中去。在寫(xiě)的時(shí)候我們用了兩個(gè)for循環(huán)來(lái)對(duì)新excel中的一個(gè)個(gè)單元格寫(xiě)數(shù)據(jù)抛猖,使用了i和j兩個(gè)變量來(lái)記錄位置政钟。此外在獲取sheet的時(shí)候路克,與上面的不同樟结,這里是通過(guò)sheet的序號(hào)(這里是0)來(lái)獲取的养交,上面的是通過(guò)sheet名稱(chēng)來(lái)獲取。
我們要處理的Excel中的內(nèi)容是這樣的:
按道理我們篩選后只應(yīng)該保留第一行的內(nèi)容瓢宦,運(yùn)行完后我們得到了一個(gè)新的Excel文件碎连,里面的內(nèi)容如下:
可以看到和預(yù)期是相符的。
結(jié)
這里只是簡(jiǎn)單的例子驮履,兩個(gè)庫(kù)的操作還有很多鱼辙,能夠進(jìn)行的處理也有很多,如果要處理大量數(shù)據(jù)玫镐,可能還要考慮內(nèi)存倒戏,分批次來(lái)處理,總之恐似,本文只是一個(gè)入門(mén)杜跷,盡量追求零基礎(chǔ)也能學(xué)著使用來(lái)解放勞動(dòng)力,更多的用法矫夷,就看自己琢磨了葛闷。
可以下載我的示例工程:https://github.com/Cloudox/PYReadWriteExcelDemo