From 48291896a67d787f22ff8989fdc20936960b63e1 Mon Sep 17 00:00:00 2001 From: yinzijian Date: Thu, 4 Dec 2025 16:04:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0excel=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinzijian --- app/cross_compare_common.py | 199 +++++++++++++++++++----------------- app/cross_compare_worker.py | 4 +- 2 files changed, 107 insertions(+), 96 deletions(-) diff --git a/app/cross_compare_common.py b/app/cross_compare_common.py index f469f56..a6694ff 100644 --- a/app/cross_compare_common.py +++ b/app/cross_compare_common.py @@ -269,7 +269,7 @@ def find_job_info(key, value_list): return result -def query_compare_data_export_excel(road_flow_delay_infos): +def query_compare_data_export_excel(compared_inroad_delay_infos, cross_name,compare_date_list,date_list,time_range): wb = Workbook() sheet1 = wb.active sheet1.title = "调度计划表" # 给第一个 sheet 命名 @@ -285,32 +285,27 @@ def query_compare_data_export_excel(road_flow_delay_infos): {"range": "H1:I1", "value": "转向停车次数"}, {"range": "H2", "value": "左转"}, {"range": "I2", "value": "直行"}, - {"range": "J1", "value": "多次停车率"}, - # {"range": "K1:L1", "value": "转向多次停车率", "width": 20}, - # {"range": "M1", "value": "行程时间(s)"}, - # {"range": "N1:O1", "value": "延误时间(s)", "width": 20}, - # {"range": "P1:Q1", "value": "转向延误时间(s)"}, - # {"range": "L2", "value": "左转"}, - # {"range": "M2", "value": "直行"}, - # {"range": "N1:N2", "value": "平均速度(km/h)", "width": 20}, - # {"range": "O1:P1", "value": "转向平均速度(km/h)"}, - # {"range": "O2", "value": "左转"}, - # {"range": "P2", "value": "直行"}, - # {"range": "Q1:Q2", "value": "不停车速度(km/h)", "width": 20}, - # {"range": "R1:S1", "value": "转向不停车速度"}, - # {"range": "R2", "value": "左转"}, - # {"range": "S2", "value": "直行"}, - # {"range": "T1:T2", "value": "进口道流量占比","width": 20}, - # {"range": "U1:W1", "value": "分流转向占比"}, - # {"range": "U2", "value": "左转"}, - # {"range": "V2", "value": "直行"}, - # {"range": "W2", "value": "右转"}, - # {"range": "X1:X2", "value": "出口道流量占比","width": 20}, - # {"range": "Y1:AA1", "value": "汇入转向占比"}, - # {"range": "Y2", "value": "左转"}, - # {"range": "Z2", "value": "直行"}, - # {"range": "AA2", "value": "右转"}, - # {"range": "AB1:AB2", "value": "转向失衡系数","width": 20}, + {"range": "J1:J2", "value": "多次停车率", "width": 20}, + {"range": "K1:L1", "value": "转向多次停车率"}, + {"range": "K2", "value": "左转", "width": 10}, + {"range": "L2", "value": "直行", "width": 10}, + # {"range": "M1:M2", "value": "行程时间(s)", "width": 20}, + # {"range": "N1:O1", "value": "转向行程时间(s)"}, + # {"range": "N2", "value": "左转", "width": 10}, + # {"range": "O2", "value": "直行", "width": 10}, + {"range": "M1:M2", "value": "延误时间(s)", "width": 20}, + {"range": "N1:O1", "value": "转向延误时间(s)"}, + {"range": "N2", "value": "左转", "width": 10}, + {"range": "O2", "value": "直行", "width": 10}, + {"range": "P1:P2", "value": "平均速度(Km/h)", "width": 20}, + {"range": "Q1:R1", "value": "转向平均速度(Km/h)"}, + {"range": "Q2", "value": "左转", "width": 10}, + {"range": "R2", "value": "直行", "width": 10}, + {"range": "S1:S2", "value": "不停车速度(Km/h)", "width": 20}, + {"range": "T1:U1", "value": "转向不停车速度(KM/h)"}, + {"range": "T2", "value": "左转", "width": 15}, + {"range": "U2", "value": "直行", "width": 15}, + {"range": "V1:V2", "value": "转向失衡系数", "width": 20}, ] for item_head in table_head: @@ -321,73 +316,89 @@ def query_compare_data_export_excel(road_flow_delay_infos): if item_head.get('width'): sheet1.column_dimensions[cell[:-1]].width = item_head['width'] - wb.save("test.xlsx") - exit(0) - src_dir_map = {} - for road, item_delay_infos in road_flow_delay_infos.items(): - src_dir = item_delay_infos['src_dir'] - if src_dir not in src_dir_map: - src_dir_map[src_dir] = [] - src_dir_map[src_dir].append(srcDir_toStr(item_delay_infos['src_dir'])) - src_dir_map[src_dir].append(item_delay_infos['service_level']) - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][1]['service_level'] if 1 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][0]['service_level'] if 0 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append(item_delay_infos['stop_times']) - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][1]['stop_times'] if 1 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][0]['stop_times'] if 0 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append(item_delay_infos['high_park_percent']) - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][1]['high_park_percent'] if 1 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][0]['high_park_percent'] if 0 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append(item_delay_infos['delay_time']) - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][1]['delay_time'] if 1 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][0]['delay_time'] if 0 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append(item_delay_infos['speed']) - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][1]['speed'] if 1 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][0]['speed'] if 0 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append(item_delay_infos['move_speed']) - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][1]['move_speed'] if 1 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append( - item_delay_infos['flow_delays'][0]['move_speed'] if 0 in item_delay_infos['flow_delays'] else '-') - src_dir_map[src_dir].append( - road_flow_turn_rate[road]['in_flow_rate'] if road in road_flow_turn_rate and road_flow_turn_rate[road][ - 'in_flow_rate'] else '-') - src_dir_map[src_dir].append( - road_flow_turn_rate[road]['l_rate'] if road in road_flow_turn_rate and road_flow_turn_rate[road][ - 'l_rate'] else '-') - src_dir_map[src_dir].append( - road_flow_turn_rate[road]['s_rate'] if road in road_flow_turn_rate and road_flow_turn_rate[road][ - 's_rate'] else '-') - src_dir_map[src_dir].append( - road_flow_turn_rate[road]['r_rate'] if road in road_flow_turn_rate and road_flow_turn_rate[road][ - 'r_rate'] else '-') - src_dir_map[src_dir].append( - road_flow_turn_rate[road]['out_flow_rate'] if road in road_flow_turn_rate and road_flow_turn_rate[road][ - 'out_flow_rate'] else '-') - src_dir_map[src_dir].append( - road_flow_turn_rate[road]['out_l_rate'] if road in road_flow_turn_rate and road_flow_turn_rate[road][ - 'out_l_rate'] else '-') - src_dir_map[src_dir].append( - road_flow_turn_rate[road]['out_s_rate'] if road in road_flow_turn_rate and road_flow_turn_rate[road][ - 'out_s_rate'] else '-') - src_dir_map[src_dir].append( - road_flow_turn_rate[road]['out_r_rate'] if road in road_flow_turn_rate and road_flow_turn_rate[road][ - 'out_r_rate'] else '-') - src_dir_map[src_dir].append(item_delay_infos['imbalance_index']) - src_dir_data = list(src_dir_map.values()) - for item_src_dir_data in src_dir_data: - sheet1.append(item_src_dir_data) + in_road_num = len(compared_inroad_delay_infos) + sheet1.merge_cells(f"A3:A{in_road_num * 3 + 2}") + sheet1["A3"] = cross_name + sheet1["A3"].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) + index = 3 + for road, road_value in compared_inroad_delay_infos.items(): + start_row = index + middle_row = index + 1 + end_row = index + 2 + sheet1.merge_cells(f"B{start_row}:B{end_row}") + sheet1[f"B{index}"] = srcDir_toStr(road_value['src_dir']) + sheet1[f"B{index}"].alignment = Alignment(horizontal='center', vertical='center') + index = end_row + 1 + sheet1[f"C{start_row}"] = "优化前" + sheet1[f"D{start_row}"] = road_value['dir_data']['comp_data']['service_level'] + sheet1[f"E{start_row}"] = road_value['dir_data']['flow_delay_datas'][1]['comp_data']['service_level'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"F{start_row}"] = road_value['dir_data']['flow_delay_datas'][0]['comp_data']['service_level'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"G{start_row}"] = road_value['dir_data']['comp_data']['stop_times'] + sheet1[f"H{start_row}"] = road_value['dir_data']['flow_delay_datas'][1]['comp_data']['stop_times'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"I{start_row}"] = road_value['dir_data']['flow_delay_datas'][0]['comp_data']['stop_times'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"J{start_row}"] = road_value['dir_data']['comp_data']['high_park_percent'] + sheet1[f"K{start_row}"] = road_value['dir_data']['flow_delay_datas'][1]['comp_data']['high_park_percent'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"L{start_row}"] = road_value['dir_data']['flow_delay_datas'][0]['comp_data']['high_park_percent'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"M{start_row}"] = road_value['dir_data']['comp_data']['delay_time'] + sheet1[f"M{start_row}"] = road_value['dir_data']['flow_delay_datas'][1]['comp_data']['delay_time'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"N{start_row}"] = road_value['dir_data']['flow_delay_datas'][0]['comp_data']['delay_time'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"P{start_row}"] = road_value['dir_data']['comp_data']['speed'] + sheet1[f"Q{start_row}"] = road_value['dir_data']['flow_delay_datas'][1]['comp_data']['speed'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"R{start_row}"] = road_value['dir_data']['flow_delay_datas'][0]['comp_data']['speed'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"S{start_row}"] = road_value['dir_data']['comp_data']['move_speed'] + sheet1[f"T{start_row}"] = road_value['dir_data']['flow_delay_datas'][1]['comp_data']['move_speed'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"U{start_row}"] = road_value['dir_data']['flow_delay_datas'][0]['comp_data']['move_speed'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"V{start_row}"] = road_value['dir_data']['comp_data']['imbalance_index'] + sheet1[f"C{middle_row}"] = "优化后" + sheet1[f"D{middle_row}"] = road_value['dir_data']['item_data']['service_level'] + sheet1[f"E{middle_row}"] = road_value['dir_data']['flow_delay_datas'][1]['item_data']['service_level'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"F{middle_row}"] = road_value['dir_data']['flow_delay_datas'][0]['item_data']['service_level'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"G{middle_row}"] = road_value['dir_data']['item_data']['stop_times'] + sheet1[f"H{middle_row}"] = road_value['dir_data']['flow_delay_datas'][1]['item_data']['stop_times'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"I{middle_row}"] = road_value['dir_data']['flow_delay_datas'][0]['item_data']['stop_times'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"J{middle_row}"] = road_value['dir_data']['item_data']['high_park_percent'] + sheet1[f"K{middle_row}"] = road_value['dir_data']['flow_delay_datas'][1]['item_data']['high_park_percent'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"L{middle_row}"] = road_value['dir_data']['flow_delay_datas'][0]['item_data']['high_park_percent'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"M{middle_row}"] = road_value['dir_data']['item_data']['delay_time'] + sheet1[f"N{middle_row}"] = road_value['dir_data']['flow_delay_datas'][1]['item_data']['delay_time'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"O{middle_row}"] = road_value['dir_data']['flow_delay_datas'][0]['item_data']['delay_time'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"P{middle_row}"] = road_value['dir_data']['item_data']['speed'] + sheet1[f"Q{middle_row}"] = road_value['dir_data']['flow_delay_datas'][1]['item_data']['speed'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"R{middle_row}"] = road_value['dir_data']['flow_delay_datas'][0]['item_data']['speed'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"S{middle_row}"] = road_value['dir_data']['item_data']['move_speed'] + sheet1[f"T{middle_row}"] = road_value['dir_data']['flow_delay_datas'][1]['item_data']['move_speed'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"U{middle_row}"] = road_value['dir_data']['flow_delay_datas'][0]['item_data']['move_speed'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"V{middle_row}"] = road_value['dir_data']['item_data']['imbalance_index'] + + sheet1[f"C{end_row}"] = "变化量" + sheet1[f"D{end_row}"] = road_value['dir_data']['diff_data']['service_level'] + sheet1[f"E{end_row}"] = road_value['dir_data']['flow_delay_datas'][1]['diff_data']['service_level'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"F{end_row}"] = road_value['dir_data']['flow_delay_datas'][0]['diff_data']['service_level'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"G{end_row}"] = road_value['dir_data']['diff_data']['stop_times'] + sheet1[f"H{end_row}"] = road_value['dir_data']['flow_delay_datas'][1]['diff_data']['stop_times'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"I{end_row}"] = road_value['dir_data']['flow_delay_datas'][0]['diff_data']['stop_times'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"J{end_row}"] = road_value['dir_data']['diff_data']['high_park_percent'] + sheet1[f"K{end_row}"] = road_value['dir_data']['flow_delay_datas'][1]['diff_data']['high_park_percent'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"L{end_row}"] = road_value['dir_data']['flow_delay_datas'][0]['diff_data']['high_park_percent'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"M{end_row}"] = road_value['dir_data']['diff_data']['delay_time'] + sheet1[f"N{end_row}"] = road_value['dir_data']['flow_delay_datas'][1]['diff_data']['delay_time'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"O{end_row}"] = road_value['dir_data']['flow_delay_datas'][0]['diff_data']['delay_time'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"P{end_row}"] = road_value['dir_data']['diff_data']['speed'] + sheet1[f"Q{end_row}"] = road_value['dir_data']['flow_delay_datas'][1]['diff_data']['speed'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"R{end_row}"] = road_value['dir_data']['flow_delay_datas'][0]['diff_data']['speed'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"S{end_row}"] = road_value['dir_data']['diff_data']['move_speed'] + sheet1[f"T{end_row}"] = road_value['dir_data']['flow_delay_datas'][1]['diff_data']['move_speed'] if road_value['dir_data']['flow_delay_datas'].get(1) else '' + sheet1[f"U{end_row}"] = road_value['dir_data']['flow_delay_datas'][0]['diff_data']['move_speed'] if road_value['dir_data']['flow_delay_datas'].get(0) else '' + sheet1[f"V{end_row}"] = road_value['dir_data']['diff_data']['imbalance_index'] + + center_alignment = Alignment(horizontal='center', vertical='center') + for row in sheet1.iter_rows(min_row=1, max_row=sheet1.max_row, + min_col=1, max_col=sheet1.max_column): + for cell in row: + if cell.value is not None: + cell.alignment = center_alignment + file_name = f"【{cross_name}】{compare_date_list[0]}-{compare_date_list[-1]} vs {date_list[0]}-{date_list[-1]} {time_range} 进口道及转向运行指标.xlsx" file_stream = io.BytesIO() wb.save(file_stream) file_stream.seek(0) # 将指针移到文件开头 @@ -395,4 +406,4 @@ def query_compare_data_export_excel(road_flow_delay_infos): file_stream, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', as_attachment=True, - download_name=f"路口诊断指标.xlsx") + download_name=file_name) diff --git a/app/cross_compare_worker.py b/app/cross_compare_worker.py index e891045..e89fb03 100644 --- a/app/cross_compare_worker.py +++ b/app/cross_compare_worker.py @@ -88,8 +88,8 @@ def query_compare_data(params): 'road_flow_delay_infos': compared_inroad_delay_infos } - # if export == 1: - # return query_compare_data_export_excel(compared_inroad_delay_infos) + if export == 1: + return query_compare_data_export_excel(compared_inroad_delay_infos, cross_static_info['name'],compare_date_list,date_list,time_range) return json.dumps(res, ensure_ascii=False)