How to dump a dictionary into an .xlsx file with proper column alignment?

Question:

I have a dictionary with 2000 items which looks like this:

d = {'10071353': (0, 0), '06030011': (6, 0), '06030016': (2, 10), ...}

Given that I want to write it to an .xlsx file, I use this code (taken from here):

import xlsxwriter
workbook = xlsxwriter.Workbook('myfile.xlsx')
worksheet = workbook.add_worksheet()
row = 0
col = 0
order=sorted(d.keys())
for key in order:
    row += 1
    worksheet.write(row, col,     key)
    for item in d[key]:
        worksheet.write(row, col + 1, item)
        row += 1

workbook.close()

This produces an .xlsx file with the following alignment:

    A           B
    06030001    0
                10

    06030002    10
                10

    06030003    5
                10

However, this is the alignment I am after:

A           B    C
06030001    0    10

06030002    10   10

06030003    5    10

What should I change in the script to achieve this?

Asked By: FaCoffee

||

Answers:

This is what I think should help:

import xlsxwriter
workbook = xlsxwriter.Workbook('myfile.xlsx')
worksheet = workbook.add_worksheet()
row = 0
col = 0

order=sorted(d.keys())
for key in order:
    row += 1
    worksheet.write(row, col,     key)
    i =1
    for item in d[key]:
        worksheet.write(row, col + i, item)
        i += 1

workbook.close()

IN:

d={'10071353':(0, 0),'06030011':(6, 0),'06030016':(2, 10)

OUT:
A           B    C
06030001    6    0

06030002    2    10

06030003    0    0
Answered By: SerialDev

The best way is to use pandas for this task. Some documentation is available here (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_excel.html )

import pandas as pd


a = {'1':[1,2,3,4], '2':[5,6,7,8]}
a = pd.DataFrame(a)


writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
a.to_excel(writer, sheet_name='Sheet1')
writer.save()

You may need to install xlsxwriter package

Answered By: korvinos

I think you just misplaced a variable.

worksheet.write(row, col + 1, item)
        row += 1

this is wrong, row +=1 should be replaced with col +=1

This is correct way, You can use the same variable.

import xlsxwriter
workbook = xlsxwriter.Workbook('myfile.xlsx')
worksheet = workbook.add_worksheet()
row = 0
col = 0
order=sorted(d.keys())
for key in order:
    row += 1
    print(key)
    worksheet.write(row, col,     key)
    for item in d[key]:
        print(item,row, col+1)
        worksheet.write(row, col + 1, item)
        col += 1
    col = 0
workbook.close()

Output:

enter image description here

Answered By: RejeeshChandran

@korvinos Pandas is a nice solution, but it requires all the dictionary entries to be of the same length if they’re arrays

Answered By: vmTim