Просмотр исходного кода

完善了bug,对GS的导出功能进行了修改完善

wzp 1 месяц назад
Родитель
Сommit
1ffe4d7e8e
3 измененных файлов: 270 добавлений и 41 удалений
  1. 264
    31
      Front/back/GS/GSExport.py
  2. 4
    9
      Front/main.py
  3. 2
    1
      Front/modules/ui_functions.py

+ 264
- 31
Front/back/GS/GSExport.py Просмотреть файл

@@ -63,7 +63,7 @@ def Arrange_Data2(list1):
63 63
     return list2
64 64
 
65 65
 
66
-def openpyxl_write(folder_name, dbpath, filename,file_name):
66
+def openpyxl_write(folder_name, dbpath, filename, file_name):
67 67
     utf_en = filename.encode('utf-8')
68 68
     # 新建对应的excel
69 69
     wb = openpyxl.Workbook()
@@ -234,7 +234,7 @@ def openpyxl_write(folder_name, dbpath, filename,file_name):
234 234
     wb.save(excel_filepath)
235 235
 
236 236
 
237
-def export_initial_data(ui, db_path, utf_en, export_folder,file_name):
237
+def export_initial_data(ui, db_path, utf_en, export_folder, file_name):
238 238
     # 获取当前时间并格式化为字符串,例如:20231010_143000
239 239
     timestamp = time.strftime("%Y%m%d", time.localtime())
240 240
     # 解码 utf_en
@@ -359,7 +359,8 @@ def export_initial_data(ui, db_path, utf_en, export_folder,file_name):
359 359
     # 保存工作簿
360 360
     wb.save(excel_path)
361 361
 
362
-def export_example_data(ui, db_path, utf_en, export_folder,file_name):
362
+
363
+def export_example_data(ui, db_path, utf_en, export_folder, file_name):
363 364
     # 解码 utf_en
364 365
     decoded_utf_en = utf_en.decode('utf-8') if isinstance(utf_en, bytes) else utf_en
365 366
     # excel_file_name = f"{os.path.splitext(decoded_utf_en)[0]}.xlsx"
@@ -482,32 +483,263 @@ def export_example_data(ui, db_path, utf_en, export_folder,file_name):
482 483
     # 保存工作簿
483 484
     wb.save(excel_path)
484 485
 
