增加excel导出

Signed-off-by: yinzijian <yinzijian@haomozhixing.onaliyun.com>
This commit is contained in:
yinzijian 2025-12-04 16:04:38 +08:00
parent 2903d39b0a
commit 48291896a6
2 changed files with 107 additions and 96 deletions

View File

@ -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)

View File

@ -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)