控制网复测平面基准归算程序(包含控制网复测平面基准计算,平面控制网稳定性计算,水准测段高差稳定计算三个程序功能)
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.

GSExport.py 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. import openpyxl
  2. import sqlite3
  3. import os
  4. import time
  5. from openpyxl.styles import Alignment, NamedStyle
  6. from PySide6.QtWidgets import QMessageBox
  7. # from openpyxl.styles.numbers import FORMAT_NUMBER_00
  8. def Arrange_Data1(list1):
  9. # 最终return的
  10. list2 = []
  11. for data1 in list1:
  12. # 点名
  13. # 存每一行的数据
  14. resultlist = []
  15. pn = data1[0].decode('utf-8')
  16. resultlist.append(pn)
  17. resultlist.append(data1[1])
  18. resultlist.append(data1[2])
  19. resultlist.append(data1[3])
  20. resultlist.append(data1[4])
  21. resultlist.append(data1[5])
  22. # 判定
  23. an1 = data1[6].decode('utf-8')
  24. resultlist.append(an1)
  25. # 两个结果名字(旧新)
  26. name1 = data1[7].decode('utf-8')
  27. resultlist.append(name1)
  28. name2 = data1[8].decode('utf-8')
  29. resultlist.append(name2)
  30. list2.append(resultlist)
  31. return list2
  32. # 复测成果表
  33. def Arrange_Data2(list1):
  34. # 最终return的
  35. list2 = []
  36. for data1 in list1:
  37. # 点名
  38. # 存每一行的数据
  39. resultlist = []
  40. pn = data1[0].decode('utf-8')
  41. resultlist.append(pn)
  42. resultlist.append(data1[1])
  43. resultlist.append(data1[2])
  44. resultlist.append(data1[3])
  45. resultlist.append(data1[4])
  46. resultlist.append(data1[5])
  47. resultlist.append(data1[6])
  48. resultlist.append(data1[7])
  49. # 判定
  50. an1 = data1[8].decode('utf-8')
  51. resultlist.append(an1)
  52. # 两个结果名字(旧新)
  53. name1 = data1[9].decode('utf-8')
  54. resultlist.append(name1)
  55. name2 = data1[10].decode('utf-8')
  56. resultlist.append(name2)
  57. list2.append(resultlist)
  58. return list2
  59. def openpyxl_write(file_name, dbpath, filename):
  60. utf_en = filename.encode('utf-8')
  61. # 新建对应的excel
  62. wb = openpyxl.Workbook()
  63. ws2 = wb.create_sheet('复测成果表')
  64. ws1 = wb.create_sheet('复测基准归算表')
  65. ws3 = wb.create_sheet('基准归算模型')
  66. ws5 = wb['Sheet']
  67. wb.remove(ws5)
  68. # w1部分(基准归算表)
  69. # 提取数据
  70. db = sqlite3.connect(dbpath)
  71. cursor1 = db.cursor()
  72. sqlstr11 = 'select PointName,Cal_X,Cal_Y,Last_CalX,Last_CalY,Last_CalP,Dis_Ass,Last_ResultName,New_ResultName from GS_Result_Point WHERE TableName = ?'
  73. cursor1.execute(sqlstr11, (utf_en,))
  74. # 获取结果集
  75. result1 = cursor1.fetchall()
  76. # 整理数据
  77. plist1 = Arrange_Data1(result1)
  78. ws1.column_dimensions['A'].width = 5
  79. ws1.column_dimensions['B'].width = 15
  80. ws1.column_dimensions['C'].width = 15
  81. ws1.column_dimensions['D'].width = 8
  82. ws1.column_dimensions['E'].width = 8
  83. ws1.column_dimensions['F'].width = 8
  84. ws1.column_dimensions['G'].width = 5
  85. ws1.merge_cells(start_row=1, end_row=1,
  86. start_column=1, end_column=7)
  87. ws1.cell(1, 1).value = '复测基准归算与位移判定'
  88. ws1.merge_cells(start_row=2, end_row=3,
  89. start_column=1, end_column=1)
  90. ws1.cell(2, 1).value = '点名'
  91. ws1.merge_cells(start_row=2, end_row=2,
  92. start_column=2, end_column=3)
  93. ws1.cell(2, 2).value = plist1[0][8] + '基准归算成果'
  94. ws1.merge_cells(start_row=2, end_row=2,
  95. start_column=4, end_column=6)
  96. ws1.cell(2, 4).value = plist1[0][7] + '-归算成果(mm)'
  97. ws_area = ws1["A1:H3"]
  98. alignment_center = Alignment(horizontal='center', vertical='center') # 指定区域单元格居中
  99. for i in ws_area:
  100. for j in i:
  101. j.alignment = alignment_center
  102. alignment_right = Alignment(horizontal='right', vertical='center')
  103. ws1.merge_cells(start_row=2, end_row=3,
  104. start_column=7, end_column=7)
  105. ws1.cell(2, 7).value = '位移判定'
  106. ws1.cell(2, 7).alignment = Alignment(wrap_text=True)
  107. ws1.cell(3, 2).value = 'X(mm)'
  108. ws1.cell(3, 3).value = 'Y(mm)'
  109. ws1.cell(3, 4).value = '△X'
  110. ws1.cell(3, 5).value = '△Y'
  111. ws1.cell(3, 6).value = '△P'
  112. row1 = 4
  113. for data1 in plist1:
  114. ws1.cell(row1, 1).value = data1[0]
  115. ws1.cell(row1, 2).value = round(data1[1], 4)
  116. ws1.cell(row1, 3).value = round(data1[2], 4)
  117. ws1.cell(row1, 4).value = round(data1[3], 1)
  118. ws1.cell(row1, 5).value = round(data1[4], 1)
  119. ws1.cell(row1, 6).value = round(data1[5], 1)
  120. if data1[6] == '稳定':
  121. ws1.cell(row1, 7).value = ''
  122. else:
  123. ws1.cell(row1, 7).value = data1[6]
  124. row1 = row1 + 1
  125. # ws2部分(复测成果表)
  126. # 提取数据
  127. sqlstr1 = 'select PointName,Last_X,Last_Y,Result_X,Result_Y,Last_ResultX,Last_ResultY,Last_ResultP,Dis_Ass,Last_ResultName,New_ResultName from GS_Result_Point WHERE TableName = ?'
  128. cursor1.execute(sqlstr1, (utf_en,))
  129. # 获取结果集
  130. result2 = cursor1.fetchall()
  131. # 整理数据
  132. plist2 = Arrange_Data2(result2)
  133. ws2.column_dimensions['A'].width = 5
  134. ws2.column_dimensions['B'].width = 15
  135. ws2.column_dimensions['C'].width = 15
  136. ws2.column_dimensions['D'].width = 15
  137. ws2.column_dimensions['E'].width = 15
  138. ws2.column_dimensions['F'].width = 8
  139. ws2.column_dimensions['G'].width = 8
  140. ws2.column_dimensions['H'].width = 8
  141. ws2.column_dimensions['I'].width = 5
  142. ws2.merge_cells(start_row=1, end_row=1,
  143. start_column=1, end_column=3)
  144. ws2.cell(1, 1).value = '前期成果'
  145. ws2.merge_cells(start_row=1, end_row=1,
  146. start_column=4, end_column=9)
  147. ws2.cell(1, 4).value = '本期成果'
  148. ws_area = ws2["A1:I2"]
  149. alignment_center = Alignment(horizontal='center', vertical='center') # 指定区域单元格居中
  150. for i in ws_area:
  151. for j in i:
  152. j.alignment = alignment_center
  153. alignment_right = Alignment(horizontal='right', vertical='center')
  154. ws2.merge_cells(start_row=2, end_row=3,
  155. start_column=1, end_column=1)
  156. ws2.cell(2, 1).value = '点名'
  157. ws2.merge_cells(start_row=2, end_row=2,
  158. start_column=2, end_column=3)
  159. ws2.cell(2, 2).value = plist2[0][9]
  160. ws2.merge_cells(start_row=2, end_row=2,
  161. start_column=4, end_column=5)
  162. ws2.cell(2, 4).value = plist2[0][10]
  163. ws2.merge_cells(start_row=2, end_row=2,
  164. start_column=6, end_column=8)
  165. newname_1 = plist2[0][9] + '-' + plist2[0][10] + '(mm)'
  166. ws2.cell(2, 6).value = newname_1
  167. ws2.merge_cells(start_row=2, end_row=3,
  168. start_column=9, end_column=9)
  169. ws2.cell(2, 9).value = '位移判定'
  170. ws2.cell(2, 9).alignment = Alignment(wrap_text=True)
  171. ws2.cell(3, 2).value = 'X(m)'
  172. ws2.cell(3, 3).value = 'Y(m)'
  173. ws2.cell(3, 4).value = 'X(m)'
  174. ws2.cell(3, 5).value = 'Y(m)'
  175. ws2.cell(3, 6).value = '△X'
  176. ws2.cell(3, 7).value = '△Y'
  177. ws2.cell(3, 8).value = '△XY'
  178. row2 = 4
  179. for data2 in plist2:
  180. ws2.cell(row2, 1).value = data2[0]
  181. ws2.cell(row2, 2).value = round(data2[1], 4)
  182. ws2.cell(row2, 3).value = round(data2[2], 4)
  183. ws2.cell(row2, 4).value = round(data2[3], 4)
  184. ws2.cell(row2, 5).value = round(data2[4], 4)
  185. ws2.cell(row2, 6).value = round(data2[5], 1)
  186. ws2.cell(row2, 7).value = round(data2[6], 1)
  187. ws2.cell(row2, 8).value = round(data2[7], 1)
  188. if data2[8] == '稳定':
  189. ws2.cell(row2, 9).value = ''
  190. else:
  191. ws2.cell(row2, 9).value = data2[8]
  192. row2 = row2 + 1
  193. # ws3部分(公式)
  194. # 提取数据
  195. sqlstr2 = 'select Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3 from GS_Trans_Param WHERE TableName = ?'
  196. cursor1.execute(sqlstr2, (utf_en,))
  197. # 获取结果集
  198. result3 = cursor1.fetchall()
  199. newname = result3[0][1].decode('utf-8')
  200. lastname = result3[0][0].decode('utf-8')
  201. ws3.column_dimensions['A'].width = 75
  202. ws_area = ws3["A1:A5"]
  203. alignment_center = Alignment(horizontal='left', vertical='center') # 指定区域单元格居中
  204. for i in ws_area:
  205. for j in i:
  206. j.alignment = alignment_center
  207. str1 = newname + '--' + lastname + '已知系统转换公式:'
  208. ws3.cell(1, 1).value = str1
  209. str2 = 'X=(' + str(round(result3[0][2], 14)) + ')·x+(' + str(round(result3[0][3], 14)) + ')·y+(' + str(
  210. round(result3[0][4], 11)) + ')'
  211. ws3.cell(2, 1).value = str2
  212. str3 = 'Y=(' + str(round(result3[0][5], 14)) + ')·x+(' + str(round(result3[0][6], 14)) + ')·y+(' + str(
  213. round(result3[0][7], 11)) + ')'
  214. ws3.cell(3, 1).value = str3
  215. str4 = '式中:x、y为' + newname
  216. ws3.cell(4, 1).value = str4
  217. str5 = ' X、Y为' + lastname + '已知系统的' + newname + '归算坐标'
  218. ws3.cell(5, 1).value = str5
  219. # 获取当前时间并格式化为字符串,例如:20231010_143000
  220. timestamp = time.strftime("%Y%m%d", time.localtime())
  221. # 保存 Excel 文件
  222. excel_filename = f"{os.path.splitext(filename)[0]}-成果数据-{timestamp}.xlsx"
  223. excel_filepath = os.path.join(file_name, excel_filename)
  224. wb.save(excel_filepath)
  225. def export_initial_data(ui, db_path, utf_en, export_folder):
  226. # 获取当前时间并格式化为字符串,例如:20231010_143000
  227. timestamp = time.strftime("%Y%m%d", time.localtime())
  228. # 解码 utf_en
  229. decoded_utf_en = utf_en.decode('utf-8') if isinstance(utf_en, bytes) else utf_en
  230. excel_file_name = f"{os.path.splitext(decoded_utf_en)[0]}-初始数据-{timestamp}.xlsx"
  231. excel_path = os.path.join(export_folder, excel_file_name)
  232. # 创建一个新的工作簿和工作表
  233. wb = openpyxl.Workbook()
  234. ws = wb.active
  235. # 连接到数据库
  236. conn = sqlite3.connect(db_path)
  237. cursor = conn.cursor()
  238. # 查询GS_Input_Param表中的数据
  239. query = """
  240. SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir, Ms_WSL, SL_Count, Dir_Count, Scale_Value
  241. FROM GS_Input_Param
  242. WHERE TableName = ?
  243. """
  244. cursor.execute(query, (utf_en,))
  245. result = cursor.fetchone()
  246. # 创建样式来保留指定的小数位数
  247. decimal_style_3 = NamedStyle(name="decimal_style_3")
  248. decimal_style_3.number_format = '0.000'
  249. decimal_style_3.alignment = Alignment(horizontal='center', vertical='center')
  250. decimal_style_1 = NamedStyle(name="decimal_style_1")
  251. decimal_style_1.number_format = '0.0'
  252. decimal_style_1.alignment = Alignment(horizontal='center', vertical='center')
  253. decimal_style_4 = NamedStyle(name="decimal_style_4")
  254. decimal_style_4.number_format = '0.0000'
  255. decimal_style_4.alignment = Alignment(horizontal='center', vertical='center')
  256. if result:
  257. new_result_name, last_result_name, avg_sl, ms_dir, ms_wsl, sl_count, dir_count, scale_value = result
  258. # 填充数据到Excel并应用样式
  259. ws['B1'] = new_result_name
  260. ws['B1'].alignment = Alignment(horizontal='center', vertical='center')
  261. ws['D1'] = last_result_name
  262. ws['D1'].alignment = Alignment(horizontal='center', vertical='center')
  263. ws['G1'] = avg_sl
  264. ws['G1'].style = decimal_style_3
  265. ws['G2'] = ms_dir
  266. ws['G2'].alignment = Alignment(horizontal='center', vertical='center')
  267. ws['G3'] = ms_wsl
  268. ws['G3'].alignment = Alignment(horizontal='center', vertical='center')
  269. ws['G4'] = sl_count
  270. ws['G4'].style = decimal_style_1
  271. ws['G5'] = dir_count
  272. ws['G5'].style = decimal_style_1
  273. ws['G6'] = scale_value
  274. ws['G6'].style = decimal_style_4
  275. # 合并单元格
  276. ws.merge_cells('B1:C1')
  277. ws.merge_cells('D1:E1')
  278. # 设置列宽
  279. ws.column_dimensions['B'].width = 12.5
  280. ws.column_dimensions['C'].width = 12.5
  281. ws.column_dimensions['D'].width = 12.5
  282. ws.column_dimensions['E'].width = 12.5
  283. ws.column_dimensions['F'].width = 22
  284. ws.column_dimensions['G'].width = 21.5
  285. # 设置B1, D1单元格居中显示
  286. ws['B1'].alignment = Alignment(horizontal='center', vertical='center')
  287. ws['D1'].alignment = Alignment(horizontal='center', vertical='center')
  288. # 设置表头
  289. headers = [
  290. ("A2", "点名"),
  291. ("B2", "高斯坐标x(m)"),
  292. ("C2", "高斯坐标y(m)"),
  293. ("D2", "高斯坐标x(m)"),
  294. ("E2", "高斯坐标y(m)"),
  295. ("F1", "平均边长(m)"),
  296. ("F2", "方向值中误差(″)"),
  297. ("F3", "最弱边边长相对中误差"),
  298. ("F4", "网点总测边数"),
  299. ("F5", "网点总方向观测数"),
  300. ("F6", "缩放值")
  301. ]
  302. for cell, value in headers:
  303. ws[cell] = value
  304. ws[cell].alignment = Alignment(horizontal='center', vertical='center')
  305. # 查询GS_Input_Point表中的数据
  306. query_point = """
  307. SELECT PointName, New_X, New_Y, Last_X, Last_Y
  308. FROM GS_Input_Point
  309. WHERE TableName = ?
  310. """
  311. cursor.execute(query_point, (utf_en,))
  312. results_point = cursor.fetchall()
  313. # 创建一个样式来强制保留四位小数
  314. decimal_style = NamedStyle(name="decimal_style")
  315. decimal_style.number_format = '0000.0000'
  316. # 填充数据到Excel
  317. for idx, (point_name, new_x, new_y, last_x, last_y) in enumerate(results_point, start=3):
  318. ws[f'A{idx}'] = point_name
  319. ws[f'B{idx}'] = round(new_x, 4)
  320. ws[f'C{idx}'] = round(new_y, 4)
  321. ws[f'D{idx}'] = round(last_x, 4)
  322. ws[f'E{idx}'] = round(last_y, 4)
  323. # 应用样式以保留四位小数
  324. ws[f'B{idx}'].style = decimal_style
  325. ws[f'C{idx}'].style = decimal_style
  326. ws[f'D{idx}'].style = decimal_style
  327. ws[f'E{idx}'].style = decimal_style
  328. # 保存工作簿
  329. wb.save(excel_path)
  330. # 主函数 写入excel文件
  331. def main_function(ui, dbpath, excelname):
  332. # 获取应用的安装目录
  333. app_install_dir = os.path.dirname(os.path.abspath(__file__)) # 假设脚本文件位于应用的安装目录下
  334. export_folder = os.path.join(app_install_dir, 'Export')
  335. # 如果 Export 文件夹不存在,则创建它
  336. if not os.path.exists(export_folder):
  337. os.makedirs(export_folder)
  338. try:
  339. openpyxl_write(export_folder, dbpath, excelname)
  340. QMessageBox.information(ui, '成功', f'成果文件已成功导出到 {export_folder}')
  341. except Exception as e:
  342. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  343. def main_function_initial(ui, dbpath, excelname_utf8):
  344. # 获取应用的安装目录
  345. app_install_dir = os.path.dirname(os.path.abspath(__file__)) # 假设脚本文件位于应用的安装目录下
  346. export_folder = os.path.join(app_install_dir, 'Export')
  347. # 如果 Export 文件夹不存在,则创建它
  348. if not os.path.exists(export_folder):
  349. os.makedirs(export_folder)
  350. try:
  351. export_initial_data(ui, dbpath, excelname_utf8, export_folder)
  352. QMessageBox.information(ui, '成功', f'初始文件已成功导出到 {export_folder}')
  353. except PermissionError as e:
  354. if e.errno == 13:
  355. QMessageBox.critical(ui, '错误', '请确认文件没有被其他程序(如Excel、文本编辑器等)打开')
  356. else:
  357. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  358. except Exception as e:
  359. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')