当前位置: 首页 > 工具软件 > pyExcelerator > 使用案例 >

python脚本读写excel_PYTON与EXCEL:使用pyExcelerator来读写 Excel文件

潘雅珺
2023-12-01

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

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

 类似资料: