添加文件
This commit is contained in:
@@ -1351,3 +1351,82 @@ class ReportExcel(models.Model):
|
||||
output.seek(0)
|
||||
response.stream.write(output.read())
|
||||
output.close()
|
||||
|
||||
def get_xlsx_meal_active_report(self, data, response):
|
||||
"""误餐归档明细报表的自定义 Excel 样式"""
|
||||
output = io.BytesIO()
|
||||
workbook = xlsxwriter.Workbook(output, {'in_memory': True})
|
||||
sheet = workbook.add_worksheet('误餐归档明细')
|
||||
tz = self.env.user.tz or 'Asia/Shanghai'
|
||||
from pytz import timezone
|
||||
user_tz = timezone(tz)
|
||||
header_format = workbook.add_format({'font_size': 11, 'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'bg_color': '#D3D3D3'})
|
||||
data_format = workbook.add_format({'font_size': 10, 'border': 1, 'align': 'center', 'valign': 'vcenter'})
|
||||
datetime_format = workbook.add_format({'font_size': 10, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'num_format': 'yyyy-mm-dd hh:mm'})
|
||||
date_format = workbook.add_format({'font_size': 10, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'num_format': 'yyyy-mm-dd'})
|
||||
col = 0
|
||||
for label in data['field_label']:
|
||||
sheet.write(0, col, label, header_format)
|
||||
if col == 0:
|
||||
sheet.set_column(col, col, 15)
|
||||
elif col == 1:
|
||||
sheet.set_column(col, col, 18)
|
||||
elif col == 2:
|
||||
sheet.set_column(col, col, 18)
|
||||
elif col in [3, 4]:
|
||||
sheet.set_column(col, col, 20)
|
||||
elif col == 6:
|
||||
sheet.set_column(col, col, 40)
|
||||
else:
|
||||
sheet.set_column(col, col, 15)
|
||||
col += 1
|
||||
records = []
|
||||
active_ids = data.get('active_ids')
|
||||
if active_ids:
|
||||
records = self.env[data['model_name']].browse(active_ids)
|
||||
else:
|
||||
records = self.env[data['model_name']].search([])
|
||||
row = 1
|
||||
for rec in records:
|
||||
col = 0
|
||||
for field_name in data['fields_name']:
|
||||
field = rec._fields.get(field_name)
|
||||
value = rec[field_name]
|
||||
if isinstance(value, datetime.datetime):
|
||||
if value:
|
||||
from pytz import UTC
|
||||
value_utc = UTC.localize(value) if value.tzinfo is None else value
|
||||
value_local = value_utc.astimezone(user_tz)
|
||||
sheet.write_datetime(row, col, value_local.replace(tzinfo=None), datetime_format)
|
||||
else:
|
||||
sheet.write(row, col, '', data_format)
|
||||
elif isinstance(value, datetime.date):
|
||||
sheet.write_datetime(row, col, value, date_format)
|
||||
elif field:
|
||||
if field.type == 'many2one':
|
||||
value = value.display_name if value else ''
|
||||
sheet.write(row, col, value, data_format)
|
||||
elif field.type == 'many2many':
|
||||
value = ', '.join(value.mapped('display_name')) if value else ''
|
||||
sheet.write(row, col, value, data_format)
|
||||
elif field.type == 'selection':
|
||||
selection_dict = dict(field.selection)
|
||||
value = selection_dict.get(value, value or '')
|
||||
sheet.write(row, col, value, data_format)
|
||||
elif field.type == 'float':
|
||||
sheet.write(row, col, value or 0, data_format)
|
||||
elif field.type == 'text':
|
||||
sheet.write(row, col, value or '', data_format)
|
||||
else:
|
||||
sheet.write(row, col, value or '', data_format)
|
||||
else:
|
||||
sheet.write(row, col, value or '', data_format)
|
||||
col += 1
|
||||
row += 1
|
||||
if row > 1:
|
||||
sheet.autofilter(0, 0, row - 1, len(data['field_label']) - 1)
|
||||
sheet.freeze_panes(1, 0)
|
||||
workbook.close()
|
||||
output.seek(0)
|
||||
response.stream.write(output.read())
|
||||
output.close()
|
||||
|
||||
Reference in New Issue
Block a user