486
+
487
+# 合并导出函数
488
+def combined_export(folder_name, dbpath, filename, file_name):
489
+    utf_en = filename.encode('utf-8')
490
+    # 创建新工作簿
491
+    wb = openpyxl.Workbook()
492
+
493
+    # ========== Sheet1: 初始数据 ==========
494
+    ws_initial = wb.active
495
+    ws_initial.title = "初始数据"
496
+
497
+    # 处理初始数据(原export_initial_data逻辑)
498
+    conn = sqlite3.connect(dbpath)
499
+    cursor = conn.cursor()
500
+
501
+    # 样式定义
502
+    decimal_style_3 = NamedStyle(name="decimal_style_3")
503
+    decimal_style_3.number_format = '0.000'
504
+    decimal_style_3.alignment = Alignment(horizontal='center', vertical='center')
505
+
506
+    decimal_style_1 = NamedStyle(name="decimal_style_1")
507
+    decimal_style_1.number_format = '0.0'
508
+    decimal_style_1.alignment = Alignment(horizontal='center', vertical='center')
509
+
510
+    decimal_style_4 = NamedStyle(name="decimal_style_4")
511
+    decimal_style_4.number_format = '0.0000'
512
+    decimal_style_4.alignment = Alignment(horizontal='center', vertical='center')
513
+
514
+    # 处理GS_Input_Param数据
515
+    param_query = """SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir, 
516
+                    Ms_WSL, SL_Count, Dir_Count, Scale_Value 
517
+                    FROM GS_Input_Param WHERE TableName = ?"""
518
+    cursor.execute(param_query, (utf_en,))
519
+    param_result = cursor.fetchone()
520
+
521
+    if param_result:
522
+        new_result_name, last_result_name, avg_sl, ms_dir, ms_wsl, sl_count, dir_count, scale_value = param_result
523
+
524
+        # 填充参数数据
525
+        ws_initial['B1'] = new_result_name
526
+        ws_initial['D1'] = last_result_name
527
+        ws_initial['G1'] = avg_sl
528
+        ws_initial['G2'] = ms_dir
529
+        ws_initial['G3'] = ms_wsl
530
+        ws_initial['G4'] = sl_count
531
+        ws_initial['G5'] = dir_count
532
+        ws_initial['G6'] = scale_value
533
+
534
+        # 应用样式
535
+        ws_initial['G1'].style = decimal_style_3
536
+        ws_initial['G4'].style = decimal_style_1
537
+        ws_initial['G5'].style = decimal_style_1
538
+        ws_initial['G6'].style = decimal_style_4
539
+
540
+        # 合并单元格
541
+        ws_initial.merge_cells('B1:C1')
542
+        ws_initial.merge_cells('D1:E1')
543
+        ws_initial['B1'].alignment = Alignment(horizontal='center', vertical='center')
544
+        ws_initial['D1'].alignment = Alignment(horizontal='center', vertical='center')
545
+
546
+    # 处理GS_Input_Point数据
547
+    point_query = """SELECT PointName, New_X, New_Y, Last_X, Last_Y 
548
+                    FROM GS_Input_Point WHERE TableName = ?"""
549
+    cursor.execute(point_query, (utf_en,))
550
+    point_results = cursor.fetchall()
551
+
552
+    # 设置表头
553
+    headers = [
554
+        ("A2", "点名"), ("B2", "高斯坐标x(m)"), ("C2", "高斯坐标y(m)"),
555
+        ("D2", "高斯坐标x(m)"), ("E2", "高斯坐标y(m)"), ("F1", "平均边长(m)"),
556
+        ("F2", "方向值中误差(″)"), ("F3", "最弱边边长相对中误差"),
557
+        ("F4", "网点总测边数"), ("F5", "网点总方向观测数"), ("F6", "缩放值")
558
+    ]
559
+
560
+    for cell, value in headers:
561
+        ws_initial[cell] = value
562
+        ws_initial[cell].alignment = Alignment(horizontal='center', vertical='center')
563
+
564
+    # 填充点数据
565
+    decimal_style = NamedStyle(name="decimal_style")
566
+    decimal_style.number_format = '0000.0000'
567
+    for idx, (point_name, new_x, new_y, last_x, last_y) in enumerate(point_results, start=3):
568
+        ws_initial[f'A{idx}'] = point_name
569
+        ws_initial[f'B{idx}'] = round(new_x, 4)
570
+        ws_initial[f'C{idx}'] = round(new_y, 4)
571
+        ws_initial[f'D{idx}'] = round(last_x, 4)
572
+        ws_initial[f'E{idx}'] = round(last_y, 4)
573
+        for col in ['B', 'C', 'D', 'E']:
574
+            ws_initial[f'{col}{idx}'].style = decimal_style
575
+
576
+    # ========== 后续工作表:原openpyxl_write内容 ==========
577
+    # 创建其他工作表(自动按顺序添加)
578
+    ws1 = wb.create_sheet('复测基准归算表')
579
+    ws2 = wb.create_sheet('复测成果表')
580
+    ws3 = wb.create_sheet('基准归算模型')
581
+
582
+    # 原openpyxl_write中的数据库查询和表格生成逻辑
583
+    # -- 复测基准归算表 --
584
+    cursor.execute(
585
+        'SELECT PointName,Cal_X,Cal_Y,Last_CalX,Last_CalY,Last_CalP,Dis_Ass,Last_ResultName,New_ResultName FROM GS_Result_Point WHERE TableName = ?',
586
+        (utf_en,))
587
+    result1 = cursor.fetchall()
588
+    plist1 = Arrange_Data1(result1)
589
+
590
+    # 工作表格式设置(保持原openpyxl_write中的格式代码不变)
591
+    ws1.column_dimensions['A'].width = 5
592
+    ws1.column_dimensions['B'].width = 15
593
+    ws1.column_dimensions['C'].width = 15
594
+    ws1.column_dimensions['D'].width = 8
595
+    ws1.column_dimensions['E'].width = 8
596
+    ws1.column_dimensions['F'].width = 8
597
+    ws1.column_dimensions['G'].width = 5
598
+    ws1.merge_cells(start_row=1, end_row=1, start_column=1, end_column=7)
599
+    ws1.cell(1, 1).value = '复测基准归算与位移判定'
600
+    ws1.merge_cells(start_row=2, end_row=3, start_column=1, end_column=1)
601
+    ws1.cell(2, 1).value = '点名'
602
+    ws1.merge_cells(start_row=2, end_row=2, start_column=2, end_column=3)
603
+    ws1.cell(2, 2).value = plist1[0][8] + '基准归算成果'
604
+    ws1.merge_cells(start_row=2, end_row=2, start_column=4, end_column=6)
605
+    ws1.cell(2, 4).value = plist1[0][7] + '-归算成果(mm)'
606
+    ws_area = ws1["A1:H3"]
607
+    alignment_center = Alignment(horizontal='center', vertical='center')
608
+    for i in ws_area:
609
+        for j in i:
610
+            j.alignment = alignment_center
611
+    alignment_right = Alignment(horizontal='right', vertical='center')
612
+    ws1.merge_cells(start_row=2, end_row=3, start_column=7, end_column=7)
613
+    ws1.cell(2, 7).value = '位移判定'
614
+    ws1.cell(2, 7).alignment = Alignment(wrap_text=True)
615
+    ws1.cell(3, 2).value = 'X(mm)'
616
+    ws1.cell(3, 3).value = 'Y(mm)'
617
+    ws1.cell(3, 4).value = '△X'
618
+    ws1.cell(3, 5).value = '△Y'
619
+    ws1.cell(3, 6).value = '△P'
620
+    row1 = 4
621
+    for data1 in plist1:
622
+        ws1.cell(row1, 1).value = data1[0]
623
+        ws1.cell(row1, 2).value = round(data1[1], 4)
624
+        ws1.cell(row1, 3).value = round(data1[2], 4)
625
+        ws1.cell(row1, 4).value = round(data1[3], 1)
626
+        ws1.cell(row1, 5).value = round(data1[4], 1)
627
+        ws1.cell(row1, 6).value = round(data1[5], 1)
628
+        if data1[6] == '稳定':
629
+            ws1.cell(row1, 7).value = ''
630
+        else:
631
+            ws1.cell(row1, 7).value = data1[6]
632
+        row1 = row1 + 1
633
+
634
+    # -- 复测成果表 --
635
+    cursor.execute(
636
+        '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 = ?',
637
+        (utf_en,))
638
+    result2 = cursor.fetchall()
639
+    plist2 = Arrange_Data2(result2)
640
+    ws2.column_dimensions['A'].width = 5
641
+    ws2.column_dimensions['B'].width = 15
642
+    ws2.column_dimensions['C'].width = 15
643
+    ws2.column_dimensions['D'].width = 15
644
+    ws2.column_dimensions['E'].width = 15
645
+    ws2.column_dimensions['F'].width = 8
646
+    ws2.column_dimensions['G'].width = 8
647
+    ws2.column_dimensions['H'].width = 8
648
+    ws2.column_dimensions['I'].width = 5
649
+    ws2.merge_cells(start_row=1, end_row=1, start_column=1, end_column=3)
650
+    ws2.cell(1, 1).value = '前期成果'
651
+    ws2.merge_cells(start_row=1, end_row=1, start_column=4, end_column=9)
652
+    ws2.cell(1, 4).value = '本期成果'
653
+    ws_area = ws2["A1:I2"]
654
+    alignment_center = Alignment(horizontal='center', vertical='center')
655
+    for i in ws_area:
656
+        for j in i:
657
+            j.alignment = alignment_center
658
+    alignment_right = Alignment(horizontal='right', vertical='center')
659
+    ws2.merge_cells(start_row=2, end_row=3, start_column=1, end_column=1)
660
+    ws2.cell(2, 1).value = '点名'
661
+    ws2.merge_cells(start_row=2, end_row=2, start_column=2, end_column=3)
662
+    ws2.cell(2, 2).value = plist2[0][9]
663
+    ws2.merge_cells(start_row=2, end_row=2, start_column=4, end_column=5)
664
+    ws2.cell(2, 4).value = plist2[0][10]
665
+    ws2.merge_cells(start_row=2, end_row=2, start_column=6, end_column=8)
666
+    newname_1 = plist2[0][9] + '-' + plist2[0][10] + '(mm)'
667
+    ws2.cell(2, 6).value = newname_1
668
+    ws2.merge_cells(start_row=2, end_row=3, start_column=9, end_column=9)
669
+    ws2.cell(2, 9).value = '位移判定'
670
+    ws2.cell(2, 9).alignment = Alignment(wrap_text=True)
671
+    ws2.cell(3, 2).value = 'X(m)'
672
+    ws2.cell(3, 3).value = 'Y(m)'
673
+    ws2.cell(3, 4).value = 'X(m)'
674
+    ws2.cell(3, 5).value = 'Y(m)'
675
+    ws2.cell(3, 6).value = '△X'
676
+    ws2.cell(3, 7).value = '△Y'
677
+    ws2.cell(3, 8).value = '△XY'
678
+    row2 = 4
679
+    for data2 in plist2:
680
+        ws2.cell(row2, 1).value = data2[0]
681
+        ws2.cell(row2, 2).value = round(data2[1], 4)
682
+        ws2.cell(row2, 3).value = round(data2[2], 4)
683
+        ws2.cell(row2, 4).value = round(data2[3], 4)
684
+        ws2.cell(row2, 5).value = round(data2[4], 4)
685
+        ws2.cell(row2, 6).value = round(data2[5], 1)
686
+        ws2.cell(row2, 7).value = round(data2[6], 1)
687
+        ws2.cell(row2, 8).value = round(data2[7], 1)
688
+        if data2[8] == '稳定':
689
+            ws2.cell(row2, 9).value = ''
690
+        else:
691
+            ws2.cell(row2, 9).value = data2[8]
692
+        row2 = row2 + 1
693
+
694
+    # -- 基准归算模型 --
695
+    cursor.execute(
696
+        'SELECT Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3 FROM GS_Trans_Param WHERE TableName = ?',
697
+        (utf_en,))
698
+    result3 = cursor.fetchall()
699
+
700
+    newname = result3[0][1].decode('utf-8')
701
+    lastname = result3[0][0].decode('utf-8')
702
+    ws3.column_dimensions['A'].width = 75
703
+    ws_area = ws3["A1:A5"]
704
+    alignment_center = Alignment(horizontal='left', vertical='center')
705
+    for i in ws_area:
706
+        for j in i:
707
+            j.alignment = alignment_center
708
+    str1 = newname + '--' + lastname + '已知系统转换公式:'
709
+    ws3.cell(1, 1).value = str1
710
+    str2 = 'X=(' + str(round(result3[0][2], 14)) + ')·x+(' + str(round(result3[0][3], 14)) + ')·y+(' + str(
711
+        round(result3[0][4], 11)) + ')'
712
+    ws3.cell(2, 1).value = str2
713
+    str3 = 'Y=(' + str(round(result3[0][5], 14)) + ')·x+(' + str(round(result3[0][6], 14)) + ')·y+(' + str(
714
+        round(result3[0][7], 11)) + ')'
715
+    ws3.cell(3, 1).value = str3
716
+    str4 = '式中:x、y为' + newname
717
+    ws3.cell(4, 1).value = str4
718
+    str5 = '     X、Y为' + lastname + '已知系统的' + newname + '归算坐标'
719
+    ws3.cell(5, 1).value = str5
720
+
721
+    # 删除默认创建的空白Sheet(如果有)
722
+    if 'Sheet' in wb.sheetnames:
723
+        wb.remove(wb['Sheet'])
724
+
725
+    # 保存文件
726
+    excel_filepath = os.path.join(folder_name, file_name)
727
+    wb.save(excel_filepath)
728
+    conn.close()
729
+
730
+
485 731
 # 主函数 写入excel文件
