資源描述:
《《ython操作excel》word版》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、Youarehere:Home?計(jì)算機(jī)?編程?Python操作ExcelPython操作Excel2012-09-01老婆單位有時(shí)候有一些很大的Excel統(tǒng)計(jì)報(bào)表需要處理,其中最?lèi)盒牡氖强绫淼腏OIN查詢(xún)。他們通常采取的做法是,把多個(gè)Excel工作簿合成一個(gè)工作簿的多個(gè)表格,然后再跑函數(shù)(VLOOKUP之類(lèi))去查。因?yàn)橛玫暮瘮?shù)效率很低,在CPU打滿(mǎn)的情況下還要跑幾個(gè)小時(shí)。然后我就看不過(guò)去了,我也不懂Excel,不知道如何優(yōu)化,但我想用Python+SQLite總歸是能夠?qū)崿F(xiàn)的。于是就嘗試了一把,效果還不錯(cuò),一分鐘以?xún)?nèi)完成統(tǒng)計(jì)很輕松,其中大部分時(shí)間主要花
2、在讀Excel內(nèi)容上。1.Python操作Excel的函數(shù)庫(kù)我主要嘗試了3種讀寫(xiě)Excel的方法:1>xlrd,xlwt,xlutils:這三個(gè)庫(kù)的好處是不需要其它支持,在任何操作系統(tǒng)上都可以使用。xlrd可以讀取.xls,.xlsx文件,非常好用;但因?yàn)閤lwt不能直接修改Excel文檔,必須得復(fù)制一份然后另存為其它文件,而且據(jù)說(shuō)寫(xiě)復(fù)雜格式的Excel文件會(huì)出現(xiàn)問(wèn)題,所以我沒(méi)有選它來(lái)寫(xiě)Excel文件。2>openpyxl:這個(gè)庫(kù)也是不需要其它支持的,而且據(jù)說(shuō)對(duì)Office2007格式支持得更好。遺憾地是,我經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)它加載Excel文件的效率比x
3、lrd慢3倍以上,內(nèi)存使用在10倍以上,于是就放棄了。3>win32com:PythonWin32擴(kuò)展,這個(gè)庫(kù)需要運(yùn)行環(huán)境為Windows+Office對(duì)應(yīng)版本。由于PythonWin32擴(kuò)展只是把COM接口包裝了一下,可以視為與VBA完全相同,不會(huì)有讀寫(xiě)格式上的問(wèn)題。嘗試了一下用win32com讀取Excel文件,效率還是比xlrd慢一些。由于讀取效率上x(chóng)lrd>win32com>openpyxl,所以我自然選擇了xlrd用來(lái)讀取統(tǒng)計(jì)報(bào)表;而最終輸出的報(bào)表格式較復(fù)雜,所以選擇了win32com直接操作Excel文件。2.Python里的關(guān)系型數(shù)據(jù)庫(kù)S
4、QLite是一個(gè)非常輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù),很多語(yǔ)言和平臺(tái)都內(nèi)置SQLite支持,也是iOS和Android上的默認(rèn)數(shù)據(jù)庫(kù)。Python的標(biāo)準(zhǔn)庫(kù)里也包含了sqlite3庫(kù),用起來(lái)非常方便。3.用xlrd讀取Excel并插入數(shù)據(jù)庫(kù)樣例如果數(shù)據(jù)量不大,直接用Python內(nèi)部數(shù)據(jù)結(jié)構(gòu)如dict,list就夠了。但如果讀取的幾張表數(shù)據(jù)量都較大,增加個(gè)將數(shù)據(jù)插入數(shù)據(jù)庫(kù)的預(yù)處理過(guò)程就有很大好處。一是避免每次調(diào)試都要進(jìn)行耗時(shí)較長(zhǎng)的Excel文件載入過(guò)程;二是能充分利用數(shù)據(jù)庫(kù)的索引和SQL語(yǔ)句強(qiáng)大功能進(jìn)行快速數(shù)據(jù)分析。#!/usr/bin/python#-*-codin
5、g:gbk-*-importxlrdimportsqlite3#打開(kāi)數(shù)據(jù)庫(kù)文件device_city_db=sqlite3.connect('device_city.db')cursor=device_city_db.cursor()#建表cursor.execute('DROPTABLEIFEXISTSdevice_city')cursor.execute('CREATETABLEdevice_city(device_idchar(16)PRIMARYKEY,cityvarchar(16))')?#打開(kāi)device相關(guān)輸入Excel文件device_
6、workbook=xlrd.open_workbook('輸入.xlsx')device_sheet=device_workbook.sheet_by_name('設(shè)備表')#逐行讀取device-城市映射文件,并將指定的列插入數(shù)據(jù)庫(kù)forrowinrange(1,device_sheet.nrows):??device_id=device_sheet.cell(row,6).value??iflen(device_id)>16:????device_id=device_id[0:16]??iflen(device_id)==0:????continu
7、e??city=device_sheet.cell(row,10).value??#避免插入重復(fù)記錄??cursor.execute('SELECT*FROMdevice_cityWHEREdevice_id=?',(device_id,))??res=cursor.fetchone()??ifres==None:????cursor.execute('INSERTINTOdevice_city(device_id,city)VALUES(?,?)',???????????(device_id,city))??else:????ifres[1]!=ci
8、ty:??????print'%s,%s,%s,%s'%(device_id,city,res