Let reports w/ Excel output write more than one data sheet
This commit is contained in:
parent
6106fb615d
commit
a338369543
2 changed files with 36 additions and 17 deletions
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue