Index: bunco_app.py ================================================================== --- bunco_app.py +++ bunco_app.py @@ -73,10 +73,11 @@ return " ".join(ts) def excel_sheet(title): wb = xlsxwriter.Workbook('bunco.xlsx') ws = wb.add_worksheet('Overview') + style = {} col_heading = wb.add_format({'font_name': 'Back Issues BB', 'font_size': 12, 'align': 'center'}) title_style = wb.add_format({'font_name': 'Back Issues BB', @@ -91,10 +92,59 @@ 'color': '#0070C0'}) total_style = wb.add_format({'font_name': 'Milk Mustache BB', 'font_size': 14, 'align': 'center', 'bold': 'true'}) + + style['player_title'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 28, + 'bold': True, + 'color': '#0096FF'}) + style['player_subtitle'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 16}) + style['score_col_head'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 12, + 'bold': 'true', + 'align': 'center'}) + style['score_row_head'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 16, + 'bold': 'true', + 'align': 'center'}) + style['score_num'] = wb.add_format({'font_name': 'Milk Mustache BB', + 'font_size': 18, + 'align': 'right', + 'num_format': '_(* #,##0_);_(* (#,##0);_(* "-"??_);_(@_)', + 'color': '#833C0C'}) + style['score_total'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 18, + 'align': 'right', + 'top': 1, + 'num_format': '_(* #,##0_);_(* (#,##0);_(* "-"??_);_(@_)'}) + style['wins'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 18, + 'color': '#548235', + 'align': 'center'}) + style['losses'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 18, + 'color': '#FF0000', + 'align': 'center'}) + style['wins_t'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 18, + 'color': '#548235', + 'top': 1, + 'align': 'center'}) + style['losses_t'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 18, + 'color': '#FF0000', + 'top': 1, + 'align': 'center'}) + style['stat_name'] = wb.add_format({'font_name': 'Milk Mustache BB', + 'bold': 'true', + 'font_size': 16}) + style['stat_val'] = wb.add_format({'font_name': 'Back Issues BB', + 'font_size': 18, + 'align': 'right'}) ws.set_column('A:A', 30) ws.write('A1', title, title_style) ws.set_landscape() @@ -130,6 +180,68 @@ ws.write(row, end_col + 2, sum(player.round_wins), total_style) ws.write(row, end_col + 3, sum(losses), total_style) ws.write(row, end_col + 4, sum(player.round_bunco_counts), total_style) ws.write(row, end_col + 5, sum(player.round_roll_counts), total_style) + excel_score_sheet(wb, style, player, title) + + end_row = 3 + len(g.players) + ws.write(end_row + 1, 0, "Prizes", title_style) + wb.close() + +def excel_score_sheet(workbook, styles, player, title): + ws = workbook.add_worksheet(player.name) + + ws.set_column('A:A', 14) + ws.set_column('B:C', 13) + ws.set_column('D:D', 19) + ws.set_column('E:F', 12) + ws.set_portrait() + ws.fit_to_pages(1, 1) + + ws.write('A1', player.name, styles['player_title']) + ws.write('A2', f"{title} Score Sheet", styles['player_subtitle']) + + cols = ['Round', 'Rolls', 'Buncos?', 'Team Score', 'Win', 'Loss'] + for n, col in enumerate(cols): + ws.write(3, n, col, styles['score_col_head']) + + for n in range(g.current_round()): + row = 4 + n + ws.write(row, 0, n + 1, styles['score_col_head']) + ws.write(row, 1, player.round_roll_counts[n], styles['score_num']) + ws.write(row, 3, player.round_scores[n], styles['score_num']) + + if player.round_bunco_counts[n] > 0: + ws.write(row, 2, player.round_bunco_counts[n], styles['score_num']) + if player.round_wins[n] > 0: + ws.write(row, 4, "✓", styles['wins']) + else: + ws.write(row, 5, "✓", styles['losses']) + + end_row = 3 + g.current_round() + + # derive losses from wins + losses = [int(not x) for x in player.round_wins] + ws.write(end_row + 1, 0, '', styles['score_total']) + ws.write(end_row + 1, 1, sum(player.round_roll_counts), styles['score_total']) + ws.write(end_row + 1, 2, sum(player.round_bunco_counts), styles['score_total']) + ws.write(end_row + 1, 3, sum(player.round_scores), styles['score_total']) + ws.write(end_row + 1, 4, sum(player.round_wins), styles['wins_t']) + ws.write(end_row + 1, 5, sum(losses), styles['losses_t']) + + stats = ['Longest time with fuzzy die', + 'Highest roll streak', + f"Difference from average score of {g.average_total_score():.2f}", + f"Difference from median score of {g.median_total_score():.2f}", + "Average % of team score"] + + for n, stat in enumerate(stats): + ws.write(end_row + 3 + n, 0, stat, styles['stat_name']) + + ws.write(end_row + 3, 5, f"{player.max_fuzzydie_streak // 60}:{player.max_fuzzydie_streak % 60:02}", + styles['stat_val']) + ws.write(end_row + 4, 5, player.max_streak, styles['stat_val']) + ws.write(end_row + 5, 5, f"{sum(player.round_scores) - g.average_total_score():.2f}", styles['stat_val']) + ws.write(end_row + 6, 5, f"{sum(player.round_scores) - g.median_total_score():.2f}", styles['stat_val']) + ws.write(end_row + 7, 5, f"{player.average_contrib_pct():.2%}", styles['stat_val'])