486
-def main_function(ui, dbpath, excelname,export_folder,file_name):
487
-    # # 获取应用的安装目录
488
-    # app_install_dir = os.getcwd()  # 假设脚本文件位于应用的安装目录下
489
-    # export_folder = os.path.join(app_install_dir, 'Export')
490
-    #
491
-    # # 如果 Export 文件夹不存在,则创建它
492
-    # if not os.path.exists(export_folder):
493
-    #     os.makedirs(export_folder)
732
+def main_function(ui, dbpath, excelname, export_folder, file_name):
494 733
     try:
495
-        openpyxl_write(export_folder, dbpath, excelname,file_name)
734
+        openpyxl_write(export_folder, dbpath, excelname, file_name)
496 735
         QMessageBox.information(ui, '成功', f'成果文件已成功导出到 {export_folder}')
497 736
     except Exception as e:
498 737
         QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
499 738
 
500 739
 
501
-def main_function_initial(ui, dbpath, excelname_utf8,export_folder,file_name):
502
-    # # 获取应用的安装目录
503
-    # app_install_dir = os.getcwd()  # 假设脚本文件位于应用的安装目录下
504
-    # export_folder = os.path.join(app_install_dir, 'Export')
505
-    #
506
-    # # 如果 Export 文件夹不存在,则创建它
507
-    # if not os.path.exists(export_folder):
508
-    #     os.makedirs(export_folder)
740
+def main_function_initial(ui, dbpath, excelname_utf8, export_folder, file_name):
509 741
     try:
