我们写程序,经常会需要输出一些数据进行保存,对于格式固定的大量数据,Excel表格会是比较好的一个选择。如果你需要在Python下写入Excel文件,那么就需要用到PyExcelerator了。

PyExcelerator是一个第三方库,用来处理Excel文件。它的优点是:

简单易用,上手快。

写操作很方便,适合用来生成Excel文件记录数据。

不需要WinCOM支持,没装Office也 可以生成Excel表格

当然,PyExcelerator也是有缺点的,它所提供的读写操作方式相对简单,要对已有的Excel文件进行修改,就显得比较麻烦了。

如果要对已有的Excel表格进行较复杂的修改操作,选择PyExcelerator就不太合适了,这时候可以试试另外的方法。比如使用pywin32通过WinCOM来操作Excel表格,或者使用xlrd。

PyExcelerator的官方主页是 http://sourceforge.net/projects/pyexcelerator ,程序包中并没有太多的教程文档,不过包含了一些简单的示范操作的小例子,如果需要更详细的信息,就只能读源代码了。

一。初始pyExcelerator

pyExcelerator是一个基于python的可以读写excel文件的产品。和xlrd相比,pyExcelrator的主要特点在于可以对excel文件进行写操作。但是在读取数据方面,功能就没有xlrd强大了。

pyExcelerator只能提供关于表单内容的基础数据,对于表单行数、列数、单元格数据类型等详细信息都没有提供访问接口。因此开发人员必须了解表单的具体结构,才对表单中的数据进行正确的分析转换。

将pyExcelerator产品包(pyexcelerator-0.6.3a.tgz)上传到服务器上之后解压缩,然后在产品目录下键入如下命令:

# python setup.py install
在命令行中,你将看到一连串的running,creating,copying,byte—compiling命令结果,吧啦吧啦。。。
最后一行出现
Writing C:/Python26/Lib/site-packages/pyExcelerator-0.6.4.1-py2.6.egg-info
说明已经将插件安装到你的python环境中了,至此安装完成。
这里提一个小例子:
from pyExcelerator import *
w = Workbook() #创建一个工作簿
ws = w.add_sheet( 'Hey, Hades' ) #创建一个工作表
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 需要先调用book = xlrd.open_workbook(filename)打开文档,然后再调用sh= book.sheet_by_index(i)来得到第几个sheet,然后再使用sh.cell_value(i,j)得到i行j列的单元格的值。操作 多了一点。而上面的parse_xls(filename)则直接返回一个列表,每一项就是一个sheet的数据。每项是一个二元组(表名,单元格数 据)。其中单元格数据为一个字典,键值就是单元格的索引(i,j)。如果某个单元格无数据,那么就不存在这个值。看似简单,但从处理上不象 xlrd 一样,可以知道每个sheet的最大行数和列数,然后进行循环。而使用 pyExcelerator好象没有最大行数和列数,再加上空数据又不存在,因此在处理上相对麻烦一些。这样在处理上还需要注意。它与 xlrd 一样都支持 unicode,但好象没有 xlrd 一样方便地判断单元格的类型的方法,感觉还是 xlrd在功能上可能要强一些。当然这只是个人感觉,再加上只是看了看例子,并没有怎么使用。

三、Excel文件写入

这个才是重头。那么安装好 pyExcelerator 之后,读了 Readme.txt 之后了解到它的文档正在进行当中,因此想多了解如何使用它需要看它所带的例子,甚至看源程序。下面是我从例子中了解的如何写一个 Excel 文档需要了解的。

为了方便,在导入这个模块中使用了import *的方式。

from pyExcelerator import *
首先导入模块,然后是生成工作薄。
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=cp936from pyExcelerator import *
w = Workbook()
ws = w.add_sheet(u'这是中文')
w.save('mini.xls')
这样上面的执行结果是生成一个空Excel文件,但它的第一个sheet的名字为“这是中文”。就这样,只要保证你写入时使用unicode就行了。
空文件可以生成,那么如何插入单元格呢?
ws.write(i, j, value)
其中value为值,可以是unicode。
接着,我们可能想改变单元格的样式,如字体:
font0 = Font()
font0.name = 'Times New Roman'
font0.struck_out = True
font0.bold = True
style0 = XFStyle()style0.font = font0

这样我们创建了一个字体,然后又生成了一个样式。注意, 真正起作用的是样式 ,字体不过是样式中的一种效果。

这样在写入单元格时带着这个样式就行了,还是使用上面的write()方法:

ws.write(1, 1, 'Test', style0)

这是在名为ws的sheet中的第(1,1)单元格写入了值为"Test"的内容,并且它的样式为style0。

然后我们还可以设置单元格的边框:

borders = Borders()

borders.left = 5

style.borders = borders

上面创建了一个边框效果,设置了左边框,至于5是什么意思,我也不清楚,随便写的。然后放到样式中。

上面的例子可以参考format.py程序

其它还有许多的效果,简单地列一下:

示例名

说明

col_width.py

改变单元格宽度

row_style.py

设置行的高度

merged*.py

单元格合并

image.py

插入图片

outline*.py

大纲效果(以前真没用过)

wsprops.py

sheet的属性值打印

xls2*.py

Excel转为其它的文件格式

大家有兴趣自已照着例子学吧。

四: 时间小示例

给俺的boss写的一个小工具,使用Python对Excel进行统计,然后把结束生成一个新的Excel表格,使用到了 xlrd 和 pyExcelerator 两个库。

简单的介绍一下这两个库,先说xlrd,这个库读Excel比较方便,各种方法使用起来也挺方便:

bk = xlrd.open_workbook('your.xls')

sh = bk.sheets()[-1]

上面两句就可以打开Excel表格中的一个sheet,sheets得到的是一个list,存放所有的sheet。

sh.nrows是该sheet中的行数,知道这个后就可以使用for循环来读所有的单元格了:

sh.row(i)[3]这个就代表第i行的第4列。

再看看pyExcelerator,这个用起来有点别扭:

sheets = parse_xls('result.xls')

先打开一个表格,sheets是一个list,包含了所有表格的内容,每一项就是一个sheet,而每个sheet是二元tuple,第一个是该sheet的名字,第二个是一个dict,dict的key是一个二元组,表示单元格的坐标,如(0,0),第一行第一列。

从上面的分析中可以得出要访问Excel中第一个sheet的第一行第一列元素需要:

sheets[0][1][(0,0)]
pyExcelerator也不能得到行列数。
写文件也比较简单:
wb = Workbook()
ws = wb.add_sheet('result')
ws.write(0,0,“hello”)
wb.save('result.xls')
就不解释了:-)
写文件时需要注意直接写Unicode内容进去,而不要写编码过的内容。
给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'火乡','8[1-5]d+'),
(u'水乡','8[067]d+'),]
fname = '0107CRM.xls'
bk = xlrd.open_workbook(fname)
sh = bk.sheets()[-1]
nrows = sh.nrows
#result中按顺序存放各city中各套餐的数量
#顺序为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'数',u'M录入数',u'X数',…………]
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操作就够用了!