import openpyxl import sqlite3 import os import time from openpyxl.styles import Alignment 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 openpyxl_write(file_name, dbpath, filename): utf_en = filename.encode('utf-8') # 新建对应的excel wb = openpyxl.Workbook() ws1 = wb.create_sheet('稳定性分析成果表') ws2 = wb.create_sheet('改算模型') ws3 = wb['Sheet'] wb.remove(ws3) # ws1部分(成果表) # 提取数据 db1 = sqlite3.connect(dbpath) # 获取游标 cursor1 = db1.cursor() 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 = ?' cursor1.execute(sqlstr1, (utf_en,)) # 获取结果集 result1 = cursor1.fetchall() # 整理数据 plist1 = Arrange_Data1(result1) ws1.column_dimensions['B'].width = 15 ws1.column_dimensions['C'].width = 15 ws1.column_dimensions['D'].width = 15 ws1.column_dimensions['E'].width = 15 ws1.column_dimensions['F'].width = 5 ws1.column_dimensions['G'].width = 15 ws1.column_dimensions['H'].width = 15 ws1.column_dimensions['I'].width = 5 ws1.column_dimensions['M'].width = 5 ws1.column_dimensions['Q'].width = 5 ws1.column_dimensions['J'].width = 8 ws1.column_dimensions['K'].width = 8 ws1.column_dimensions['L'].width = 8 ws1.column_dimensions['N'].width = 8 ws1.column_dimensions['O'].width = 8 ws1.column_dimensions['P'].width = 8 ws1.merge_cells(start_row=1, end_row=1, start_column=1, end_column=17) ws1.cell(1, 1).value = '稳定性分析成果表' ws_area = ws1["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') ws1.merge_cells(start_row=2, end_row=3, start_column=1, end_column=1) ws1.cell(2, 1).value = '点号' ws1.merge_cells(start_row=2, end_row=2, start_column=2, end_column=3) ws1.cell(2, 2).value = plist1[0][17] ws1.merge_cells(start_row=2, end_row=2, start_column=4, end_column=6) ws1.cell(2, 4).value = plist1[0][18] ws1.merge_cells(start_row=2, end_row=2, start_column=7, end_column=9) ws1.cell(2, 7).value = plist1[0][19] ws1.merge_cells(start_row=2, end_row=2, start_column=10, end_column=12) ws1.cell(2, 10).value = '本期-首期(mm)' ws1.merge_cells(start_row=2, end_row=3, start_column=13, end_column=13) ws1.cell(2, 13).value = '变形判定' ws1.merge_cells(start_row=2, end_row=2, start_column=14, end_column=16) ws1.cell(2, 14).value = '本期-上期(mm)' ws1.merge_cells(start_row=2, end_row=3, start_column=17, end_column=17) ws1.cell(2, 17).value = '变形判定' ws1.cell(2, 13).alignment = Alignment(wrap_text=True) ws1.cell(2, 17).alignment = Alignment(wrap_text=True) ws1.cell(3, 2).value = 'X(m)' ws1.cell(3, 3).value = 'Y(m)' ws1.cell(3, 4).value = 'X(m)' ws1.cell(3, 5).value = 'Y(m)' ws1.cell(3, 6).value = '权' ws1.cell(3, 7).value = 'X(m)' ws1.cell(3, 8).value = 'Y(m)' ws1.cell(3, 9).value = '权' ws1.cell(3, 10).value = '△X' ws1.cell(3, 11).value = '△Y' ws1.cell(3, 12).value = '△XY' ws1.cell(3, 14).value = '△X' ws1.cell(3, 15).value = '△Y' ws1.cell(3, 16).value = '△XY' row1 = 4 for data1 in plist1: ws1.cell(row1, 1).value = data1[0] ws1.cell(row1, 2).value = round(data1[1], 4) ws1.cell(row1, 3).value = round(data1[2], 4) ws1.cell(row1, 4).value = round(data1[3], 4) ws1.cell(row1, 5).value = round(data1[4], 4) ws1.cell(row1, 6).value = int(data1[5]) ws1.cell(row1, 7).value = round(data1[6], 4) ws1.cell(row1, 8).value = round(data1[7], 4) ws1.cell(row1, 9).value = int(data1[8]) ws1.cell(row1, 10).value = round(data1[9], 1) ws1.cell(row1, 11).value = round(data1[10], 1) ws1.cell(row1, 12).value = round(data1[11], 1) if data1[12] == '稳定': ws1.cell(row1, 13).value = '' else: ws1.cell(row1, 13).value = data1[12] ws1.cell(row1, 14).value = round(data1[13], 1) ws1.cell(row1, 15).value = round(data1[14], 1) ws1.cell(row1, 16).value = round(data1[15], 1) if data1[16] == '稳定': ws1.cell(row1, 17).value = '' else: ws1.cell(row1, 17).value = data1[16] row1 = row1 + 1 # ws2部分(公式) # 提取数据 sqlstr2 = 'select Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3 from WD_Result_Param WHERE TableName = ?' cursor1.execute(sqlstr2, (utf_en,)) # 获取结果集 result3 = cursor1.fetchall() newname = result3[0][1].decode('utf-8') lastname = result3[0][0].decode('utf-8') ws2.column_dimensions['A'].width = 75 ws_area = ws2["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 + '已知系统转换公式:' ws2.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)) + ')' ws2.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)) + ')' ws2.cell(3, 1).value = str3 str4 = '式中:x、y为' + newname ws2.cell(4, 1).value = str4 str5 = ' X、Y为' + lastname + '已知系统的' + newname + '归算坐标' ws2.cell(5, 1).value = str5 # 保存 Excel 文件 excel_filename = f"平面控制网稳定性计算成果表{time.strftime('%Y%m%d_%H%M%S')}.xlsx" excel_filepath = os.path.join(file_name, excel_filename) wb.save(excel_filepath) # 主函数 写入excel文件 def main_function(ui, dbpath, excelname): # dbpath = r"D:\4work_now\20240819GS\ControlNetwork\ControlNetwork\UI\SQL\DataBase.db" # outpath = r'D:\4work_now\20240819GS\JPG\WD成果表.xlsx' # file_path = r'D:\4work_now\20240819GS\test_wd.xls' # 获取应用的安装目录 app_install_dir = os.path.dirname(os.path.abspath(__file__)) # 假设脚本文件位于应用的安装目录下 export_folder = os.path.join(app_install_dir, 'Export') # 如果 Export 文件夹不存在,则创建它 if not os.path.exists(export_folder): os.makedirs(export_folder) try: openpyxl_write(export_folder, dbpath, excelname) QMessageBox.information(ui, '成功', f'成果文件已成功导出到 {export_folder}') except Exception as e: QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}') # dbpath = r"D:\4work_now\20240819GS\ControlNetwork\ControlNetwork\UI\SQL\DataBase.db" # # dbpath = r"D:/Code/ControlNetwork/UI/SQL/DataBase.db" # outpath = r'D:\4work_now\20240819GS\JPG\WD成果表.xlsx' # file_path = r'D:\4work_now\20240819GS\test_wd.xls' # file_name = os.path.basename(file_path) # # outpath为包含输出excel名字的全路径 # openpyxl_write(outpath,dbpath,file_name)