在上一篇写了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: [email protected]
#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)
原因是存储这个计数器的值为16位数,最大是65535
除了这个限制外,其他的特性都挺好的,可以定制单元格颜色,等等
2.用openpyxl写入就很好了避免了上面的问题:
我的简单的例子:
#! /usr/bin/python
#-*- coding:utf-8 -*-
#Filename: optimipyxl.py
#Author: xiaobing
#E-mail: [email protected]
#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')
其中用到了一个optimized_write = True,这个是一个优化的快速写入方法