- from pyExcelerator import *
-
-
-
- w = Workbook()
-
-
-
- ws = w.add_sheet('Hey, Hades')
-
-
-
- ws.write(0,0,'bit')
-
-
-
- ws.write(0,1,'huang')
-
-
-
- ws.write(1,0,'xuan')
-
-
-
- w.save('mini.xls')
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使用笔记【感谢鱿鱼哥】