PYTON與EXCEL:使用pyExcelerator來讀寫 Excel文件
Posted on 2014-11-21 09:35 pts 閱讀(2391) 評論(0) 編輯 收藏 所屬分類: Python 、Office我們寫程序,經(jīng)常會需要輸出一些數(shù)據(jù)進(jìn)行保存,對于格式固定的大量數(shù)據(jù),Excel表格會是比較好的一個選擇。如果你需要在Python下寫入Excel文件,那么就需要用到PyExcelerator了。
PyExcelerator是一個第三方庫,用來處理Excel文件。它的優(yōu)點是:
簡單易用,上手快。
寫操作很方便,適合用來生成Excel文件記錄數(shù)據(jù)。
不需要WinCOM支持,沒裝Office也 可以生成Excel表格
當(dāng)然,PyExcelerator也是有缺點的,它所提供的讀寫操作方式相對簡單,要對已有的Excel文件進(jìn)行修改,就顯得比較麻煩了。
如果要對已有的Excel表格進(jìn)行較復(fù)雜的修改操作,選擇PyExcelerator就不太合適了,這時候可以試試另外的方法。比如使用pywin32通過WinCOM來操作Excel表格,或者使用xlrd。
PyExcelerator的官方主頁是http://sourceforge.net/projects/pyexcelerator,程序包中并沒有太多的教程文檔,不過包含了一些簡單的示范操作的小例子,如果需要更詳細(xì)的信息,就只能讀源代碼了。
一。初始pyExcelerator
pyExcelerator是一個基于python的可以讀寫excel文件的產(chǎn)品。和xlrd相比,pyExcelrator的主要特點在于可以對excel文件進(jìn)行寫操作。但是在讀取數(shù)據(jù)方面,功能就沒有xlrd強大了。
pyExcelerator只能提供關(guān)于表單內(nèi)容的基礎(chǔ)數(shù)據(jù),對于表單行數(shù)、列數(shù)、單元格數(shù)據(jù)類型等詳細(xì)信息都沒有提供訪問接口。因此開發(fā)人員必須了解表單的具體結(jié)構(gòu),才對表單中的數(shù)據(jù)進(jìn)行正確的分析轉(zhuǎn)換。
將pyExcelerator產(chǎn)品包(pyexcelerator-0.6.3a.tgz)上傳到服務(wù)器上之后解壓縮,然后在產(chǎn)品目錄下鍵入如下命令:
# python setup.py install
在命令行中,你將看到一連串的running,creating,copying,byte—compiling命令結(jié)果,吧啦吧啦。。。
最后一行出現(xiàn)
Writing C:/Python26/Lib/site-packages/pyExcelerator-0.6.4.1-py2.6.egg-info
說明已經(jīng)將插件安裝到你的python環(huán)境中了,至此安裝完成。
這里提一個小例子:
- from pyExcelerator import *
- w = Workbook() #創(chuàng)建一個工作簿
- ws = w.add_sheet('Hey, Hades') #創(chuàng)建一個工作表
- ws.write(0,0,'bit') #在1行1列寫入bit
- ws.write(0,1,'huang') #在1行2列寫入huang
- ws.write(1,0,'xuan') #在2行1列寫入xuan
- w.save('mini.xls') #保存
二、Excel文件讀取
from pyExcelerator import *
sheets = parse_xls('d:/a.xls')
很簡單,與 xlrd 不同。xlrd 需要先調(diào)用book = xlrd.open_workbook(filename)打開文檔,然后再調(diào)用sh= book.sheet_by_index(i)來得到第幾個sheet,然后再使用sh.cell_value(i,j)得到i行j列的單元格的值。操作多了一點。而上面的parse_xls(filename)則直接返回一個列表,每一項就是一個sheet的數(shù)據(jù)。每項是一個二元組(表名,單元格數(shù)據(jù))。其中單元格數(shù)據(jù)為一個字典,鍵值就是單元格的索引(i,j)。如果某個單元格無數(shù)據(jù),那么就不存在這個值。看似簡單,但從處理上不象 xlrd 一樣,可以知道每個sheet的最大行數(shù)和列數(shù),然后進(jìn)行循環(huán)。而使用 pyExcelerator好象沒有最大行數(shù)和列數(shù),再加上空數(shù)據(jù)又不存在,因此在處理上相對麻煩一些。這樣在處理上還需要注意。它與 xlrd 一樣都支持 unicode,但好象沒有 xlrd 一樣方便地判斷單元格的類型的方法,感覺還是 xlrd在功能上可能要強一些。當(dāng)然這只是個人感覺,再加上只是看了看例子,并沒有怎么使用。
三、Excel文件寫入
這個才是重頭。那么安裝好 pyExcelerator 之后,讀了 Readme.txt 之后了解到它的文檔正在進(jìn)行當(dāng)中,因此想多了解如何使用它需要看它所帶的例子,甚至看源程序。下面是我從例子中了解的如何寫一個 Excel 文檔需要了解的。
為了方便,在導(dǎo)入這個模塊中使用了import *的方式。
from pyExcelerator import *
首先導(dǎo)入模塊,然后是生成工作薄。
w = Workbook()
接著是加入一個工作表(sheet)。
ws = w.add_sheet('Hey, Dude')
然后就可以保存了。
w.save('mini.xls')
上面的代碼加在一起就是:
from pyExcelerator import *
w = Workbook()
ws = w.add_sheet('Hey, Dude')
w.save('mini.xls')
這就是最小的一個例子了,在例子中叫mini.py。你可以在例子目錄下運行mini.py看一看是不是生成了一個空的Excel文件。
如果想加入中文很簡單,改為:
#coding=cp936
from pyExcelerator import *w = Workbook()
ws = w.add_sheet(u'這是中文')
w.save('mini.xls')
這樣上面的執(zhí)行結(jié)果是生成一個空Excel文件,但它的第一個sheet的名字為“這是中文”。就這樣,只要保證你寫入時使用unicode就行了。
空文件可以生成,那么如何插入單元格呢?
ws.write(i, j, value)
其中value為值,可以是unicode。
接著,我們可能想改變單元格的樣式,如字體:
font0 = Font()
font0.name = 'Times New Roman'
font0.struck_out = True
font0.bold = Truestyle0 = XFStyle()
style0.font = font0
這樣我們創(chuàng)建了一個字體,然后又生成了一個樣式。注意,真正起作用的是樣式,字體不過是樣式中的一種效果。
這樣在寫入單元格時帶著這個樣式就行了,還是使用上面的write()方法:
ws.write(1, 1, 'Test', style0)
這是在名為ws的sheet中的第(1,1)單元格寫入了值為"Test"的內(nèi)容,并且它的樣式為style0。
然后我們還可以設(shè)置單元格的邊框:
borders = Borders()
borders.left = 5
style.borders = borders
其它還有許多的效果,簡單地列一下:
示例名 | 說明 |
col_width.py | 改變單元格寬度 |
row_style.py | 設(shè)置行的高度 |
merged*.py | 單元格合并 |
image.py | 插入圖片 |
outline*.py | 大綱效果(以前真沒用過) |
wsprops.py | sheet的屬性值打印 |
xls2*.py | Excel轉(zhuǎn)為其它的文件格式 |
大家有興趣自已照著例子學(xué)吧。
四: 時間小示例
給俺的boss寫的一個小工具,使用Python對Excel進(jìn)行統(tǒng)計,然后把結(jié)束生成一個新的Excel表格,使用到了xlrd和pyExcelerator兩個庫。
簡單的介紹一下這兩個庫,先說xlrd,這個庫讀Excel比較方便,各種方法使用起來也挺方便:
bk = xlrd.open_workbook('your.xls')
sh = bk.sheets()[-1]
上面兩句就可以打開Excel表格中的一個sheet,sheets得到的是一個list,存放所有的sheet。
sh.nrows是該sheet中的行數(shù),知道這個后就可以使用for循環(huán)來讀所有的單元格了:
sh.row(i)[3]這個就代表第i行的第4列。
再看看pyExcelerator,這個用起來有點別扭:
sheets = parse_xls('result.xls')
先打開一個表格,sheets是一個list,包含了所有表格的內(nèi)容,每一項就是一個sheet,而每個sheet是二元tuple,第一個是該sheet的名字,第二個是一個dict,dict的key是一個二元組,表示單元格的坐標(biāo),如(0,0),第一行第一列。
從上面的分析中可以得出要訪問Excel中第一個sheet的第一行第一列元素需要:
sheets[0][1][(0,0)]
pyExcelerator也不能得到行列數(shù)。
寫文件也比較簡單:
wb = Workbook()
ws = wb.add_sheet('result')
ws.write(0,0,“hello”)
wb.save('result.xls')
就不解釋了:-)
寫文件時需要注意直接寫Unicode內(nèi)容進(jìn)去,而不要寫編碼過的內(nèi)容。
給boss的代碼:PYTHON:
#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
import xlrd
from pyExcelerator import *
city = [(u'山城','[2,3]d+'),(u'水國','4d+'),(u'火縣','5d+'),
(u'土城','6d+'),(u'土國','7d+'),(u'火鄉(xiāng)','8[1-5]d+'),
(u'水鄉(xiāng)','8[067]d+'),]
fname = '0107CRM.xls'
bk = xlrd.open_workbook(fname)
sh = bk.sheets()[-1]
nrows = sh.nrows
#result中按順序存放各city中各套餐的數(shù)量
#順序為XTa+、XTb、XTb+
result = []
for i in range(len(city)):
result.append([0,0,0])
for r in range(1,nrows):
num = str(sh.row(r)[3])[7:]
flag = False
for i in range(len(city)):
if re.match(city[i][1],num):
flag = True
if sh.row(r)[2].value == 3001.0:
break
name = sh.row(r)[0].value.encode('utf8')
if 'XTa+' in name:
result[i][0]+=1
if 'XTb' in name and 'XTb+' not in name:
result[i][1]+=1
if 'XTb+' in name:
result[i][2]+=1
if not flag:
print "NO:"+num
print result
titles = [u'局向',u'數(shù)',u'M錄入數(shù)',u'X數(shù)',…………]
wb = Workbook()
ws = wb.add_sheet('result')
for i in range(len(titles)):
ws.write(0,i,titles[i])
for i in range(len(city)):
ws.write(i+1,0,city[i][0])
ws.write(i+1,1,result[i][0])
ws.write(i+1,4,result[i][1])
ws.write(i+1,7,result[i][2])
ws.write(i+1,10,result[i][0]+result[i][1]+result[i][2])
ws.write(i+2,1,"=SUM(B2:B8)")
wb.save('result.xls')
后記:
python對excel的操作確實不太強大,目前為止我只用過pyExcelerator,還有一個xlrd-xlwt的plugin;貌似這幾個對日常簡單的excel操作就夠用了!
最近回頭看這篇blog的閱讀量還是挺大,今天工作之余寫下此后記,希望能和各位python高手們交流,共同提高!
excel相關(guān)文章:
1.xlrd-xlwt模塊 xlrd讀取excel文件(基本功能)
2. 我同事魷魚哥解決excel2007讀寫的文章 openpyxl 讀寫excel2007使用筆記【感謝魷魚哥】
的處理