123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- import openpyxl
- import sqlite3
- import os
- import time
- from openpyxl.styles import Alignment, NamedStyle
- from PySide6.QtWidgets import QMessageBox
-
-
- def Arrange_Data1(list1):
- # 最终return的
- list2 = []
- for data1 in list1:
- # 点名
- # 存每一行的数据
- resultlist = []
- pn = data1[0].decode('utf-8')
- resultlist.append(pn)
- resultlist.append(data1[1])
- resultlist.append(data1[2])
- resultlist.append(data1[3])
- resultlist.append(data1[4])
- resultlist.append(data1[5])
- resultlist.append(data1[6])
- resultlist.append(data1[7])
- resultlist.append(data1[8])
- resultlist.append(data1[9])
- resultlist.append(data1[10])
- resultlist.append(data1[11])
- # 判定1
- an1 = data1[12].decode('utf-8')
- resultlist.append(an1)
- resultlist.append(data1[13])
- resultlist.append(data1[14])
- resultlist.append(data1[15])
- # 判定2
- an2 = data1[16].decode('utf-8')
- resultlist.append(an2)
- # 3个名字(首,上,新)
- name1 = data1[17].decode('utf-8')
- resultlist.append(name1)
- name2 = data1[18].decode('utf-8')
- resultlist.append(name2)
- name3 = data1[19].decode('utf-8')
- resultlist.append(name3)
- list2.append(resultlist)
-
- return list2
-
-
- def export_combined_data(ui, db_path, utf_en, export_folder, file_name):
- try:
- # 解码文件名并去掉后缀名
- decoded_utf_en = utf_en.decode('utf-8') if isinstance(utf_en, bytes) else utf_en
- excel_path = os.path.join(export_folder, file_name)
-
- # 创建一个新的工作簿
- wb = openpyxl.Workbook()
-
- # 创建三个Sheet
- ws_initial = wb.create_sheet('原始数据')
- ws_stability = wb.create_sheet('稳定性分析成果表')
- ws_model = wb.create_sheet('改算模型')
-
- # 删除默认的Sheet
- ws_default = wb['Sheet']
- wb.remove(ws_default)
-
- # 连接到数据库
- conn = sqlite3.connect(db_path)
- cursor = conn.cursor()
-
- # 查询WD_Input_Param表中的数据
- query_param = """
- SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir, SL_Count, Dir_Count, Scale_Value, First_ResultName
- FROM WD_Input_Param
- WHERE TableName = ?
- """
- cursor.execute(query_param, (utf_en,))
- result_param = cursor.fetchone()
-
- # 创建样式来保留指定的小数位数
- decimal_style_3 = NamedStyle(name="decimal_style_3")
- decimal_style_3.number_format = '0.0000'
- decimal_style_3.alignment = Alignment(horizontal='center', vertical='center')
-
- decimal_style_1 = NamedStyle(name="decimal_style_1")
- decimal_style_1.number_format = '0.0'
- decimal_style_1.alignment = Alignment(horizontal='center', vertical='center')
-
- decimal_style_4 = NamedStyle(name="decimal_style_4")
- decimal_style_4.number_format = '0'
- decimal_style_4.alignment = Alignment(horizontal='center', vertical='center')
-
- if result_param:
- new_result_name, last_result_name, avg_sl, ms_dir, sl_count, dir_count, scale_value, first_result_name = result_param
-
- # 填充数据到“原始数据”Sheet并应用样式
- ws_initial['B1'] = new_result_name
- ws_initial['B1'].alignment = Alignment(horizontal='center', vertical='center')
-
- ws_initial['D1'] = last_result_name
- ws_initial['D1'].alignment = Alignment(horizontal='center', vertical='center')
-
- ws_initial['G1'] = first_result_name
- ws_initial['G1'].alignment = Alignment(horizontal='center', vertical='center')
-
- ws_initial['J1'] = avg_sl
- ws_initial['J1'].style = decimal_style_3
-
- ws_initial['J2'] = ms_dir
- ws_initial['J2'].alignment = Alignment(horizontal='center', vertical='center')
-
- ws_initial['J3'] = sl_count
- ws_initial['J3'].style = decimal_style_4
-
- ws_initial['J4'] = dir_count
- ws_initial['J4'].style = decimal_style_4
-
- ws_initial['J5'] = scale_value
- ws_initial['J5'].style = decimal_style_4
-
- # 合并单元格
- ws_initial.merge_cells('B1:C1')
- ws_initial.merge_cells('D1:E1')
- ws_initial.merge_cells('G1:H1')
-
- # 设置列宽
- ws_initial.column_dimensions['B'].width = 12.5
- ws_initial.column_dimensions['C'].width = 12.5
- ws_initial.column_dimensions['D'].width = 12.5
- ws_initial.column_dimensions['E'].width = 12.5
- ws_initial.column_dimensions['F'].width = 3
- ws_initial.column_dimensions['G'].width = 12.5
- ws_initial.column_dimensions['H'].width = 12.5
- ws_initial.column_dimensions['I'].width = 14
- ws_initial.column_dimensions['J'].width = 10
-
- # 设置表头
- headers = [
- ("A2", "点名"),
- ("B2", "高斯坐标x(m)"),
- ("C2", "高斯坐标y(m)"),
- ("D2", "高斯坐标x(m)"),
- ("E2", "高斯坐标y(m)"),
- ("F2", "权"),
- ("G2", "高斯坐标x(m)"),
- ("H2", "高斯坐标y(m)"),
- ("I1", "平均边长"),
- ("I2", "方向值中误差"),
- ("I3", "总边数"),
- ("I4", "总方向数"),
- ("I5", "缩放值")
- ]
-
- for cell, value in headers:
- ws_initial[cell] = value
- ws_initial[cell].alignment = Alignment(horizontal='center', vertical='center')
-
- # 查询WD_Input_Point表中的数据
- query_point = """
- SELECT PointName, New_X, New_Y, Last_X, Last_Y, Wight, First_X, First_Y
- FROM WD_Input_Point
- WHERE TableName = ?
- """
- cursor.execute(query_point, (utf_en,))
- results_point = cursor.fetchall()
-
- # 创建一个样式来强制保留四位小数
- decimal_style = NamedStyle(name="decimal_style")
- decimal_style.number_format = '0000.0000'
-
- # 填充数据到“原始数据”Sheet
- for idx, (point_name, new_x, new_y, last_x, last_y, wight, first_x, first_y) in enumerate(results_point,
- start=3):
- ws_initial[f'A{idx}'] = point_name
- ws_initial[f'B{idx}'] = round(new_x, 4)
- ws_initial[f'C{idx}'] = round(new_y, 4)
- ws_initial[f'D{idx}'] = round(last_x, 4)
- ws_initial[f'E{idx}'] = round(last_y, 4)
- ws_initial[f'F{idx}'] = round(wight, 0)
- ws_initial[f'G{idx}'] = round(first_x, 4)
- ws_initial[f'H{idx}'] = round(first_y, 4)
-
- # 应用样式以保留四位小数
- ws_initial[f'B{idx}'].style = decimal_style
- ws_initial[f'C{idx}'].style = decimal_style
- ws_initial[f'D{idx}'].style = decimal_style
- ws_initial[f'E{idx}'].style = decimal_style
- ws_initial[f'G{idx}'].style = decimal_style
- ws_initial[f'H{idx}'].style = decimal_style
-
- # 提取“稳定性分析成果表”数据
- 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 = ?'
- cursor.execute(sqlstr1, (utf_en,))
- result1 = cursor.fetchall()
- plist1 = Arrange_Data1(result1)
-
- # 设置“稳定性分析成果表”列宽
- ws_stability.column_dimensions['B'].width = 15
- ws_stability.column_dimensions['C'].width = 15
- ws_stability.column_dimensions['D'].width = 15
- ws_stability.column_dimensions['E'].width = 15
- ws_stability.column_dimensions['F'].width = 5
- ws_stability.column_dimensions['G'].width = 15
- ws_stability.column_dimensions['H'].width = 15
- ws_stability.column_dimensions['I'].width = 5
- ws_stability.column_dimensions['M'].width = 5
- ws_stability.column_dimensions['Q'].width = 5
- ws_stability.column_dimensions['J'].width = 8
- ws_stability.column_dimensions['K'].width = 8
- ws_stability.column_dimensions['L'].width = 8
- ws_stability.column_dimensions['N'].width = 8
- ws_stability.column_dimensions['O'].width = 8
- ws_stability.column_dimensions['P'].width = 8
-
- # 设置“稳定性分析成果表”表头
- ws_stability.merge_cells(start_row=1, end_row=1, start_column=1, end_column=17)
- ws_stability.cell(1, 1).value = '稳定性分析成果表'
- ws_area = ws_stability["A1:Q2"]
- alignment_center = Alignment(horizontal='center', vertical='center')
- for i in ws_area:
- for j in i:
- j.alignment = alignment_center
-
- alignment_right = Alignment(horizontal='right', vertical='center')
- ws_stability.merge_cells(start_row=2, end_row=3, start_column=1, end_column=1)
- ws_stability.cell(2, 1).value = '点号'
-
- ws_stability.merge_cells(start_row=2, end_row=2, start_column=2, end_column=3)
- ws_stability.cell(2, 2).value = plist1[0][17]
-
- ws_stability.merge_cells(start_row=2, end_row=2, start_column=4, end_column=6)
- ws_stability.cell(2, 4).value = plist1[0][18]
-
- ws_stability.merge_cells(start_row=2, end_row=2, start_column=7, end_column=9)
- ws_stability.cell(2, 7).value = plist1[0][19]
-
- ws_stability.merge_cells(start_row=2, end_row=2, start_column=10, end_column=12)
- ws_stability.cell(2, 10).value = '本期-首期(mm)'
-
- ws_stability.merge_cells(start_row=2, end_row=3, start_column=13, end_column=13)
- ws_stability.cell(2, 13).value = '变形判定'
-
- ws_stability.merge_cells(start_row=2, end_row=2, start_column=14, end_column=16)
- ws_stability.cell(2, 14).value = '本期-上期(mm)'
-
- ws_stability.merge_cells(start_row=2, end_row=3, start_column=17, end_column=17)
- ws_stability.cell(2, 17).value = '变形判定'
-
- ws_stability.cell(2, 13).alignment = Alignment(wrap_text=True)
- ws_stability.cell(2, 17).alignment = Alignment(wrap_text=True)
-
- ws_stability.cell(3, 2).value = 'X(m)'
- ws_stability.cell(3, 3).value = 'Y(m)'
- ws_stability.cell(3, 4).value = 'X(m)'
- ws_stability.cell(3, 5).value = 'Y(m)'
- ws_stability.cell(3, 6).value = '权'
- ws_stability.cell(3, 7).value = 'X(m)'
- ws_stability.cell(3, 8).value = 'Y(m)'
- ws_stability.cell(3, 9).value = '权'
- ws_stability.cell(3, 10).value = '△X'
- ws_stability.cell(3, 11).value = '△Y'
- ws_stability.cell(3, 12).value = '△XY'
- ws_stability.cell(3, 14).value = '△X'
- ws_stability.cell(3, 15).value = '△Y'
- ws_stability.cell(3, 16).value = '△XY'
-
- row1 = 4
- for data1 in plist1:
- ws_stability.cell(row1, 1).value = data1[0]
- ws_stability.cell(row1, 2).value = round(data1[1], 4)
- ws_stability.cell(row1, 3).value = round(data1[2], 4)
- ws_stability.cell(row1, 4).value = round(data1[3], 4)
- ws_stability.cell(row1, 5).value = round(data1[4], 4)
- ws_stability.cell(row1, 6).value = int(data1[5])
- ws_stability.cell(row1, 7).value = round(data1[6], 4)
- ws_stability.cell(row1, 8).value = round(data1[7], 4)
- ws_stability.cell(row1, 9).value = int(data1[8])
- ws_stability.cell(row1, 10).value = round(data1[9], 1)
- ws_stability.cell(row1, 11).value = round(data1[10], 1)
- ws_stability.cell(row1, 12).value = round(data1[11], 1)
- if data1[12] == '稳定':
- ws_stability.cell(row1, 13).value = ''
- else:
- ws_stability.cell(row1, 13).value = data1[12]
- ws_stability.cell(row1, 14).value = round(data1[13], 1)
- ws_stability.cell(row1, 15).value = round(data1[14], 1)
- ws_stability.cell(row1, 16).value = round(data1[15], 1)
- if data1[16] == '稳定':
- ws_stability.cell(row1, 17).value = ''
- else:
- ws_stability.cell(row1, 17).value = data1[16]
- row1 += 1
-
- # 提取“改算模型”数据
- sqlstr2 = 'select Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3 from WD_Result_Param WHERE TableName = ?'
- cursor.execute(sqlstr2, (utf_en,))
- result3 = cursor.fetchall()
- newname = result3[0][1].decode('utf-8')
- lastname = result3[0][0].decode('utf-8')
-
- # 设置“改算模型”列宽
- ws_model.column_dimensions['A'].width = 75
-
- # 设置“改算模型”表头
- ws_area = ws_model["A1:A5"]
- alignment_center = Alignment(horizontal='left', vertical='center')
- for i in ws_area:
- for j in i:
- j.alignment = alignment_center
-
- # 填充“改算模型”数据
- str1 = newname + '--' + lastname + '已知系统转换公式:'
- ws_model.cell(1, 1).value = str1
- str2 = 'X=(' + str(round(result3[0][2], 14)) + ')·x+(' + str(round(result3[0][3], 14)) + ')·y+(' + str(
- round(result3[0][4], 11)) + ')'
- ws_model.cell(2, 1).value = str2
- str3 = 'Y=(' + str(round(result3[0][5], 14)) + ')·x+(' + str(round(result3[0][6], 14)) + ')·y+(' + str(
- round(result3[0][7], 11)) + ')'
- ws_model.cell(3, 1).value = str3
- str4 = '式中:x、y为' + newname
- ws_model.cell(4, 1).value = str4
- str5 = ' X、Y为' + lastname + '已知系统的' + newname + '归算坐标'
- ws_model.cell(5, 1).value = str5
-
- # 保存工作簿
- wb.save(excel_path)
-
- QMessageBox.information(ui, '成功', f'数据文件已导出到 {export_folder}')
-
- except PermissionError as e:
- if e.errno == 13:
- QMessageBox.critical(ui, '错误', '请确认文件没有被其他程序(如Excel、文本编辑器等)打开')
- else:
- QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
- except Exception as e:
- QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
-
-
- def export_example_data(ui, db_path, utf_en, export_folder, file_name):
- # 解码文件名并去掉后缀名
- decoded_utf_en = utf_en.decode('utf-8') if isinstance(utf_en, bytes) else utf_en
- # excel_file_name = f"{os.path.splitext(decoded_utf_en)[0]}.xlsx"
- excel_path = os.path.join(export_folder, file_name)
-
- # 创建一个新的工作簿和工作表
- wb = openpyxl.Workbook()
- ws = wb.active
-
- # 连接到数据库
- conn = sqlite3.connect(db_path)
- cursor = conn.cursor()
-
- # 查询WD_Input_Param表中的数据
- query = """
- SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir, SL_Count, Dir_Count, Scale_Value, First_ResultName
- FROM WD_Input_Param
- WHERE TableName = ?
- """
- cursor.execute(query, (utf_en,))
- result = cursor.fetchone()
-
- # 创建样式来保留指定的小数位数
- decimal_style_3 = NamedStyle(name="decimal_style_3")
- decimal_style_3.number_format = '0.0000'
- decimal_style_3.alignment = Alignment(horizontal='center', vertical='center')
-
- decimal_style_1 = NamedStyle(name="decimal_style_1")
- decimal_style_1.number_format = '0.0'
- decimal_style_1.alignment = Alignment(horizontal='center', vertical='center')
-
- decimal_style_4 = NamedStyle(name="decimal_style_4")
- decimal_style_4.number_format = '0'
- decimal_style_4.alignment = Alignment(horizontal='center', vertical='center')
-
- if result:
- new_result_name, last_result_name, avg_sl, ms_dir, sl_count, dir_count, scale_value, first_result_name = result
-
- # 填充数据到Excel并应用样式
- ws['B1'] = new_result_name
- ws['B1'].alignment = Alignment(horizontal='center', vertical='center')
-
- ws['D1'] = last_result_name
- ws['D1'].alignment = Alignment(horizontal='center', vertical='center')
-
- ws['G1'] = first_result_name # 新增:填入First_ResultName
- ws['G1'].alignment = Alignment(horizontal='center', vertical='center') # 新增:设置居中对齐
-
- ws['J1'] = avg_sl
- ws['J1'].style = decimal_style_3
-
- ws['J2'] = ms_dir
- ws['J2'].alignment = Alignment(horizontal='center', vertical='center')
-
- ws['J3'] = sl_count
- ws['J3'].style = decimal_style_4
-
- ws['J4'] = dir_count
- ws['J4'].style = decimal_style_4
-
- ws['J5'] = scale_value
- ws['J5'].style = decimal_style_4
-
- # 合并单元格
- ws.merge_cells('B1:C1')
- ws.merge_cells('D1:E1')
- ws.merge_cells('G1:H1')
-
- # 设置列宽
- ws.column_dimensions['B'].width = 12.5
- ws.column_dimensions['C'].width = 12.5
- ws.column_dimensions['D'].width = 12.5
- ws.column_dimensions['E'].width = 12.5
- ws.column_dimensions['F'].width = 3
- ws.column_dimensions['F'].alignment = Alignment(horizontal='center', vertical='center') # 新增:设置F列居中对齐
- ws.column_dimensions['G'].width = 12.5
- ws.column_dimensions['H'].width = 12.5
- ws.column_dimensions['I'].width = 14
- ws.column_dimensions['J'].width = 10
-
- # 设置表头
- headers = [
- ("A2", "点名"),
- ("B2", "高斯坐标x(m)"),
- ("C2", "高斯坐标y(m)"),
- ("D2", "高斯坐标x(m)"),
- ("E2", "高斯坐标y(m)"),
- ("F2", "权"),
- ("G2", "高斯坐标x(m)"),
- ("H2", "高斯坐标y(m)"),
- ("I1", "平均边长"),
- ("I2", "方向值中误差"),
- ("I3", "总边数"),
- ("I4", "总方向数"),
- ("I5", "缩放值")
- ]
-
- for cell, value in headers:
- ws[cell] = value
- ws[cell].alignment = Alignment(horizontal='center', vertical='center')
-
- # 查询WD_Input_Point表中的数据
- query_point = """
- SELECT PointName, New_X, New_Y, Last_X, Last_Y, Wight, First_X, First_Y
- FROM WD_Input_Point
- WHERE TableName = ?
- """
- cursor.execute(query_point, (utf_en,))
- results_point = cursor.fetchall()
-
- # 创建一个样式来强制保留四位小数
- decimal_style = NamedStyle(name="decimal_style")
- decimal_style.number_format = '0000.0000'
-
- # 填充数据到Excel
- for idx, (point_name, new_x, new_y, last_x, last_y, wight, first_x, first_y) in enumerate(results_point, start=3):
- ws[f'A{idx}'] = point_name
- ws[f'B{idx}'] = round(new_x, 4)
- ws[f'C{idx}'] = round(new_y, 4)
- ws[f'D{idx}'] = round(last_x, 4)
- ws[f'E{idx}'] = round(last_y, 4)
- ws[f'F{idx}'] = round(wight, 0) # 新增
- ws[f'G{idx}'] = round(first_x, 4) # 新增
- ws[f'H{idx}'] = round(first_y, 4) # 新增
-
- # 应用样式以保留四位小数
- ws[f'B{idx}'].style = decimal_style
- ws[f'C{idx}'].style = decimal_style
- ws[f'D{idx}'].style = decimal_style
- ws[f'E{idx}'].style = decimal_style
- ws[f'G{idx}'].style = decimal_style # 新增
- ws[f'H{idx}'].style = decimal_style # 新增
-
- # 保存工作簿
- wb.save(excel_path)
-
-
- # 数据文件的导出
- def main_function_combined(ui, dbpath, excelname, export_folder, file_name):
- export_combined_data(ui, dbpath, excelname, export_folder, file_name)
-
-
- # 示例文件的导出
- def main_function_example(ui, dbpath, excelname_utf8, export_folder, file_name):
- try:
- export_example_data(ui, dbpath, excelname_utf8, export_folder, file_name)
- QMessageBox.information(ui, '成功', f'示例文件已成功导出到 {export_folder}')
- except PermissionError as e:
- if e.errno == 13:
- QMessageBox.critical(ui, '错误', '请确认文件没有被其他程序(如Excel、文本编辑器等)打开')
- else:
- QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
- except Exception as e:
- QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
|