510
-        export_initial_data(ui, dbpath, excelname_utf8, export_folder,file_name)
742
+        export_initial_data(ui, dbpath, excelname_utf8, export_folder, file_name)
511 743
         QMessageBox.information(ui, '成功', f'初始文件已成功导出到 {export_folder}')
512 744
     except PermissionError as e:
513 745
         if e.errno == 13:
@@ -518,16 +750,9 @@ def main_function_initial(ui, dbpath, excelname_utf8,export_folder,file_name):
518 750
         QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
519 751
 
520 752
 
521
-def main_function_example(ui, dbpath, excelname_utf8,export_folder,file_name):
522
-    # # 获取应用的安装目录
523
-    # app_install_dir = os.getcwd()  # 假设脚本文件位于应用的安装目录下
524
-    # export_folder = os.path.join(app_install_dir, 'Example')
525
-    #
526
-    # # 如果 Export 文件夹不存在,则创建它
527
-    # if not os.path.exists(export_folder):
528
-    #     os.makedirs(export_folder)
753
+def main_function_example(ui, dbpath, excelname_utf8, export_folder, file_name):
529 754
     try:
530
-        export_example_data(ui, dbpath, excelname_utf8, export_folder,file_name)
755
+        export_example_data(ui, dbpath, excelname_utf8, export_folder, file_name)
531 756
         QMessageBox.information(ui, '成功', f'示例文件已成功导出到 {export_folder}')
