您的位置:首页 > 编程语言 > Python开发

python写excel文件,openpyxl, xlrd, xlwt,xlutils

2013-11-02 17:40 941 查看
在上一篇写了python利用csv模块写csv文件,http://blog.csdn.net/xiaobing_blog/article/details/14056473,速度很快

但有些缺陷,所以我最后又找了写excel的工具

工具有这些:

           在网站:http://www.python-excel.org/, 提供了xlrd,xlwt,xlutils一套工具,xlrd是用来读取excl的,xlwt是用来写入excel的

            xlutils,引用了xlrd和xlwt来做一些如合并,过滤,修改文件的操作,这个很多人推荐使用,但有一个缺陷,就是,他的一个

           工作表sheet只能写入65535行,多了就不能写了,解决方法可以是,每65535行新建一个工作表sheet或者向后移动几列,

          然后写入,他的列最大值为256,所以最多一个sheet文件可以写入:256 * 65535 个数据

   

          在网站:http://pythonhosted.org/openpyxl/,提供了工具openpyxl,我觉得这个挺好的,下面会有一个简单的例子

这是我自己写的一个简单的例子:

#! /usr/bin/python
#-*- coding:utf-8 -*-
#Filename: myexcel.py
#Author: xiaobing
#E-mail: xiaobingzhang29@gmail.com
#Date: 2013-11-02
#Description:

from xlwt import Workbook,Style

def getRows():
rows = []
row1 = {'a':'6876890809890890098', 'b':'中过人', 'c':''}
row2 = {'a':'687235890890098', 'b':'中国人','c':'98734978329'}
row3 = {'a':'68768343890098', 'b':'English', 'c':''}
row4 = {'a':'34534534643653452', 'b':'American','c':'3234'}

rows.append(row1)
rows.append(row2)
rows.append(row3)
rows.append(row4)

return rows
def getFieldnames():
return {'a':'银行帐号', 'b':'国籍','c':'电话'}

def convDict2SortedList(dictRow):

listRow = []
keys = dictRow.keys()
keys.sort()
for key in keys:
listRow.append(dictRow[key])

return listRow

def write2Excel(filename, fieldnames, rows):

wb = Workbook(encoding='UTF-8')
ws = wb.add_sheet('表格',cell_overwrite_ok=True)

#得到第0行,写入标题
row = ws.row(0)
listRow = convDict2SortedList(fieldnames)
for j in range(len(listRow)):
row.write(j, listRow[j])
print listRow[j]

#从第i行开始写
i_row = 1
for i in range(i_row, len(rows) + i_row):
#得到工作表的第i行
row = ws.row(i)
#将字典行转换为经过key排序的list,保证不错行
listRow = convDict2SortedList(rows[i - i_row])

#逐个单元格写入
for j in range(len(rows[i - i_row])):
#如果转换为字符串后大于15的长度,是数字的话会被
#损失精度,后面转换为0,这里用文本的方式写入
if len(str(listRow[j])) > 15:
row.set_cell_text(j, listRow[j])
else:
row.write(j, listRow[j])

wb.save(filename)

if __name__ == '__main__':
filename = '/home/xiaobing/workspace/python/excel/myexcel.xls'
rows = getRows()
fieldnames = getFieldnames()

write2Excel(filename, fieldnames, rows)


注:当我写完后后,换用数据库的记录写入时,报错为:ValueError("row index (%r) not
an int in range(65536)" % rowx
原因是存储这个计数器的值为16位数,最大是65535

除了这个限制外,其他的特性都挺好的,可以定制单元格颜色,等等

2.用openpyxl写入就很好了避免了上面的问题:

我的简单的例子:

#! /usr/bin/python
#-*- coding:utf-8 -*-
#Filename: optimipyxl.py
#Author: xiaobing
#E-mail: xiaobingzhang29@gmail.com
#Date: 2013-11-02
#Description:

from openpyxl import Workbook
wb = Workbook(optimized_write = True)
#创建一个sheet
ws = wb.create_sheet()

#写入10行,每行20个
for irow in xrange(10):
ws.append(['984375894395748395' for i in xrange(20)])

wb.save('myExcelFile.xlsx')


这里之所以用很多数字的原因是因为之前写csv的时候,用excel打开,超过15位数,后面的自动没变位0,经过测试,这个不存在这样的错误

其中用到了一个optimized_write = True,这个是一个优化的快速写入方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息