控制网复测平面基准归算程序(包含控制网复测平面基准计算,平面控制网稳定性计算,水准测段高差稳定计算三个程序功能)
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

GC.py 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import openpyxl
  2. import sqlite3
  3. import os
  4. from openpyxl import Workbook
  5. from PySide6.QtWidgets import QApplication, QMessageBox
  6. # 读取指定单元格的数据
  7. def read_cells_from_excel(cells, sheet):
  8. """
  9. 读取指定单元格的数据并返回字典。
  10. """
  11. cell_values = {}
  12. for cell in cells:
  13. cell_values[cell] = sheet[cell].value
  14. return cell_values
  15. # 获取最后一行有数字的单元格值
  16. def get_last_numeric_cell_value(sheet, column):
  17. """
  18. 获取指定列的最后一行有数字的单元格的值。
  19. """
  20. last_row = sheet.max_row
  21. for row in range(last_row, 0, -1):
  22. cell_value = sheet[f"{column}{row}"].value
  23. if isinstance(cell_value, (int, float)):
  24. return cell_value
  25. return None
  26. # 计算指定列中数值型数据的总和
  27. def calculate_column_sum(sheet, column):
  28. """
  29. 计算指定列中数值型数据的总和。
  30. """
  31. total_sum = 0
  32. for row in range(1, sheet.max_row + 1):
  33. cell_value = sheet[f"{column}{row}"].value
  34. if isinstance(cell_value, (int, float)):
  35. total_sum += cell_value
  36. return total_sum
  37. # 读取Excel文件并计算公式结果
  38. def load_and_calculate_excel(file_path):
  39. # 加载Excel文件并计算单元格H1的公式结果。
  40. workbook = openpyxl.load_workbook(file_path, data_only=True)
  41. sheet = workbook.active
  42. h1_value = sheet['H1'].value
  43. return h1_value
  44. # 弹窗提示用户是否更新数据
  45. def ask_for_update(file_name):
  46. response = QMessageBox.question(None, "提示", f"检测到数据库中存在相同文件 '{file_name}',是(Yes)否(No)更新数据?",
  47. QMessageBox.Yes | QMessageBox.No)
  48. return response == QMessageBox.Yes
  49. # 数据库插入函数,插入数据到GC_Input_Param中
  50. def insert_into_database(file_name, cell_values, ms_station, last_station_count, new_station_count, last_sum_hdiff,
  51. new_sum_hdiff,
  52. last_sum_rlen, new_sum_rlen, db_path, file_name_utf8):
  53. """
  54. 将文件名和结果名称插入或更新到数据库的GC_Input_Param表中。
  55. """
  56. database = db_path
  57. conn = sqlite3.connect(database=database)
  58. cursor = conn.cursor()
  59. try:
  60. # 查询是否已存在相同的记录
  61. cursor.execute(
  62. "SELECT * FROM GC_Input_Param WHERE TableName = ?",
  63. (file_name_utf8,)
  64. )
  65. existing_record = cursor.fetchone()
  66. if existing_record:
  67. # 弹窗询问用户是否更新数据
  68. if not ask_for_update(file_name):
  69. print("用户选择不更新数据")
  70. return
  71. # 更新现有记录
  72. cursor.execute(
  73. """
  74. UPDATE GC_Input_Param
  75. SET Last_ResultName = ?, ObservationLevel = ?, New_ResultName = ?, Ms_Station = ?,
  76. Last_StationCount = ?, New_StationCount = ?, Last_SumHDiff = ?, New_SumHDiff = ?,
  77. Last_SumRLen = ?, New_SumRLen = ?
  78. WHERE TableName = ?
  79. """,
  80. (cell_values['D1'], cell_values['C1'], cell_values['I1'], ms_station, last_station_count,
  81. new_station_count, last_sum_hdiff, new_sum_hdiff, last_sum_rlen, new_sum_rlen, file_name_utf8)
  82. )
  83. QMessageBox.information(None, "提示",
  84. f"文件 '{file_name}' 已成功更新到本地数据库中,点击'OK'以关闭此对话框。对话框关闭后,请点击“计算”以重新计算数据")
  85. else:
  86. # 插入新记录
  87. cursor.execute(
  88. """
  89. INSERT INTO GC_Input_Param (TableName, Last_ResultName, ObservationLevel, New_ResultName, Ms_Station,
  90. Last_StationCount, New_StationCount, Last_SumHDiff, New_SumHDiff,
  91. Last_SumRLen, New_SumRLen)
  92. VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  93. """,
  94. (
  95. file_name_utf8, cell_values['D1'], cell_values['C1'], cell_values['I1'], ms_station, last_station_count,
  96. new_station_count, last_sum_hdiff, new_sum_hdiff, last_sum_rlen, new_sum_rlen)
  97. )
  98. QMessageBox.information(None, "提示",
  99. f"文件 '{file_name}' 已成功添加到本地数据库中,点击'OK'以关闭此对话框。对话框关闭后,请点击“计算”以计算数据")
  100. conn.commit()
  101. except sqlite3.Error as e:
  102. print(f"插入或更新文件名时发生错误: {e}")
  103. except Exception as e:
  104. print(f"处理文件时发生错误: {e}")
  105. finally:
  106. conn.close()
  107. # 遍历获取序号的数据
  108. def get_data_from_excel(file_path):
  109. """
  110. 从 Excel 文件中获取对应列的数据。
  111. """
  112. workbook = openpyxl.load_workbook(file_path)
  113. sheet = workbook.active
  114. data = []
  115. for row in range(3, sheet.max_row + 1):
  116. a_value = sheet[f"A{row}"].value
  117. b_value = sheet[f"B{row}"].value
  118. c_value = sheet[f"C{row}"].value
  119. d_value = sheet[f"D{row}"].value
  120. e_value = sheet[f"E{row}"].value
  121. f_value = sheet[f"F{row}"].value
  122. g_value = sheet[f"G{row}"].value
  123. h_value = sheet[f"H{row}"].value
  124. i_value = sheet[f"I{row}"].value
  125. j_value = sheet[f"J{row}"].value
  126. if a_value is not None or f_value is not None:
  127. data.append((a_value, b_value, c_value, d_value, e_value, f_value, g_value, h_value, i_value, j_value))
  128. return data
  129. # 插入点数据到GC_Input_Point中
  130. def insert_data_into_database(data, file_name, cell_values, db_path, file_name_utf8):
  131. """
  132. 将数据插入到数据库表 GC_Input_Point 中。如果 TableName 相同,则清空表,
  133. 然后插入新的数据。
  134. """
  135. database = db_path
  136. conn = sqlite3.connect(database=database)
  137. cursor = conn.cursor()
  138. try:
  139. # 检查是否已存在相同的 TableName
  140. cursor.execute(
  141. "SELECT * FROM GC_Input_Point WHERE TableName = ?",
  142. (file_name_utf8,)
  143. )
  144. existing_record = cursor.fetchone()
  145. if existing_record:
  146. # 如果存在相同的 TableName,清空表
  147. cursor.execute("DELETE FROM GC_Input_Point WHERE TableName = ?", (file_name_utf8,))
  148. conn.commit()
  149. # 插入新数据
  150. for a_value, b_value, c_value, d_value, e_value, f_value, g_value, h_value, i_value, j_value in data:
  151. cursor.execute(
  152. """
  153. INSERT INTO GC_Input_Point (Last_ID, Last_SPName, Last_EPName,Last_HDiff,Last_RLen, New_ID, New_SPName, New_EPName,New_HDiff,New_RLen, TableName, Last_ResultName, New_ResultName)
  154. VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  155. """,
  156. (a_value, b_value, c_value, d_value, e_value, f_value, g_value, h_value, i_value, j_value,
  157. file_name_utf8,
  158. cell_values['D1'],
  159. cell_values['I1'])
  160. )
  161. conn.commit()
  162. except sqlite3.Error as e:
  163. print(f"插入或更新点数据时发生错误: {e}")
  164. except Exception as e:
  165. print(f"处理文件时发生错误: {e}")
  166. finally:
  167. conn.close()
  168. # 主函数 读取excel文件
  169. def main_function(file_path, db_path):
  170. # 调用读取Excel文件的函数
  171. file_name = os.path.basename(file_path)
  172. file_name_utf8 = file_name.encode('utf-8')
  173. # 加载工作簿
  174. workbook = openpyxl.load_workbook(file_path)
  175. sheet = workbook.active
  176. # 计算单元格 H1 的公式结果
  177. ms_station = load_and_calculate_excel(file_path)
  178. # 读取指定单元格的数据
  179. cells_to_read = ['D1', 'C1', 'I1']
  180. cell_values = read_cells_from_excel(cells_to_read, sheet)
  181. # 获取最后一行有数字的单元格值
  182. last_station_count = get_last_numeric_cell_value(sheet, 'A')
  183. new_station_count = get_last_numeric_cell_value(sheet, 'F')
  184. # 计算 D 列和 I 列中数值型数据的总和 总高差
  185. last_sum_hdiff = calculate_column_sum(sheet, 'D')
  186. new_sum_hdiff = calculate_column_sum(sheet, 'I')
  187. # 总路线长
  188. last_sum_rlen = calculate_column_sum(sheet, 'E')
  189. new_sum_rlen = calculate_column_sum(sheet, 'J')
  190. # 插入点的数组
  191. data = get_data_from_excel(file_path)
  192. # 调用插入数据库的函数
  193. if file_name:
  194. insert_into_database(file_name, cell_values, ms_station, last_station_count, new_station_count, last_sum_hdiff,
  195. new_sum_hdiff, last_sum_rlen, new_sum_rlen, db_path, file_name_utf8)
  196. insert_data_into_database(data, file_name, cell_values, db_path, file_name_utf8)
  197. else:
  198. print("没有数据可插入数据库")