from io import BytesIO from openpyxl import Workbook from openpyxl.styles import Font, PatternFill DEVICE_HEADERS = ["考勤点", "设备号", "设备类型", "使用时长(分钟)", "使用时长(小时)", "使用时长(天)", "清洗数量", "报工次数"] MOLD_HEADERS = ["考勤点", "产品名称", "工序", "冲压方式", "使用时长(分钟)", "使用时长(小时)", "使用时长(天)", "清洗数量", "报工次数"] def export_usage_stats_rows(device_rows: list, mold_rows: list) -> bytes: workbook = Workbook() device_sheet = workbook.active device_sheet.title = "设备统计" mold_sheet = workbook.create_sheet("模具统计") _write_device_sheet(device_sheet, device_rows) _write_mold_sheet(mold_sheet, mold_rows) output = BytesIO() workbook.save(output) return output.getvalue() def _write_device_sheet(sheet, rows: list) -> None: _append_headers(sheet, DEVICE_HEADERS) for row in rows: minutes, hours, days, quantity = _metric_values(row) sheet.append( [ row.attendance_point_name, row.name, row.object_type, minutes, hours, days, quantity, row.report_count, ] ) _set_widths(sheet, [16, 16, 16, 16, 16, 14, 12, 12]) def _write_mold_sheet(sheet, rows: list) -> None: _append_headers(sheet, MOLD_HEADERS) for row in rows: minutes, hours, days, quantity = _metric_values(row) sheet.append( [ row.attendance_point_name, row.product_name, row.process_name, row.stamping_method, minutes, hours, days, quantity, row.report_count, ] ) _set_widths(sheet, [16, 24, 12, 16, 16, 16, 14, 12, 12]) def _metric_values(row) -> tuple[float, float, float, float]: if row.metric_kind == "quantity": return 0, 0, 0, row.value minutes = row.value return minutes, round(minutes / 60, 2), round(minutes / 1440, 2), 0 def _append_headers(sheet, headers: list[str]) -> None: sheet.append(headers) fill = PatternFill(fill_type="solid", fgColor="FFEFEFEF") font = Font(bold=True) for cell in sheet[1]: cell.fill = fill cell.font = font def _set_widths(sheet, widths: list[int]) -> None: for index, width in enumerate(widths, start=1): column_letter = sheet.cell(row=1, column=index).column_letter sheet.column_dimensions[column_letter].width = width