【问题标题】:xlsxwriter and pandas for reporting用于报告的 xlsxwriter 和 pandas
【发布时间】:2019-01-09 16:49:21
【问题描述】:

我正在尝试创建一个基本的 Excel 报告。

我正在尝试显示数据框以及一些自定义文本/标题,而不是数据框的一部分。

但是,我只能选择其中之一。我不太明白数据框出现所需的代码结尾(workbook = writer.bookworksheet = writer.sheets['Reports']

这是我的代码:

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

因为现在的代码,它只显示数据框

【问题讨论】:

    标签: python pandas xlsxwriter


    【解决方案1】:

    我不清楚您是否要在一个 Excel 文件中写入多张工作表。如果是这样,问题可能是您正在重写同一张名为“报告”的工作表四次。此外,这里有一些基本的尝试。将df.to_excel() 放在pd.ExcelWriter() 之后。然后从for 循环中删除最后四行。最后,在for 循环结束后放置writer.save()。 (当我第一次学习它们时,这对我来说也不是很清楚。在this link查看更多示例。)

    编辑:这里是完全执行的代码(带有存根数据)。其中一个关键是使用writer.sheets['Reports'] = worksheet 启用对工作表的多次写入 - 请参阅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()
    

    【讨论】:

    • 我正在尝试显示 4 个数据框以及每个数据框顶部的一些基本标题。我无法添加文本,因为它没有显示出来。
    • 都在同一张纸上?
    • 是的,很抱歉造成混乱
    • 我编辑并测试了你的循环。试试这个版本 - 用您的实际数据替换存根。
    • @VincFort,这对你有用吗?如果是,请将其标记为已回答。告诉我。
    猜你喜欢
    • 2019-08-04
    • 2016-08-10
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多