控制网复测平面基准归算程序(包含控制网复测平面基准计算,平面控制网稳定性计算,水准测段高差稳定计算三个程序功能)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import time
  2. import openpyxl
  3. import pandas as pd
  4. import sqlite3
  5. import os
  6. from PySide6.QtWidgets import QMessageBox
  7. from openpyxl.styles import Font, NamedStyle, Alignment
  8. from openpyxl.utils.dataframe import dataframe_to_rows
  9. def main_function(ui, utf_en, db_path):
  10. # 获取应用的安装目录
  11. app_install_dir = os.path.dirname(os.path.abspath(__file__)) # 假设脚本文件位于应用的安装目录下
  12. export_folder = os.path.join(app_install_dir, 'Export')
  13. # 如果 Export 文件夹不存在,则创建它
  14. if not os.path.exists(export_folder):
  15. os.makedirs(export_folder)
  16. # 连接数据库
  17. conn = sqlite3.connect(db_path)
  18. try:
  19. # 查询数据库表为DataFrame,添加 TableName 条件
  20. query = "SELECT * FROM GC_Output_Point WHERE TableName=?"
  21. df = pd.read_sql_query(query, conn, params=(utf_en,))
  22. # 检查是否有匹配的数据
  23. if df.empty:
  24. QMessageBox.warning(ui, '警告', '没有找到匹配的数据进行导出')
  25. conn.close()
  26. return
  27. # 假设 TableName 字段是以字节序列存储的 UTF-8 编码字符串
  28. if 'TableName' in df.columns:
  29. try:
  30. df['TableName'] = df['TableName'].apply(lambda x: x.decode('utf-8') if isinstance(x, bytes) else x)
  31. except Exception as e:
  32. QMessageBox.critical(ui, '错误', f'TableName 字段解码失败: {str(e)}')
  33. conn.close()
  34. return
  35. # 删除 TableName 列
  36. if 'TableName' in df.columns:
  37. df.drop(columns=['TableName'], inplace=True)
  38. # new HDiff 保留小数点后6位
  39. if 'New_HDiff' in df.columns:
  40. df['New_HDiff'] = df['New_HDiff'].round(6)
  41. # New_RLen 保留小数点后6位
  42. if 'New_RLen' in df.columns:
  43. df['New_RLen'] = df['New_RLen'].round(6)
  44. # Correct_Factor 保留小数点后2位
  45. if 'Correct_Factor' in df.columns:
  46. df['Correct_Factor'] = df['Correct_Factor'].round(2)
  47. # Period_Diff 保留小数点后2位
  48. if 'Period_Diff' in df.columns:
  49. df['Period_Diff'] = df['Period_Diff'].round(2)
  50. # 重命名指定的列
  51. column_mapping = {
  52. 'New_ID': '序号',
  53. 'New_ResultName': '结果期数',
  54. 'New_SPName': '起点',
  55. 'New_EPName': '终点',
  56. 'New_HDiff': '高差',
  57. 'New_RLen': '路线长',
  58. 'Correct_Factor': '修正数',
  59. 'Period_Diff': '期间差异',
  60. 'Dis_Ass': '变形判定'
  61. }
  62. df.rename(columns=column_mapping, inplace=True)
  63. # 查询 GC_Input_Param 表获取 Correct_Factor 字段
  64. query_param = "SELECT Correct_Factor FROM GC_Input_Param WHERE TableName=?"
  65. correct_factor_df = pd.read_sql_query(query_param, conn, params=(utf_en,))
  66. correct_factor = correct_factor_df.iloc[0]['Correct_Factor']
  67. # 创建一个新的 Excel 工作簿
  68. from openpyxl import Workbook
  69. wb = Workbook()
  70. ws = wb.active
  71. # # 在最上面插入一行
  72. # ws.insert_rows(1)
  73. # 在E1单元格添加内容“修正系数”
  74. ws.cell(row=1, column=1, value="序号")
  75. ws.cell(row=1, column=2, value="结果期数")
  76. ws.cell(row=1, column=3, value="起点")
  77. ws.cell(row=1, column=4, value="终点")
  78. ws.cell(row=1, column=5, value="修正系数")
  79. ws.cell(row=1, column=6, value=correct_factor)
  80. ws.cell(row=1, column=7, value="修正数")
  81. ws.cell(row=1, column=8, value="期间差异")
  82. ws.cell(row=1, column=9, value="变形判定")
  83. # 将 DataFrame 写入工作表
  84. for r in dataframe_to_rows(df, index=False, header=True):
  85. ws.append(r)
  86. # 定义自定义样式
  87. style_0_000000 = NamedStyle(name="style_0_000000", number_format='0.000000')
  88. style_0_00 = NamedStyle(name="style_0_00", number_format='0.00')
  89. # 添加样式到工作簿
  90. wb.add_named_style(style_0_000000)
  91. wb.add_named_style(style_0_00)
  92. # 应用样式到相应列
  93. hdiff_col_index = df.columns.get_loc('高差') + 1 # 获取“高差”列的索引(+1 因为 Excel 列索引从 1 开始)
  94. rlen_col_index = df.columns.get_loc('路线长') + 1 # 获取“路线长”列的索引
  95. correct_factor_col_index = df.columns.get_loc('修正数') + 1 # 获取“修正数”列的索引
  96. period_diff_col_index = df.columns.get_loc('期间差异') + 1 # 获取“期间差异”列的索引
  97. for row in range(2, ws.max_row + 1): # 从第二行开始,因为第一行为标题行
  98. ws.cell(row=row, column=hdiff_col_index).style = style_0_000000
  99. ws.cell(row=row, column=rlen_col_index).style = style_0_000000
  100. ws.cell(row=row, column=correct_factor_col_index).style = style_0_00
  101. ws.cell(row=row, column=period_diff_col_index).style = style_0_00
  102. # 设置 Dis_Ass 列为“变形”的行的字体颜色为红色
  103. red_font = Font(color="FF0000")
  104. dis_ass_col_index = df.columns.get_loc('变形判定') + 1 # 获取“变形判定”列的索引
  105. for row in range(2, ws.max_row + 1): # 从第二行开始,因为第一行为标题行
  106. cell_value = ws.cell(row=row, column=dis_ass_col_index).value
  107. if cell_value == '变形':
  108. for col in range(1, ws.max_column + 1):
  109. ws.cell(row=row, column=col).font = red_font
  110. # 设置列宽
  111. ws.column_dimensions['E'].width = 12
  112. ws.column_dimensions['F'].width = 12
  113. # 保存 Excel 文件之前添加单元格合并操作
  114. merge_cells = ['A1:A2', 'B1:B2', 'C1:C2', 'D1:D2', 'G1:G2', 'H1:H2', 'I1:I2']
  115. for cell_range in merge_cells:
  116. ws.merge_cells(cell_range)
  117. # 设置合并单元格后的居中对齐
  118. for cell_range in merge_cells:
  119. cell = ws[cell_range.split(':')[0]]
  120. cell.alignment = Alignment(horizontal='center', vertical='center')
  121. # 保存 Excel 文件
  122. excel_filename = f"水准测段高差计算成果表{time.strftime('%Y%m%d_%H%M%S')}.xlsx"
  123. excel_filepath = os.path.join(export_folder, excel_filename)
  124. wb.save(excel_filepath)
  125. QMessageBox.information(ui, '成功', f'成果文件已成功导出到 {export_folder}')
  126. except Exception as e:
  127. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  128. finally:
  129. # 关闭数据库连接
  130. conn.close()