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

GSExport.py 30KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  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(folder_name, dbpath, filename, file_name):
  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(folder_name, file_name)
  224. wb.save(excel_filepath)
  225. def export_initial_data(ui, db_path, utf_en, export_folder, file_name):
  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, 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. def export_example_data(ui, db_path, utf_en, export_folder, file_name):
  331. # 解码 utf_en
  332. decoded_utf_en = utf_en.decode('utf-8') if isinstance(utf_en, bytes) else utf_en
  333. # excel_file_name = f"{os.path.splitext(decoded_utf_en)[0]}.xlsx"
  334. excel_path = os.path.join(export_folder, file_name)
  335. # 创建一个新的工作簿和工作表
  336. wb = openpyxl.Workbook()
  337. ws = wb.active
  338. # 连接到数据库
  339. conn = sqlite3.connect(db_path)
  340. cursor = conn.cursor()
  341. # 查询GS_Input_Param表中的数据
  342. query = """
  343. SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir, Ms_WSL, SL_Count, Dir_Count, Scale_Value
  344. FROM GS_Input_Param
  345. WHERE TableName = ?
  346. """
  347. cursor.execute(query, (utf_en,))
  348. result = cursor.fetchone()
  349. # 创建样式来保留指定的小数位数
  350. decimal_style_3 = NamedStyle(name="decimal_style_3")
  351. decimal_style_3.number_format = '0.000'
  352. decimal_style_3.alignment = Alignment(horizontal='center', vertical='center')
  353. decimal_style_1 = NamedStyle(name="decimal_style_1")
  354. decimal_style_1.number_format = '0.0'
  355. decimal_style_1.alignment = Alignment(horizontal='center', vertical='center')
  356. decimal_style_4 = NamedStyle(name="decimal_style_4")
  357. decimal_style_4.number_format = '0.0000'
  358. decimal_style_4.alignment = Alignment(horizontal='center', vertical='center')
  359. if result:
  360. new_result_name, last_result_name, avg_sl, ms_dir, ms_wsl, sl_count, dir_count, scale_value = result
  361. # 填充数据到Excel并应用样式
  362. ws['B1'] = new_result_name
  363. ws['B1'].alignment = Alignment(horizontal='center', vertical='center')
  364. ws['D1'] = last_result_name
  365. ws['D1'].alignment = Alignment(horizontal='center', vertical='center')
  366. ws['G1'] = avg_sl
  367. ws['G1'].style = decimal_style_3
  368. ws['G2'] = ms_dir
  369. ws['G2'].alignment = Alignment(horizontal='center', vertical='center')
  370. ws['G3'] = ms_wsl
  371. ws['G3'].alignment = Alignment(horizontal='center', vertical='center')
  372. ws['G4'] = sl_count
  373. ws['G4'].style = decimal_style_1
  374. ws['G5'] = dir_count
  375. ws['G5'].style = decimal_style_1
  376. ws['G6'] = scale_value
  377. ws['G6'].style = decimal_style_4
  378. # 合并单元格
  379. ws.merge_cells('B1:C1')
  380. ws.merge_cells('D1:E1')
  381. # 设置列宽
  382. ws.column_dimensions['B'].width = 12.5
  383. ws.column_dimensions['C'].width = 12.5
  384. ws.column_dimensions['D'].width = 12.5
  385. ws.column_dimensions['E'].width = 12.5
  386. ws.column_dimensions['F'].width = 22
  387. ws.column_dimensions['G'].width = 21.5
  388. # 设置B1, D1单元格居中显示
  389. ws['B1'].alignment = Alignment(horizontal='center', vertical='center')
  390. ws['D1'].alignment = Alignment(horizontal='center', vertical='center')
  391. # 设置表头
  392. headers = [
  393. ("A2", "点名"),
  394. ("B2", "高斯坐标x(m)"),
  395. ("C2", "高斯坐标y(m)"),
  396. ("D2", "高斯坐标x(m)"),
  397. ("E2", "高斯坐标y(m)"),
  398. ("F1", "平均边长(m)"),
  399. ("F2", "方向值中误差(″)"),
  400. ("F3", "最弱边边长相对中误差"),
  401. ("F4", "网点总测边数"),
  402. ("F5", "网点总方向观测数"),
  403. ("F6", "缩放值")
  404. ]
  405. for cell, value in headers:
  406. ws[cell] = value
  407. ws[cell].alignment = Alignment(horizontal='center', vertical='center')
  408. # 查询GS_Input_Point表中的数据
  409. query_point = """
  410. SELECT PointName, New_X, New_Y, Last_X, Last_Y
  411. FROM GS_Input_Point
  412. WHERE TableName = ?
  413. """
  414. cursor.execute(query_point, (utf_en,))
  415. results_point = cursor.fetchall()
  416. # 创建一个样式来强制保留四位小数
  417. decimal_style = NamedStyle(name="decimal_style")
  418. decimal_style.number_format = '0000.0000'
  419. # 填充数据到Excel
  420. for idx, (point_name, new_x, new_y, last_x, last_y) in enumerate(results_point, start=3):
  421. ws[f'A{idx}'] = point_name
  422. ws[f'B{idx}'] = round(new_x, 4)
  423. ws[f'C{idx}'] = round(new_y, 4)
  424. ws[f'D{idx}'] = round(last_x, 4)
  425. ws[f'E{idx}'] = round(last_y, 4)
  426. # 应用样式以保留四位小数
  427. ws[f'B{idx}'].style = decimal_style
  428. ws[f'C{idx}'].style = decimal_style
  429. ws[f'D{idx}'].style = decimal_style
  430. ws[f'E{idx}'].style = decimal_style
  431. # 保存工作簿
  432. wb.save(excel_path)
  433. # 合并导出函数
  434. def combined_export(folder_name, dbpath, filename, file_name):
  435. utf_en = filename.encode('utf-8')
  436. # 创建新工作簿
  437. wb = openpyxl.Workbook()
  438. # ========== Sheet1: 初始数据 ==========
  439. ws_initial = wb.active
  440. ws_initial.title = "初始数据"
  441. # 处理初始数据(原export_initial_data逻辑)
  442. conn = sqlite3.connect(dbpath)
  443. cursor = conn.cursor()
  444. # 样式定义
  445. decimal_style_3 = NamedStyle(name="decimal_style_3")
  446. decimal_style_3.number_format = '0.000'
  447. decimal_style_3.alignment = Alignment(horizontal='center', vertical='center')
  448. decimal_style_1 = NamedStyle(name="decimal_style_1")
  449. decimal_style_1.number_format = '0.0'
  450. decimal_style_1.alignment = Alignment(horizontal='center', vertical='center')
  451. decimal_style_4 = NamedStyle(name="decimal_style_4")
  452. decimal_style_4.number_format = '0.0000'
  453. decimal_style_4.alignment = Alignment(horizontal='center', vertical='center')
  454. # 处理GS_Input_Param数据
  455. param_query = """SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir,
  456. Ms_WSL, SL_Count, Dir_Count, Scale_Value
  457. FROM GS_Input_Param WHERE TableName = ?"""
  458. cursor.execute(param_query, (utf_en,))
  459. param_result = cursor.fetchone()
  460. if param_result:
  461. new_result_name, last_result_name, avg_sl, ms_dir, ms_wsl, sl_count, dir_count, scale_value = param_result
  462. # 填充参数数据
  463. ws_initial['B1'] = new_result_name
  464. ws_initial['D1'] = last_result_name
  465. ws_initial['G1'] = avg_sl
  466. ws_initial['G2'] = ms_dir
  467. ws_initial['G3'] = ms_wsl
  468. ws_initial['G4'] = sl_count
  469. ws_initial['G5'] = dir_count
  470. ws_initial['G6'] = scale_value
  471. # 应用样式
  472. ws_initial['G1'].style = decimal_style_3
  473. ws_initial['G4'].style = decimal_style_1
  474. ws_initial['G5'].style = decimal_style_1
  475. ws_initial['G6'].style = decimal_style_4
  476. # 合并单元格
  477. ws_initial.merge_cells('B1:C1')
  478. ws_initial.merge_cells('D1:E1')
  479. ws_initial['B1'].alignment = Alignment(horizontal='center', vertical='center')
  480. ws_initial['D1'].alignment = Alignment(horizontal='center', vertical='center')
  481. # 处理GS_Input_Point数据
  482. point_query = """SELECT PointName, New_X, New_Y, Last_X, Last_Y
  483. FROM GS_Input_Point WHERE TableName = ?"""
  484. cursor.execute(point_query, (utf_en,))
  485. point_results = cursor.fetchall()
  486. # 设置表头
  487. headers = [
  488. ("A2", "点名"), ("B2", "高斯坐标x(m)"), ("C2", "高斯坐标y(m)"),
  489. ("D2", "高斯坐标x(m)"), ("E2", "高斯坐标y(m)"), ("F1", "平均边长(m)"),
  490. ("F2", "方向值中误差(″)"), ("F3", "最弱边边长相对中误差"),
  491. ("F4", "网点总测边数"), ("F5", "网点总方向观测数"), ("F6", "缩放值")
  492. ]
  493. for cell, value in headers:
  494. ws_initial[cell] = value
  495. ws_initial[cell].alignment = Alignment(horizontal='center', vertical='center')
  496. # 填充点数据
  497. decimal_style = NamedStyle(name="decimal_style")
  498. decimal_style.number_format = '0000.0000'
  499. for idx, (point_name, new_x, new_y, last_x, last_y) in enumerate(point_results, start=3):
  500. ws_initial[f'A{idx}'] = point_name
  501. ws_initial[f'B{idx}'] = round(new_x, 4)
  502. ws_initial[f'C{idx}'] = round(new_y, 4)
  503. ws_initial[f'D{idx}'] = round(last_x, 4)
  504. ws_initial[f'E{idx}'] = round(last_y, 4)
  505. for col in ['B', 'C', 'D', 'E']:
  506. ws_initial[f'{col}{idx}'].style = decimal_style
  507. # ========== 后续工作表:原openpyxl_write内容 ==========
  508. # 创建其他工作表(自动按顺序添加)
  509. ws1 = wb.create_sheet('复测基准归算表')
  510. ws2 = wb.create_sheet('复测成果表')
  511. ws3 = wb.create_sheet('基准归算模型')
  512. # 原openpyxl_write中的数据库查询和表格生成逻辑
  513. # -- 复测基准归算表 --
  514. cursor.execute(
  515. 'SELECT PointName,Cal_X,Cal_Y,Last_CalX,Last_CalY,Last_CalP,Dis_Ass,Last_ResultName,New_ResultName FROM GS_Result_Point WHERE TableName = ?',
  516. (utf_en,))
  517. result1 = cursor.fetchall()
  518. plist1 = Arrange_Data1(result1)
  519. # 工作表格式设置(保持原openpyxl_write中的格式代码不变)
  520. ws1.column_dimensions['A'].width = 5
  521. ws1.column_dimensions['B'].width = 15
  522. ws1.column_dimensions['C'].width = 15
  523. ws1.column_dimensions['D'].width = 8
  524. ws1.column_dimensions['E'].width = 8
  525. ws1.column_dimensions['F'].width = 8
  526. ws1.column_dimensions['G'].width = 5
  527. ws1.merge_cells(start_row=1, end_row=1, start_column=1, end_column=7)
  528. ws1.cell(1, 1).value = '复测基准归算与位移判定'
  529. ws1.merge_cells(start_row=2, end_row=3, start_column=1, end_column=1)
  530. ws1.cell(2, 1).value = '点名'
  531. ws1.merge_cells(start_row=2, end_row=2, start_column=2, end_column=3)
  532. ws1.cell(2, 2).value = plist1[0][8] + '基准归算成果'
  533. ws1.merge_cells(start_row=2, end_row=2, start_column=4, end_column=6)
  534. ws1.cell(2, 4).value = plist1[0][7] + '-归算成果(mm)'
  535. ws_area = ws1["A1:H3"]
  536. alignment_center = Alignment(horizontal='center', vertical='center')
  537. for i in ws_area:
  538. for j in i:
  539. j.alignment = alignment_center
  540. alignment_right = Alignment(horizontal='right', vertical='center')
  541. ws1.merge_cells(start_row=2, end_row=3, start_column=7, end_column=7)
  542. ws1.cell(2, 7).value = '位移判定'
  543. ws1.cell(2, 7).alignment = Alignment(wrap_text=True)
  544. ws1.cell(3, 2).value = 'X(mm)'
  545. ws1.cell(3, 3).value = 'Y(mm)'
  546. ws1.cell(3, 4).value = '△X'
  547. ws1.cell(3, 5).value = '△Y'
  548. ws1.cell(3, 6).value = '△P'
  549. row1 = 4
  550. for data1 in plist1:
  551. ws1.cell(row1, 1).value = data1[0]
  552. ws1.cell(row1, 2).value = round(data1[1], 4)
  553. ws1.cell(row1, 3).value = round(data1[2], 4)
  554. ws1.cell(row1, 4).value = round(data1[3], 1)
  555. ws1.cell(row1, 5).value = round(data1[4], 1)
  556. ws1.cell(row1, 6).value = round(data1[5], 1)
  557. if data1[6] == '稳定':
  558. ws1.cell(row1, 7).value = ''
  559. else:
  560. ws1.cell(row1, 7).value = data1[6]
  561. row1 = row1 + 1
  562. # -- 复测成果表 --
  563. cursor.execute(
  564. '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 = ?',
  565. (utf_en,))
  566. result2 = cursor.fetchall()
  567. plist2 = Arrange_Data2(result2)
  568. ws2.column_dimensions['A'].width = 5
  569. ws2.column_dimensions['B'].width = 15
  570. ws2.column_dimensions['C'].width = 15
  571. ws2.column_dimensions['D'].width = 15
  572. ws2.column_dimensions['E'].width = 15
  573. ws2.column_dimensions['F'].width = 8
  574. ws2.column_dimensions['G'].width = 8
  575. ws2.column_dimensions['H'].width = 8
  576. ws2.column_dimensions['I'].width = 5
  577. ws2.merge_cells(start_row=1, end_row=1, start_column=1, end_column=3)
  578. ws2.cell(1, 1).value = '前期成果'
  579. ws2.merge_cells(start_row=1, end_row=1, start_column=4, end_column=9)
  580. ws2.cell(1, 4).value = '本期成果'
  581. ws_area = ws2["A1:I2"]
  582. alignment_center = Alignment(horizontal='center', vertical='center')
  583. for i in ws_area:
  584. for j in i:
  585. j.alignment = alignment_center
  586. alignment_right = Alignment(horizontal='right', vertical='center')
  587. ws2.merge_cells(start_row=2, end_row=3, start_column=1, end_column=1)
  588. ws2.cell(2, 1).value = '点名'
  589. ws2.merge_cells(start_row=2, end_row=2, start_column=2, end_column=3)
  590. ws2.cell(2, 2).value = plist2[0][9]
  591. ws2.merge_cells(start_row=2, end_row=2, start_column=4, end_column=5)
  592. ws2.cell(2, 4).value = plist2[0][10]
  593. ws2.merge_cells(start_row=2, end_row=2, start_column=6, end_column=8)
  594. newname_1 = plist2[0][9] + '-' + plist2[0][10] + '(mm)'
  595. ws2.cell(2, 6).value = newname_1
  596. ws2.merge_cells(start_row=2, end_row=3, start_column=9, end_column=9)
  597. ws2.cell(2, 9).value = '位移判定'
  598. ws2.cell(2, 9).alignment = Alignment(wrap_text=True)
  599. ws2.cell(3, 2).value = 'X(m)'
  600. ws2.cell(3, 3).value = 'Y(m)'
  601. ws2.cell(3, 4).value = 'X(m)'
  602. ws2.cell(3, 5).value = 'Y(m)'
  603. ws2.cell(3, 6).value = '△X'
  604. ws2.cell(3, 7).value = '△Y'
  605. ws2.cell(3, 8).value = '△XY'
  606. row2 = 4
  607. for data2 in plist2:
  608. ws2.cell(row2, 1).value = data2[0]
  609. ws2.cell(row2, 2).value = round(data2[1], 4)
  610. ws2.cell(row2, 3).value = round(data2[2], 4)
  611. ws2.cell(row2, 4).value = round(data2[3], 4)
  612. ws2.cell(row2, 5).value = round(data2[4], 4)
  613. ws2.cell(row2, 6).value = round(data2[5], 1)
  614. ws2.cell(row2, 7).value = round(data2[6], 1)
  615. ws2.cell(row2, 8).value = round(data2[7], 1)
  616. if data2[8] == '稳定':
  617. ws2.cell(row2, 9).value = ''
  618. else:
  619. ws2.cell(row2, 9).value = data2[8]
  620. row2 = row2 + 1
  621. # -- 基准归算模型 --
  622. cursor.execute(
  623. 'SELECT Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3 FROM GS_Trans_Param WHERE TableName = ?',
  624. (utf_en,))
  625. result3 = cursor.fetchall()
  626. newname = result3[0][1].decode('utf-8')
  627. lastname = result3[0][0].decode('utf-8')
  628. ws3.column_dimensions['A'].width = 75
  629. ws_area = ws3["A1:A5"]
  630. alignment_center = Alignment(horizontal='left', vertical='center')
  631. for i in ws_area:
  632. for j in i:
  633. j.alignment = alignment_center
  634. str1 = newname + '--' + lastname + '已知系统转换公式:'
  635. ws3.cell(1, 1).value = str1
  636. str2 = 'X=(' + str(round(result3[0][2], 14)) + ')·x+(' + str(round(result3[0][3], 14)) + ')·y+(' + str(
  637. round(result3[0][4], 11)) + ')'
  638. ws3.cell(2, 1).value = str2
  639. str3 = 'Y=(' + str(round(result3[0][5], 14)) + ')·x+(' + str(round(result3[0][6], 14)) + ')·y+(' + str(
  640. round(result3[0][7], 11)) + ')'
  641. ws3.cell(3, 1).value = str3
  642. str4 = '式中:x、y为' + newname
  643. ws3.cell(4, 1).value = str4
  644. str5 = ' X、Y为' + lastname + '已知系统的' + newname + '归算坐标'
  645. ws3.cell(5, 1).value = str5
  646. # 删除默认创建的空白Sheet(如果有)
  647. if 'Sheet' in wb.sheetnames:
  648. wb.remove(wb['Sheet'])
  649. # 保存文件
  650. excel_filepath = os.path.join(folder_name, file_name)
  651. wb.save(excel_filepath)
  652. conn.close()
  653. # 主函数 写入excel文件
  654. def main_function(ui, dbpath, excelname, export_folder, file_name):
  655. try:
  656. openpyxl_write(export_folder, dbpath, excelname, file_name)
  657. QMessageBox.information(ui, '成功', f'成果文件已成功导出到 {export_folder}')
  658. except Exception as e:
  659. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  660. def main_function_initial(ui, dbpath, excelname_utf8, export_folder, file_name):
  661. try:
  662. export_initial_data(ui, dbpath, excelname_utf8, export_folder, file_name)
  663. QMessageBox.information(ui, '成功', f'初始文件已成功导出到 {export_folder}')
  664. except PermissionError as e:
  665. if e.errno == 13:
  666. QMessageBox.critical(ui, '错误', '请确认文件没有被其他程序(如Excel、文本编辑器等)打开')
  667. else:
  668. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  669. except Exception as e:
  670. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  671. def main_function_example(ui, dbpath, excelname_utf8, export_folder, file_name):
  672. try:
  673. export_example_data(ui, dbpath, excelname_utf8, export_folder, file_name)
  674. QMessageBox.information(ui, '成功', f'示例文件已成功导出到 {export_folder}')
  675. except PermissionError as e:
  676. if e.errno == 13:
  677. QMessageBox.critical(ui, '错误', '请确认文件没有被其他程序(如Excel、文本编辑器等)打开')
  678. else:
  679. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  680. except Exception as e:
  681. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
  682. def main_function_combined(ui, dbpath, excelname, export_folder, file_name):
  683. try:
  684. combined_export(export_folder, dbpath, excelname, file_name)
  685. QMessageBox.information(ui, '成功', f'数据文件已成功导出到 {export_folder}')
  686. except Exception as e:
  687. QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')