Let reports w/ Excel output write more than one data sheet

This commit is contained in:
Lance Edgar 2023-01-04 16:36:38 -06:00
parent 6106fb615d
commit a338369543
2 changed files with 36 additions and 17 deletions

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -233,16 +233,18 @@ class ExcelWriter(object):
def disable_grid_lines(self, sheet=None):
self.enable_grid_lines(sheet=sheet, enabled=False)
def write_header(self, labels=None):
def write_header(self, labels=None, sheet=None):
if not sheet:
sheet = self.sheet
font = Font(bold=True)
for i, field in enumerate(self.fields, 1):
value = field
if labels and field in labels:
value = labels[field]
cell = self.sheet.cell(row=1, column=i, value=value)
cell = sheet.cell(row=1, column=i, value=value)
cell.font = font
def write_row(self, data, row=None):
def write_row(self, data, row=None, sheet=None):
"""
Write (append) a single data row to the current sheet.
@ -251,13 +253,16 @@ class ExcelWriter(object):
if row is None:
raise NotImplementedError("should be able to detect 'next' row here?")
self.sheet.append(data)
if not sheet:
sheet = self.sheet
sheet.append(data)
# apply number formats
if self.number_formats:
for col, field in enumerate(self.fields, 1):
if field in self.number_formats:
cell = self.sheet.cell(row=row, column=col)
cell = sheet.cell(row=row, column=col)
cell.number_format = self.number_formats[field]
# apply row highlighting
@ -267,19 +272,21 @@ class ExcelWriter(object):
fgColor='d9d9d9',
bgColor='d9d9d9')
for col, field in enumerate(self.fields, 1):
cell = self.sheet.cell(row=row, column=col)
cell = sheet.cell(row=row, column=col)
cell.fill = fill_even
def write_rows(self, rows, progress=None):
def write_rows(self, rows, sheet=None, progress=None):
"""
Write (append) a sequence of data rows to the current sheet.
"""
def write(data, i):
# must add 1 to account for header
self.write_row(data, row=i + 1)
self.write_row(data, row=i + 1, sheet=sheet)
progress_loop(write, rows, progress,
message="Generating cells for spreadsheet")
msg = "Generating cells for sheet"
if sheet:
msg = "{}: {}".format(msg, sheet.title)
progress_loop(write, rows, progress, message=msg)
def auto_freeze(self, row=2, column=1):
"""

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -94,12 +94,15 @@ class ExcelReport(Report):
return ExcelWriter(path, fields, **kwargs)
def write_data_sheet(self, writer, session, params, data,
progress=None, **kwargs):
sheet=None, progress=None, **kwargs):
"""
Write the primary data sheet for the Excel output file.
"""
if not sheet:
sheet = writer.sheet
if self.write_data_header:
writer.write_header()
writer.write_header(sheet=sheet)
fields = self.get_output_fields(params)
# convert data to Excel-compatible rows
@ -126,14 +129,14 @@ class ExcelReport(Report):
rowdata.append(None)
# append row to output
writer.write_row(rowdata, row=len(data_rows) + 2)
writer.write_row(rowdata, row=len(data_rows) + 2, sheet=sheet)
# apply row highlighting
fill_totals = PatternFill(patternType='solid',
fgColor='ffee88',
bgColor='ffee88')
for col, field in enumerate(fields, 1):
cell = writer.sheet.cell(row=len(data_rows) + 2, column=col)
cell = sheet.cell(row=len(data_rows) + 2, column=col)
cell.fill = fill_totals
if self.auto_format_data:
@ -141,6 +144,15 @@ class ExcelReport(Report):
writer.auto_filter()
writer.auto_resize()
def write_data_sheets(self, writer, session, params, data,
progress=None, **kwargs):
"""
Write all data sheets for the report.
"""
# normally just write one data sheet
self.write_data_sheet(writer, session, params, data,
progress=progress, **kwargs)
def write_summary_sheet(self, writer, session, params, data,
progress=None, **kwargs):
"""
@ -178,7 +190,7 @@ class ExcelReport(Report):
"""
writer = self.make_excel_writer(path, params=params)
self.write_data_sheet(writer, session, params, data, progress=progress)
self.write_data_sheets(writer, session, params, data, progress=progress)
if self.include_summary_sheet:
self.write_summary_sheet(writer, session, params, data,