使用pyExcelerator来读写 Excel文件(详细)

      我们写程序,经常会需要输出一些数据进行保存,对于格式固定的大量数据,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=cp936
from 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操作就够用了!

最近回头看这篇blog的阅读量还是挺大,今天工作之余写下此后记,希望能和各位python高手们交流,共同提高!


excel相关文章:

1.xlrd-xlwt模块  xlrd读取excel文件(基本功能)

2. 我同事鱿鱼哥解决excel2007读写的文章 openpyxl 读写excel2007使用笔记【感谢鱿鱼哥】


你可能感兴趣的:(工作,python,Excel,文档,import,产品)