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

在上一篇写了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)


注:当我写完后后,换用数据库的记录写入时,报错为: 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: [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')

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

其中用到了一个optimized_write = True,这个是一个优化的快速写入方法

猜你喜欢

转载自blog.csdn.net/Hello_ok_google/article/details/14057097
今日推荐