1

I am trying to create a basic excel report.

I am trying display a dataframe as well as some custom text/titles, not part of the dataframe.

However, I can only get one or the other. I don't really understand the end of the code that is needed for the dataframe to appear (workbook = writer.book and worksheet = writer.sheets['Reports'].

Here is my code:

writer = pd.ExcelWriter('reportTemplate.xlsx', engine='xlsxwriter')

workbook = xlsxwriter.Workbook('reportTemplate.xlsx')
worksheet = workbook.add_worksheet('Reports')

# REPORT TITLE
worksheet.write('D2','Daily In-Store Report')

workbook = xlsxwriter.Workbook('reportTemplate.xlsx')
worksheet = workbook.add_worksheet('Reports')
worksheet.write('D2','Daily In-Store Report')

reportTimes = ['Day','Week','Period','Quarter','Year']
cityList = ['ontario','bayshore','ottawa','limeridge','oshawa','scarborough','sherway','massonville','gatineau',
            'quebec','anjou','dix30','Fairview','laval','mtltrust','stbruno','gcapitale','stefoy','rivieres','chicoutimi','sherbrooke','canada']

# LOOP THROUGH FILES
rowNb = 4
for time in reportTimes:
    # TITLE
    tableTitle = time + ' report as of ...'
    worksheet.write('A'+str(rowNb),tableTitle)
    rowNb += 1

    headRow, secondHead = createHeadings(time)
    worksheet.write_row('B' + str(rowNb), headRow)  
    worksheet.write_row('B' + str(rowNb), secondHead)
    rowNb += 2

    df = pd.read_csv('fy_' + time.lower() + '.csv')
    df.set_index('legacy_id',inplace=True)
    df = df.reindex(cityList)
    print(df)

    df.to_excel(writer,sheet_name='Reports',startrow = rowNb,header=False)

    workbook  = writer.book
    worksheet = writer.sheets['Reports']

    writer.save()

As the code is right now, it only displays the dataframe

VincFort
  • 1,150
  • 12
  • 29

1 Answers1

1

It's not clear to me whether you're trying to write multiple sheets in one Excel file. If so, the problem may be that you're re-writing the same sheet called 'Reports' four times. Also, here are some basics to try. Put the df.to_excel() after pd.ExcelWriter(). Then remove from the for loop the last four lines. Finally, put writer.save() after the for loop ends. (This was not very clear for me when I first learned them, too. See more examples at this link.)

Edit: here's fully executing code (with stub data). One of of the keys was to enable multiple writes to the worksheet using writer.sheets['Reports'] = worksheet - see this explanation.

dummy_df = pd.DataFrame([[10,np.NaN],[12,42],[16,np.NaN],[20,3],[25,16],[30,1],[40,19],[60,99]],columns=['legacy_id', 'b'])
writer = pd.ExcelWriter('reportTemplate.xlsx', engine='xlsxwriter')
workbook = writer.book
worksheet = workbook.add_worksheet('Reports')
writer.sheets['Reports'] = worksheet # enable multiple writes to sheet

# REPORT TITLE
worksheet.write('D2','Daily In-Store Report')

reportTimes = ['Day','Week','Period','Quarter','Year']
cityList = ['ontario','bayshore','ottawa','limeridge','oshawa','scarborough','sherway','massonville','gatineau',
            'quebec','anjou','dix30','Fairview','laval','mtltrust','stbruno','gcapitale','stefoy','rivieres','chicoutimi','sherbrooke','canada']

# LOOP THROUGH FILES
rowNb = 4
for time in reportTimes:
    # TITLE
    tableTitle = time + ' report as of ...'
    worksheet.write('A'+str(rowNb),tableTitle)
    rowNb += 1

    headRow, secondHead = "dummy head row", "dummy second head" #I don't have your createHeadings(time)
    worksheet.write_row('B' + str(rowNb), headRow)  
    worksheet.write_row('B' + str(rowNb), secondHead)
    rowNb += 2

    df = dummy_df.copy(deep=True) # pd.read_csv('fy_' + time.lower() + '.csv')
    df.set_index('legacy_id',inplace=True)
    df = df.reindex(cityList)
    #print(df)
    df.to_excel(writer,sheet_name='Reports', startrow = rowNb)
    rowNb += df.shape[0] #gives row count

writer.save()
David Gaertner
  • 386
  • 2
  • 7