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

WDExport.py 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  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. def Arrange_Data1(list1):
  8. # 最终return的
  9. list2 = []
  10. for data1 in list1:
  11. # 点名
  12. # 存每一行的数据
  13. resultlist = []
  14. pn = data1[0].decode('utf-8')
  15. resultlist.append(pn)
  16. resultlist.append(data1[1])
  17. resultlist.append(data1[2])
  18. resultlist.append(data1[3])
  19. resultlist.append(data1[4])
  20. resultlist.append(data1[5])
  21. resultlist.append(data1[6])
  22. resultlist.append(data1[7])
  23. resultlist.append(data1[8])
  24. resultlist.append(data1[9])
  25. resultlist.append(data1[10])
  26. resultlist.append(data1[11])
  27. # 判定1
  28. an1 = data1[12].decode('utf-8')
  29. resultlist.append(an1)
  30. resultlist.append(data1[13])
  31. resultlist.append(data1[14])
  32. resultlist.append(data1[15])
  33. # 判定2
  34. an2 = data1[16].decode('utf-8')
  35. resultlist.append(an2)
  36. # 3个名字(首,上,新)
  37. name1 = data1[17].decode('utf-8')
  38. resultlist.append(name1)
  39. name2 = data1[18].decode('utf-8')
  40. resultlist.append(name2)
  41. name3 = data1[19].decode('utf-8')
  42. resultlist.append(name3)
  43. list2.append(resultlist)
  44. return list2
  45. def export_combined_data(ui, db_path, utf_en, export_folder, file_name):
  46. try:
  47. # 解码文件名并去掉后缀名
  48. decoded_utf_en = utf_en.decode('utf-8') if isinstance(utf_en, bytes) else utf_en
  49. excel_path = os.path.join(export_folder, file_name)
  50. # 创建一个新的工作簿
  51. wb = openpyxl.Workbook()
  52. # 创建三个Sheet
  53. ws_initial = wb.create_sheet('原始数据')
  54. ws_stability = wb.create_sheet('稳定性分析成果表')
  55. ws_model = wb.create_sheet('改算模型')
  56. # 删除默认的Sheet
  57. ws_default = wb['Sheet']
  58. wb.remove(ws_default)
  59. # 连接到数据库
  60. conn = sqlite3.connect(db_path)
  61. cursor = conn.cursor()
  62. # 查询WD_Input_Param表中的数据
  63. query_param = """
  64. SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir, SL_Count, Dir_Count, Scale_Value, First_ResultName
  65. FROM WD_Input_Param
  66. WHERE TableName = ?
  67. """
  68. cursor.execute(query_param, (utf_en,))
  69. result_param = cursor.fetchone()
  70. # 创建样式来保留指定的小数位数
  71. decimal_style_3 = NamedStyle(name="decimal_style_3")
  72. decimal_style_3.number_format = '0.0000'
  73. decimal_style_3.alignment = Alignment(horizontal='center', vertical='center')
  74. decimal_style_1 = NamedStyle(name="decimal_style_1")
  75. decimal_style_1.number_format = '0.0'
  76. decimal_style_1.alignment = Alignment(horizontal='center', vertical='center')
  77. decimal_style_4 = NamedStyle(name="decimal_style_4")
  78. decimal_style_4.number_format = '0'
  79. decimal_style_4.alignment = Alignment(horizontal='center', vertical='center')
  80. if result_param:
  81. new_result_name, last_result_name, avg_sl, ms_dir, sl_count, dir_count, scale_value, first_result_name = result_param
  82. # 填充数据到“原始数据”Sheet并应用样式
  83. ws_initial['B1'] = new_result_name
  84. ws_initial['B1'].alignment = Alignment(horizontal='center', vertical='center')
  85. ws_initial['D1'] = last_result_name
  86. ws_initial['D1'].alignment = Alignment(horizontal='center', vertical='center')
  87. ws_initial['G1'] = first_result_name
  88. ws_initial['G1'].alignment = Alignment(horizontal='center', vertical='center')
  89. ws_initial['J1'] = avg_sl
  90. ws_initial['J1'].style = decimal_style_3
  91. ws_initial['J2'] = ms_dir
  92. ws_initial['J2'].alignment = Alignment(horizontal='center', vertical='center')
  93. ws_initial['J3'] = sl_count
  94. ws_initial['J3'].style = decimal_style_4
  95. ws_initial['J4'] = dir_count
  96. ws_initial['J4'].style = decimal_style_4
  97. ws_initial['J5'] = scale_value
  98. ws_initial['J5'].style = decimal_style_4
  99. # 合并单元格
  100. ws_initial.merge_cells('B1:C1')
  101. ws_initial.merge_cells('D1:E1')
  102. ws_initial.merge_cells('G1:H1')
  103. # 设置列宽
  104. ws_initial.column_dimensions['B'].width = 12.5
  105. ws_initial.column_dimensions['C'].width = 12.5
  106. ws_initial.column_dimensions['D'].width = 12.5
  107. ws_initial.column_dimensions['E'].width = 12.5
  108. ws_initial.column_dimensions['F'].width = 3
  109. ws_initial.column_dimensions['G'].width = 12.5
  110. ws_initial.column_dimensions['H'].width = 12.5
  111. ws_initial.column_dimensions['I'].width = 14
  112. ws_initial.column_dimensions['J'].width = 10
  113. # 设置表头
  114. headers = [
  115. ("A2", "点名"),
  116. ("B2", "高斯坐标x(m)"),
  117. ("C2", "高斯坐标y(m)"),
  118. ("D2", "高斯坐标x(m)"),
  119. ("E2", "高斯坐标y(m)"),
  120. ("F2", "权"),
  121. ("G2", "高斯坐标x(m)"),
  122. ("H2", "高斯坐标y(m)"),
  123. ("I1", "平均边长"),
  124. ("I2", "方向值中误差"),
  125. ("I3", "总边数"),
  126. ("I4", "总方向数"),
  127. ("I5", "缩放值")
  128. ]
  129. for cell, value in headers:
  130. ws_initial[cell] = value
  131. ws_initial[cell].alignment = Alignment(horizontal='center', vertical='center')
  132. # 查询WD_Input_Point表中的数据
  133. query_point = """
  134. SELECT PointName, New_X, New_Y, Last_X, Last_Y, Wight, First_X, First_Y
  135. FROM WD_Input_Point
  136. WHERE TableName = ?
  137. """
  138. cursor.execute(query_point, (utf_en,))
  139. results_point = cursor.fetchall()
  140. # 创建一个样式来强制保留四位小数
  141. decimal_style = NamedStyle(name="decimal_style")
  142. decimal_style.number_format = '0000.0000'
  143. # 填充数据到“原始数据”Sheet
  144. for idx, (point_name, new_x, new_y, last_x, last_y, wight, first_x, first_y) in enumerate(results_point,
  145. start=3):
  146. ws_initial[f'A{idx}'] = point_name
  147. ws_initial[f'B{idx}'] = round(new_x, 4)
  148. ws_initial[f'C{idx}'] = round(new_y, 4)
  149. ws_initial[f'D{idx}'] = round(last_x, 4)
  150. ws_initial[f'E{idx}'] = round(last_y, 4)
  151. ws_initial[f'F{idx}'] = round(wight, 0)
  152. ws_initial[f'G{idx}'] = round(first_x, 4)
  153. ws_initial[f'H{idx}'] = round(first_y, 4)
  154. # 应用样式以保留四位小数
  155. ws_initial[f'B{idx}'].style = decimal_style
  156. ws_initial[f'C{idx}'].style = decimal_style
  157. ws_initial[f'D{idx}'].style = decimal_style
  158. ws_initial[f'E{idx}'].style = decimal_style
  159. ws_initial[f'G{idx}'].style = decimal_style
  160. ws_initial[f'H{idx}'].style = decimal_style
  161. # 提取“稳定性分析成果表”数据
  162. sqlstr1 = 'select PointName,First_X,First_Y,Last_X,Last_Y,Last_Wight,Result_X,Result_Y,New_Wight,New_FirstX,New_FirstY,New_FirstP,NFDis_Ass,New_LastX,New_LastY,New_LastP,NLDis_Ass,First_ResultName,Last_ResultName,New_ResultName from WD_Result_Point WHERE TableName = ?'
  163. cursor.execute(sqlstr1, (utf_en,))
  164. result1 = cursor.fetchall()
  165. plist1 = Arrange_Data1(result1)
  166. # 设置“稳定性分析成果表”列宽
  167. ws_stability.column_dimensions['B'].width = 15
  168. ws_stability.column_dimensions['C'].width = 15
  169. ws_stability.column_dimensions['D'].width = 15
  170. ws_stability.column_dimensions['E'].width = 15
  171. ws_stability.column_dimensions['F'].width = 5
  172. ws_stability.column_dimensions['G'].width = 15
  173. ws_stability.column_dimensions['H'].width = 15
  174. ws_stability.column_dimensions['I'].width = 5
  175. ws_stability.column_dimensions['M'].width = 5
  176. ws_stability.column_dimensions['Q'].width = 5
  177. ws_stability.column_dimensions['J'].width = 8
  178. ws_stability.column_dimensions['K'].width = 8
  179. ws_stability.column_dimensions['L'].width = 8
  180. ws_stability.column_dimensions['N'].width = 8
  181. ws_stability.column_dimensions['O'].width = 8
  182. ws_stability.column_dimensions['P'].width = 8
  183. # 设置“稳定性分析成果表”表头
  184. ws_stability.merge_cells(start_row=1, end_row=1, start_column=1, end_column=17)
  185. ws_stability.cell(1, 1).value = '稳定性分析成果表'
  186. ws_area = ws_stability["A1:Q2"]
  187. alignment_center = Alignment(horizontal='center', vertical='center')
  188. for i in ws_area:
  189. for j in i:
  190. j.alignment = alignment_center
  191. alignment_right = Alignment(horizontal='right', vertical='center')
  192. ws_stability.merge_cells(start_row=2, end_row=3, start_column=1, end_column=1)
  193. ws_stability.cell(2, 1).value = '点号'
  194. ws_stability.merge_cells(start_row=2, end_row=2, start_column=2, end_column=3)
  195. ws_stability.cell(2, 2).value = plist1[0][17]
  196. ws_stability.merge_cells(start_row=2, end_row=2, start_column=4, end_column=6)
  197. ws_stability.cell(2, 4).value = plist1[0][18]
  198. ws_stability.merge_cells(start_row=2, end_row=2, start_column=7, end_column=9)
  199. ws_stability.cell(2, 7).value = plist1[0][19]
  200. ws_stability.merge_cells(start_row=2, end_row=2, start_column=10, end_column=12)
  201. ws_stability.cell(2, 10).value = '本期-首期(mm)'
  202. ws_stability.merge_cells(start_row=2, end_row=3, start_column=13, end_column=13)
  203. ws_stability.cell(2, 13).value = '变形判定'
  204. ws_stability.merge_cells(start_row=2, end_row=2, start_column=14, end_column=16)
  205. ws_stability.cell(2, 14).value = '本期-上期(mm)'
  206. ws_stability.merge_cells(start_row=2, end_row=3, start_column=17, end_column=17)
  207. ws_stability.cell(2, 17).value = '变形判定'
  208. ws_stability.cell(2, 13).alignment = Alignment(wrap_text=True)
  209. ws_stability.cell(2, 17).alignment = Alignment(wrap_text=True)
  210. ws_stability.cell(3, 2).value = 'X(m)'
  211. ws_stability.cell(3, 3).value = 'Y(m)'
  212. ws_stability.cell(3, 4).value = 'X(m)'
  213. ws_stability.cell(3, 5).value = 'Y(m)'
  214. ws_stability.cell(3, 6).value = '权'
  215. ws_stability.cell(3, 7).value = 'X(m)'
  216. ws_stability.cell(3, 8).value = 'Y(m)'
  217. ws_stability.cell(3, 9).value = '权'
  218. ws_stability.cell(3, 10).value = '△X'
  219. ws_stability.cell(3, 11).value = '△Y'
  220. ws_stability.cell(3, 12).value = '△XY'
  221. ws_stability.cell(3, 14).value = '△X'
  222. ws_stability.cell(3, 15).value = '△Y'
  223. ws_stability.cell(3, 16).value = '△XY'
  224. row1 = 4
  225. for data1 in plist1:
  226. ws_stability.cell(row1, 1).value = data1[0]
  227. ws_stability.cell(row1, 2).value = round(data1[1], 4)
  228. ws_stability.cell(row1, 3).value = round(data1[2], 4)
  229. ws_stability.cell(row1, 4).value = round(data1[3], 4)
  230. ws_stability.cell(row1, 5).value = round(data1[4], 4)
  231. ws_stability.cell(row1, 6).value = int(data1[5])
  232. ws_stability.cell(row1, 7).value = round(data1[6], 4)
  233. ws_stability.cell(row1, 8).value = round(data1[7], 4)
  234. ws_stability.cell(row1, 9).value = int(data1[8])
  235. ws_stability.cell(row1, 10).value = round(data1[9], 1)
  236. ws_stability.cell(row1, 11).value = round(data1[10], 1)
  237. ws_stability.cell(row1, 12).value = round(data1[11], 1)
  238. if data1[12] == '稳定':
  239. ws_stability.cell(row1, 13).value = ''
  240. else:
  241. ws_stability.cell(row1, 13).value = data1[12]
  242. ws_stability.cell(row1, 14).value = round(data1[13], 1)
  243. ws_stability.cell(row1, 15).value = round(data1[14], 1)
  244. ws_stability.cell(row1, 16).value = round(data1[15], 1)
  245. if data1[16] == '稳定':
  246. ws_stability.cell(row1, 17).value = ''
  247. else:
  248. ws_stability.cell(row1, 17).value = data1[16]
  249. row1 += 1
  250. # 提取“改算模型”数据
  251. sqlstr2 = 'select Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3 from WD_Result_Param WHERE TableName = ?'
  252. cursor.execute(sqlstr2, (utf_en,))
  253. result3 = cursor.fetchall()
  254. newname = result3[0][1].decode('utf-8')
  255. lastname = result3[0][0].decode('utf-8')
  256. # 设置“改算模型”列宽
  257. ws_model.column_dimensions['A'].width = 75
  258. # 设置“改算模型”表头
  259. ws_area = ws_model["A1:A5"]
  260. alignment_center = Alignment(horizontal='left', vertical='center')
  261. for i in ws_area:
  262. for j in i:
  263. j.alignment = alignment_center
  264. # 填充“改算模型”数据
  265. str1 = newname + '--' + lastname + '已知系统转换公式:'
  266. ws_model.cell(1, 1).value = str1
  267. str2 = 'X=(' + str(round(result3[0][2], 14)) + ')·x+(' + str(round(result3[0][3], 14)) + ')·y+(' + str(
  268. round(result3[0][4], 11)) + ')'
  269. ws_model.cell(2, 1).value = str2
  270. str3 = 'Y=(' + str(round(result3[0][5], 14)) + ')·x+(' + str(round(result3[0][6], 14)) + ')·y+(' + str(
  271. round(result3[0][7], 11)) + ')'
  272. ws_model.cell(3, 1).value = str3
  273. str4 = '式中:x、y为' + newname
  274. ws_model.cell(4, 1).value = str4
  275. str5 = ' X、Y为' + lastname + '已知系统的' + newname + '归算坐标'
  276. ws_model.cell(5, 1).value = str5
  277. # 保存工作簿
  278. wb.save(excel_path)
  279. QMessageBox.information(ui, '成功', f'数据文件已导出到 {export_folder}')
  280. except PermissionError as e:
  281. if e.errno == 13:
  282. QMessageBox.critical(ui, '错误', '请确认文件没有被其他程序(如Excel、文本编辑器等)打开')
  283. else:
  284. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  285. except Exception as e:
  286. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  287. def export_example_data(ui, db_path, utf_en, export_folder, file_name):
  288. # 解码文件名并去掉后缀名
  289. decoded_utf_en = utf_en.decode('utf-8') if isinstance(utf_en, bytes) else utf_en
  290. # excel_file_name = f"{os.path.splitext(decoded_utf_en)[0]}.xlsx"
  291. excel_path = os.path.join(export_folder, file_name)
  292. # 创建一个新的工作簿和工作表
  293. wb = openpyxl.Workbook()
  294. ws = wb.active
  295. # 连接到数据库
  296. conn = sqlite3.connect(db_path)
  297. cursor = conn.cursor()
  298. # 查询WD_Input_Param表中的数据
  299. query = """
  300. SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir, SL_Count, Dir_Count, Scale_Value, First_ResultName
  301. FROM WD_Input_Param
  302. WHERE TableName = ?
  303. """
  304. cursor.execute(query, (utf_en,))
  305. result = cursor.fetchone()
  306. # 创建样式来保留指定的小数位数
  307. decimal_style_3 = NamedStyle(name="decimal_style_3")
  308. decimal_style_3.number_format = '0.0000'
  309. decimal_style_3.alignment = Alignment(horizontal='center', vertical='center')
  310. decimal_style_1 = NamedStyle(name="decimal_style_1")
  311. decimal_style_1.number_format = '0.0'
  312. decimal_style_1.alignment = Alignment(horizontal='center', vertical='center')
  313. decimal_style_4 = NamedStyle(name="decimal_style_4")
  314. decimal_style_4.number_format = '0'
  315. decimal_style_4.alignment = Alignment(horizontal='center', vertical='center')
  316. if result:
  317. new_result_name, last_result_name, avg_sl, ms_dir, sl_count, dir_count, scale_value, first_result_name = result
  318. # 填充数据到Excel并应用样式
  319. ws['B1'] = new_result_name
  320. ws['B1'].alignment = Alignment(horizontal='center', vertical='center')
  321. ws['D1'] = last_result_name
  322. ws['D1'].alignment = Alignment(horizontal='center', vertical='center')
  323. ws['G1'] = first_result_name # 新增:填入First_ResultName
  324. ws['G1'].alignment = Alignment(horizontal='center', vertical='center') # 新增:设置居中对齐
  325. ws['J1'] = avg_sl
  326. ws['J1'].style = decimal_style_3
  327. ws['J2'] = ms_dir
  328. ws['J2'].alignment = Alignment(horizontal='center', vertical='center')
  329. ws['J3'] = sl_count
  330. ws['J3'].style = decimal_style_4
  331. ws['J4'] = dir_count
  332. ws['J4'].style = decimal_style_4
  333. ws['J5'] = scale_value
  334. ws['J5'].style = decimal_style_4
  335. # 合并单元格
  336. ws.merge_cells('B1:C1')
  337. ws.merge_cells('D1:E1')
  338. ws.merge_cells('G1:H1')
  339. # 设置列宽
  340. ws.column_dimensions['B'].width = 12.5
  341. ws.column_dimensions['C'].width = 12.5
  342. ws.column_dimensions['D'].width = 12.5
  343. ws.column_dimensions['E'].width = 12.5
  344. ws.column_dimensions['F'].width = 3
  345. ws.column_dimensions['F'].alignment = Alignment(horizontal='center', vertical='center') # 新增:设置F列居中对齐
  346. ws.column_dimensions['G'].width = 12.5
  347. ws.column_dimensions['H'].width = 12.5
  348. ws.column_dimensions['I'].width = 14
  349. ws.column_dimensions['J'].width = 10
  350. # 设置表头
  351. headers = [
  352. ("A2", "点名"),
  353. ("B2", "高斯坐标x(m)"),
  354. ("C2", "高斯坐标y(m)"),
  355. ("D2", "高斯坐标x(m)"),
  356. ("E2", "高斯坐标y(m)"),
  357. ("F2", "权"),
  358. ("G2", "高斯坐标x(m)"),
  359. ("H2", "高斯坐标y(m)"),
  360. ("I1", "平均边长"),
  361. ("I2", "方向值中误差"),
  362. ("I3", "总边数"),
  363. ("I4", "总方向数"),
  364. ("I5", "缩放值")
  365. ]
  366. for cell, value in headers:
  367. ws[cell] = value
  368. ws[cell].alignment = Alignment(horizontal='center', vertical='center')
  369. # 查询WD_Input_Point表中的数据
  370. query_point = """
  371. SELECT PointName, New_X, New_Y, Last_X, Last_Y, Wight, First_X, First_Y
  372. FROM WD_Input_Point
  373. WHERE TableName = ?
  374. """
  375. cursor.execute(query_point, (utf_en,))
  376. results_point = cursor.fetchall()
  377. # 创建一个样式来强制保留四位小数
  378. decimal_style = NamedStyle(name="decimal_style")
  379. decimal_style.number_format = '0000.0000'
  380. # 填充数据到Excel
  381. for idx, (point_name, new_x, new_y, last_x, last_y, wight, first_x, first_y) in enumerate(results_point, start=3):
  382. ws[f'A{idx}'] = point_name
  383. ws[f'B{idx}'] = round(new_x, 4)
  384. ws[f'C{idx}'] = round(new_y, 4)
  385. ws[f'D{idx}'] = round(last_x, 4)
  386. ws[f'E{idx}'] = round(last_y, 4)
  387. ws[f'F{idx}'] = round(wight, 0) # 新增
  388. ws[f'G{idx}'] = round(first_x, 4) # 新增
  389. ws[f'H{idx}'] = round(first_y, 4) # 新增
  390. # 应用样式以保留四位小数
  391. ws[f'B{idx}'].style = decimal_style
  392. ws[f'C{idx}'].style = decimal_style
  393. ws[f'D{idx}'].style = decimal_style
  394. ws[f'E{idx}'].style = decimal_style
  395. ws[f'G{idx}'].style = decimal_style # 新增
  396. ws[f'H{idx}'].style = decimal_style # 新增
  397. # 保存工作簿
  398. wb.save(excel_path)
  399. # 数据文件的导出
  400. def main_function_combined(ui, dbpath, excelname, export_folder, file_name):
  401. export_combined_data(ui, dbpath, excelname, export_folder, file_name)
  402. # 示例文件的导出
  403. def main_function_example(ui, dbpath, excelname_utf8, export_folder, file_name):
  404. try:
  405. export_example_data(ui, dbpath, excelname_utf8, export_folder, file_name)
  406. QMessageBox.information(ui, '成功', f'示例文件已成功导出到 {export_folder}')
  407. except PermissionError as e:
  408. if e.errno == 13:
  409. QMessageBox.critical(ui, '错误', '请确认文件没有被其他程序(如Excel、文本编辑器等)打开')
  410. else:
  411. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  412. except Exception as e:
  413. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')