532 757
     except PermissionError as e:
533 758
         if e.errno == 13:
@@ -535,4 +760,12 @@ def main_function_example(ui, dbpath, excelname_utf8,export_folder,file_name):
535 760
         else:
536 761
             QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
537 762
     except Exception as e:
538
-        QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
763
+        QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
764
+
765
+
766
+def main_function_combined(ui, dbpath, excelname, export_folder, file_name):
767
+    try:
768
+        combined_export(export_folder, dbpath, excelname, file_name)
769
+        QMessageBox.information(ui, '成功', f'数据文件已成功导出到 {export_folder}')
770
+    except Exception as e:
771
+        QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')

+ 4
- 9
Front/main.py Просмотреть файл

@@ -47,7 +47,7 @@ from pathlib import Path
47 47
 project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
48 48
 sys.path.append(project_root)
49 49
 
50
-# os.environ["QT_FONT_DPI"] = "96"  # FIX Problem for High DPI and Scale above 100%
50
+os.environ["QT_FONT_DPI"] = "96"  # FIX Problem for High DPI and Scale above 100%
51 51
 
52 52
 # SET AS GLOBAL WIDGETS
53 53
 # ///////////////////////////////////////////////////////////////
@@ -415,11 +415,8 @@ class ElTree(QWidget):
415 415
         if parent_name == '水准测段高差稳定计算':
