简体   繁体   English

使用xlwt将列表列表写入excel文件

[英]Write list of lists to excel file using xlwt

I have a list of lists like: 我有一个列表,如:

[
[u'email', u'salutation', u'firstname', u'lastname', u'remarks', None, None, None, None, None],
[u'harry@harrypotter.com', u'Mr', u'Daniel', u'Radcliffe', u'expecto patronum', None, None, None, None, None],
[u'snape@harrypotter.com', u'Mr', u'Severus', u'Snape', u'Always', None, None, None, None, None],
]

I want to insert this to an excel file. 我想将其插入excel文件。 It is possible to do so one by one by writing each element. 通过编写每个元素,可以逐个完成。

book = xlwt.Workbook(encoding="utf-8")
sheet1 = book.add_sheet("Sheet 1")

row = 0
for l in listdata:
    col = 0
    for e in l:
        if e:
          sheet1.write(row, col, e)
        col+=1
    row+=1

But this method does not look very efficient as the each element of the entire list has to be traversed. 但是这种方法看起来效率不高,因为必须遍历整个列表的每个元素。 Is there a more efficient method to do the same in python with xlwt ? 有没有更有效的方法在python中使用xlwt做同样的xlwt

EDIT : Fixed error in benchmark code. 编辑 :修正了基准代码中的错误。

You can shorten things a bit to make them more pythonic: 你可以缩短一些东西,使它们更加pythonic:

for i, l in enumerate(listdata):
    for j, col in enumerate(l):
        sheet.write(i, j, col)

But as far as I know there is no easy method to write to as there is with csv.reader . 但据我所知,没有简单的方法可以写入csv.reader


PS: In your supplied code, you never increment row or col , so you overwrite the cell at (0,0) every iteration of the nested for loop. PS:在您提供的代码中,您永远不会增加rowcol ,因此在嵌套for循环的每次迭代时都会在(0,0)处覆盖单元格。 Careful! 小心! Using enumerate will fix that. 使用enumerate将解决这个问题。


Benchmarks 基准

As it turns out, join ing each row together with a comma and writing it is roughly 3 times faster than using enumerate once. 事实证明,用逗号join每一行并写入它大约比使用枚举一次快3倍。

Here's some test code: 这是一些测试代码:

import xlwt
import timeit


def wrapper(fn, *args, **kwargs):
    def wrapped():
        return fn(*args, **kwargs)
    return wrapped

def excel_writer():
    xldoc = xlwt.Workbook()
    sheet1 = xldoc.add_sheet("Sheet1", cell_overwrite_ok=True)
    rows = [[str(y) for y in xrange(100)] for x in xrange(10000)]
    fn1 = wrapper(cell_writer, rows, sheet1)
    fn2 = wrapper(row_writer, rows, sheet1)
    print timeit.timeit(fn1, number=10)/10 
    print timeit.timeit(fn2, number=10)/10 
    xldoc.save('myexcel.xls')


def cell_writer(rows, sheet):
    for i, row in enumerate(rows):
        for j, col in enumerate(row):
            sheet.write(i, j, col)

def row_writer(rows, sheet):
    rows = [', '.join(row) for row in rows]
    for i, strrow in enumerate(rows):
        sheet.write(i, 0, strrow)

if __name__ == '__main__':
    excel_writer()

with number = 1 (divided by 1 of course): number = 1 (当然除以1):

cell_writer: 15.2915050441 cell_writer: 15.2915050441

row_writer : 0.205128928987 row_writer0.205128928987

with number = 10 : number = 10

cell_writer: 17.3386430596 cell_writer: 17.3386430596

row_writer : 0.204951626882 row_writer0.204951626882

I attribute the big time difference to the increased speed of join over writing to excel. 我将大的时间差异归结为join写入excel的速度。 The biggest bottleneck in terms of speed, of course, the excel writing. 速度方面最大的瓶颈当然是excel写作。

However, be aware that the time it takes to split the cells apart in excel may outweigh the time saved with the row_writer approach. 但是,请注意,在excel中拆分单元格所需的时间可能会超过使用row_writer方法节省的时间。 It may also inconvenience the end user; 它也可能给最终用户带来不便; exercise judgement! 运动判断!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM