This Python snippet allows you to convert an iterable of namedtuple instances to an XLSX file using xlsxwriter.
The header is automatically determined from the first element of the iterable. If the iterable is empty, the resulting XLSX file will also be empty.
import xlsxwriter import itertools from collections import namedtuple def xlsx_write_rows(filename, rows): """ Write XLSX rows from an iterable of rows. Each row must be an iterable of writeable values. Returns the number of rows written """ workbook = xlsxwriter.Workbook(filename) worksheet = workbook.add_worksheet() # Write values nrows = 0 for i, row in enumerate(rows): for j, val in enumerate(row): worksheet.write(i, j, val) nrows += 1 # Cleanup workbook.close() return nrows def namedtuples_to_xlsx(filename, values): """ Convert a list or generator of namedtuples to an XLSX file. Returns the number of rows written. """ try: # Ensure its a generator (next() not allowed on lists) values = (v for v in values) # Use first row to generate header peek = next(values) header = list(peek.__class__._fields) return xlsx_write_rows(filename, itertools.chain([header], [peek], values)) except StopIteration: # Empty generator # Write empty xlsx return xlsx_write_rows(filename, [])
Example Usage:
MyType = namedtuple("MyType", ["ID", "Name", "Value"]) namedtuples_to_xlsx("test.xlsx", [ MyType(1, "a", "b"), MyType(2, "c", "d"), MyType(3, "e", "f"), ])
This example will generate this table:
ID Name Value 1 a b 2 c d 3 e f