import time import openpyxl import pandas as pd import sqlite3 import os from PySide6.QtWidgets import QMessageBox from openpyxl.styles import Font, NamedStyle, Alignment from openpyxl.utils.dataframe import dataframe_to_rows def main_function(ui, file_path, utf_en, db_path): export_folder = os.path.dirname(file_path) if not os.path.exists(export_folder): os.makedirs(export_folder) # 连接数据库 conn = sqlite3.connect(db_path) try: # 查询数据库表为DataFrame,添加 TableName 条件 query = "SELECT * FROM GC_Output_Point WHERE TableName=?" df = pd.read_sql_query(query, conn, params=(utf_en,)) # 检查是否有匹配的数据 if df.empty: QMessageBox.warning(ui, '警告', '没有找到匹配的数据进行导出') conn.close() return # 假设 TableName 字段是以字节序列存储的 UTF-8 编码字符串 if 'TableName' in df.columns: try: df['TableName'] = df['TableName'].apply(lambda x: x.decode('utf-8') if isinstance(x, bytes) else x) except Exception as e: QMessageBox.critical(ui, '错误', f'TableName 字段解码失败: {str(e)}') conn.close() return # 删除 TableName 列 if 'TableName' in df.columns: df.drop(columns=['TableName'], inplace=True) # new HDiff 保留小数点后6位 if 'New_HDiff' in df.columns: df['New_HDiff'] = df['New_HDiff'].round(6) # New_RLen 保留小数点后6位 if 'New_RLen' in df.columns: df['New_RLen'] = df['New_RLen'].round(6) # Correct_Factor 保留小数点后2位 if 'Correct_Factor' in df.columns: df['Correct_Factor'] = df['Correct_Factor'].round(2) # Period_Diff 保留小数点后2位 if 'Period_Diff' in df.columns: df['Period_Diff'] = df['Period_Diff'].round(2) # 重命名指定的列 column_mapping = { 'New_ID': '序号', 'New_ResultName': '结果期数', 'New_SPName': '起点', 'New_EPName': '终点', 'New_HDiff': '高差', 'New_RLen': '路线长', 'Correct_Factor': '修正数', 'Period_Diff': '期间差异', 'Dis_Ass': '变形判定' } df.rename(columns=column_mapping, inplace=True) # 查询 GC_Input_Param 表获取 Correct_Factor 字段 query_param = "SELECT Correct_Factor FROM GC_Input_Param WHERE TableName=?" correct_factor_df = pd.read_sql_query(query_param, conn, params=(utf_en,)) correct_factor = correct_factor_df.iloc[0]['Correct_Factor'] # 创建一个新的 Excel 工作簿 from openpyxl import Workbook wb = Workbook() ws = wb.active # # 在最上面插入一行 # ws.insert_rows(1) # 在E1单元格添加内容“修正系数” ws.cell(row=1, column=1, value="序号") ws.cell(row=1, column=2, value="结果期数") ws.cell(row=1, column=3, value="起点") ws.cell(row=1, column=4, value="终点") ws.cell(row=1, column=5, value="修正系数") ws.cell(row=1, column=6, value=correct_factor) ws.cell(row=1, column=7, value="修正数") ws.cell(row=1, column=8, value="期间差异") ws.cell(row=1, column=9, value="变形判定") # 将 DataFrame 写入工作表 for r in dataframe_to_rows(df, index=False, header=True): ws.append(r) # 定义自定义样式 style_0_000000 = NamedStyle(name="style_0_000000", number_format='0.000000') style_0_00 = NamedStyle(name="style_0_00", number_format='0.00') # 添加样式到工作簿 wb.add_named_style(style_0_000000) wb.add_named_style(style_0_00) # 应用样式到相应列 hdiff_col_index = df.columns.get_loc('高差') + 1 # 获取“高差”列的索引(+1 因为 Excel 列索引从 1 开始) rlen_col_index = df.columns.get_loc('路线长') + 1 # 获取“路线长”列的索引 correct_factor_col_index = df.columns.get_loc('修正数') + 1 # 获取“修正数”列的索引 period_diff_col_index = df.columns.get_loc('期间差异') + 1 # 获取“期间差异”列的索引 for row in range(2, ws.max_row + 1): # 从第二行开始,因为第一行为标题行 ws.cell(row=row, column=hdiff_col_index).style = style_0_000000 ws.cell(row=row, column=rlen_col_index).style = style_0_000000 ws.cell(row=row, column=correct_factor_col_index).style = style_0_00 ws.cell(row=row, column=period_diff_col_index).style = style_0_00 # 设置 Dis_Ass 列为“变形”的行的字体颜色为红色 red_font = Font(color="FF0000") dis_ass_col_index = df.columns.get_loc('变形判定') + 1 # 获取“变形判定”列的索引 for row in range(2, ws.max_row + 1): # 从第二行开始,因为第一行为标题行 cell_value = ws.cell(row=row, column=dis_ass_col_index).value if cell_value == '变形': for col in range(1, ws.max_column + 1): ws.cell(row=row, column=col).font = red_font # 设置列宽 ws.column_dimensions['E'].width = 12 ws.column_dimensions['F'].width = 12 # 保存 Excel 文件之前添加单元格合并操作 merge_cells = ['A1:A2', 'B1:B2', 'C1:C2', 'D1:D2', 'G1:G2', 'H1:H2', 'I1:I2'] for cell_range in merge_cells: ws.merge_cells(cell_range) # 设置合并单元格后的居中对齐 for cell_range in merge_cells: cell = ws[cell_range.split(':')[0]] cell.alignment = Alignment(horizontal='center', vertical='center') # 保存 Excel 文件 excel_filename = f"水准测段高差计算成果表{time.strftime('%Y%m%d_%H%M%S')}.xlsx" excel_filepath = os.path.join(export_folder, excel_filename) wb.save(excel_filepath) QMessageBox.information(ui, '成功', f'成果文件已成功导出到 {export_folder}') except Exception as e: QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}') finally: # 关闭数据库连接 conn.close()