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

我有一个列表如下:

[ [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], ] 

我想插入到一个Excel文件。 通过编写每个元素可以一个接一个地完成。

 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 

但是这种方法看起来效率不高,因为整个列表的每个元素都必须被遍历。 是否有一个更有效的方法来做同样的python与xlwt

编辑 :修正了基准代码中的错误。

你可以缩短一些东西,使它们更加pythonic:

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

但据我所知,有没有简单的方法来写,因为有csv.reader


PS:在你提供的代码中,你永远不会增加rowcol ,所以你在(0,0)处嵌套for循环的每一次迭代覆盖单元格。 小心! 使用enumerate将解决这个问题。


基准

事实certificate,用逗号join每一行并写入比使用一次枚举快3倍。

以下是一些testing代码:

 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() 

number = 1 (当然除以1):

cell_writer: 15.2915050441

row_writer0.205128928987

number = 10

cell_writer: 17.3386430596

row_writer0.204951626882

我把这个大的时间差异归功于加速写入excel的速度。 速度方面最大的瓶颈,当然是优秀的写作。

但是请注意,在Excel中拆分单元格的时间可能会超过row_writer方法保存的时间。 这也可能给最终用户带来不便。 行使判断!