416 416
             GCExport.main_function_combined(self, tablename_utf8, dbpath, folder_name, file_name)
417 417
         elif parent_name == '控制网复测平面基准计算':
418
-            GSExport.main_function(self, dbpath, tablename, folder_name, file_name)
419
-            GSExport.main_function_initial(self, dbpath, tablename_utf8, folder_name, file_name)
418
+            GSExport.main_function_combined(self, dbpath, tablename, folder_name, file_name)
420 419
         elif parent_name == '平面控制网稳定性计算':
421
-            # WDExport.main_function(self, dbpath, tablename, folder_name, file_name)
422
-            # WDExport.main_function_initial(self, dbpath, tablename_utf8, folder_name, file_name)
423 420
             WDExport.main_function_combined(self, dbpath, tablename_utf8, folder_name, file_name)
424 421
         else:
425 422
             QMessageBox.warning(self, '警告', '未知的父节点')
@@ -697,10 +694,9 @@ class ElTree1(QWidget):
697 694
         if parent_name == '水准测段高差稳定计算':
698 695
             GCExport.main_function_combined(self, tablename_utf8, dbpath, folder_name, file_name)  # 导出合并文件
699 696
         elif parent_name == '控制网复测平面基准计算':
700
-            GSExport.main_function_initial(self, dbpath, tablename_utf8, folder_name, file_name)  # 导出初始文件
701
-            GSExport.main_function(self, dbpath, tablename, folder_name, file_name)  # 导出结果文件
697
+            GSExport.main_function_combined(self, dbpath, tablename, folder_name, file_name)
702 698
         elif parent_name == '平面控制网稳定性计算':
703
-            WDExport.main_function_combined(self, dbpath, excelname, folder_name, file_name)
699
+            WDExport.main_function_combined(self, dbpath, tablename_utf8, folder_name, file_name)
704 700
         else:
705 701
             QMessageBox.warning(self, '警告', '未知的父节点')
706 702
             return
@@ -1013,7 +1009,6 @@ class MainWindow(QMainWindow):
1013 1009
             # 在这里处理文件保存逻辑
1014 1010
             if self.file_path:
1015 1011
                 UIFunctions.export_database_to_excel(self, self.file_path, folder_name, file_name)
1016
-                QMessageBox.information(self, "保存成功", f"文件将保存到: {file_name}")
1017 1012
             else:
1018 1013
                 QMessageBox.warning(self, '警告', '请先选择项目并上传文件')
1019 1014
         else:

+ 2
- 1
Front/modules/ui_functions.py Просмотреть файл

@@ -362,7 +362,8 @@ class UIFunctions(MainWindow):
362 362
         if current_text == "水准测段高差稳定计算":
363 363
             GCExport.main_function_combined(self, utf_en, db_path,folder_name,file_name)
364 364
         elif current_text == "控制网复测平面基准计算":
365
-            GSExport.main_function(self, db_path, excelname,folder_name,file_name)
365
+            # GSExport.main_function(self, db_path, excelname,folder_name,file_name)
366
+            GSExport.main_function_combined(self, db_path, excelname, folder_name, file_name)
366 367
         elif current_text == "平面控制网稳定性计算":
367 368
             WDExport.main_function_combined(self, db_path, excelname,folder_name,file_name)
368 369
         else:

Загрузка…
Отмена
Сохранить