xlsxwriter 和 pandas 用于报告
xlsxwriter and pandas for reporting
我正在尝试创建基本 excel 报告。
我正在尝试显示数据框以及一些自定义 text/titles,而不是数据框的一部分。
但是,我只能得到其中之一。我真的不明白数据框出现所需的代码结尾(workbook = writer.book
和 worksheet = 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()
由于代码是正确的,它只显示数据框
我不清楚您是否试图在一个 Excel 文件中写入多个 sheet。如果是这样,问题可能是您将同一个 sheet 重写为 'Reports' 四次。另外,这里有一些要尝试的基础知识。将 df.to_excel()
放在 pd.ExcelWriter()
之后。然后从 for
循环中删除最后四行。最后,在 for
循环结束后放置 writer.save()
。 (当我第一次学习它们时,这对我来说也不是很清楚。在 this link 查看更多示例。)
编辑:这是完全执行的代码(带有存根数据)。关键之一是使用 writer.sheets['Reports'] = worksheet
启用对作品 sheet 的多次写入 - 请参阅 .
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()
我正在尝试创建基本 excel 报告。
我正在尝试显示数据框以及一些自定义 text/titles,而不是数据框的一部分。
但是,我只能得到其中之一。我真的不明白数据框出现所需的代码结尾(workbook = writer.book
和 worksheet = 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()
由于代码是正确的,它只显示数据框
我不清楚您是否试图在一个 Excel 文件中写入多个 sheet。如果是这样,问题可能是您将同一个 sheet 重写为 'Reports' 四次。另外,这里有一些要尝试的基础知识。将 df.to_excel()
放在 pd.ExcelWriter()
之后。然后从 for
循环中删除最后四行。最后,在 for
循环结束后放置 writer.save()
。 (当我第一次学习它们时,这对我来说也不是很清楚。在 this link 查看更多示例。)
编辑:这是完全执行的代码(带有存根数据)。关键之一是使用 writer.sheets['Reports'] = worksheet
启用对作品 sheet 的多次写入 - 请参阅
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()