import openpyxl import sqlite3 import os import time from openpyxl.styles import Alignment, NamedStyle from PySide6.QtWidgets import QMessageBox # from openpyxl.styles.numbers import FORMAT_NUMBER_00 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]) # 判定 an1 = data1[6].decode('utf-8') resultlist.append(an1) # 两个结果名字(旧新) name1 = data1[7].decode('utf-8') resultlist.append(name1) name2 = data1[8].decode('utf-8') resultlist.append(name2) list2.append(resultlist) return list2 # 复测成果表 def Arrange_Data2(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]) # 判定 an1 = data1[8].decode('utf-8') resultlist.append(an1) # 两个结果名字(旧新) name1 = data1[9].decode('utf-8') resultlist.append(name1) name2 = data1[10].decode('utf-8') resultlist.append(name2) list2.append(resultlist) return list2 def openpyxl_write(folder_name, dbpath, filename,file_name): utf_en = filename.encode('utf-8') # 新建对应的excel wb = openpyxl.Workbook() ws2 = wb.create_sheet('复测成果表') ws1 = wb.create_sheet('复测基准归算表') ws3 = wb.create_sheet('基准归算模型') ws5 = wb['Sheet'] wb.remove(ws5) # w1部分(基准归算表) # 提取数据 db = sqlite3.connect(dbpath) cursor1 = db.cursor() 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 = ?' cursor1.execute(sqlstr11, (utf_en,)) # 获取结果集 result1 = cursor1.fetchall() # 整理数据 plist1 = Arrange_Data1(result1) ws1.column_dimensions['A'].width = 5 ws1.column_dimensions['B'].width = 15 ws1.column_dimensions['C'].width = 15 ws1.column_dimensions['D'].width = 8 ws1.column_dimensions['E'].width = 8 ws1.column_dimensions['F'].width = 8 ws1.column_dimensions['G'].width = 5 ws1.merge_cells(start_row=1, end_row=1, start_column=1, end_column=7) ws1.cell(1, 1).value = '复测基准归算与位移判定' 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][8] + '基准归算成果' ws1.merge_cells(start_row=2, end_row=2, start_column=4, end_column=6) ws1.cell(2, 4).value = plist1[0][7] + '-归算成果(mm)' ws_area = ws1["A1:H3"] 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=7, end_column=7) ws1.cell(2, 7).value = '位移判定' ws1.cell(2, 7).alignment = Alignment(wrap_text=True) ws1.cell(3, 2).value = 'X(mm)' ws1.cell(3, 3).value = 'Y(mm)' ws1.cell(3, 4).value = '△X' ws1.cell(3, 5).value = '△Y' ws1.cell(3, 6).value = '△P' 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], 1) ws1.cell(row1, 5).value = round(data1[4], 1) ws1.cell(row1, 6).value = round(data1[5], 1) if data1[6] == '稳定': ws1.cell(row1, 7).value = '' else: ws1.cell(row1, 7).value = data1[6] row1 = row1 + 1 # ws2部分(复测成果表) # 提取数据 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 = ?' cursor1.execute(sqlstr1, (utf_en,)) # 获取结果集 result2 = cursor1.fetchall() # 整理数据 plist2 = Arrange_Data2(result2) ws2.column_dimensions['A'].width = 5 ws2.column_dimensions['B'].width = 15 ws2.column_dimensions['C'].width = 15 ws2.column_dimensions['D'].width = 15 ws2.column_dimensions['E'].width = 15 ws2.column_dimensions['F'].width = 8 ws2.column_dimensions['G'].width = 8 ws2.column_dimensions['H'].width = 8 ws2.column_dimensions['I'].width = 5 ws2.merge_cells(start_row=1, end_row=1, start_column=1, end_column=3) ws2.cell(1, 1).value = '前期成果' ws2.merge_cells(start_row=1, end_row=1, start_column=4, end_column=9) ws2.cell(1, 4).value = '本期成果' ws_area = ws2["A1:I2"] 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') ws2.merge_cells(start_row=2, end_row=3, start_column=1, end_column=1) ws2.cell(2, 1).value = '点名' ws2.merge_cells(start_row=2, end_row=2, start_column=2, end_column=3) ws2.cell(2, 2).value = plist2[0][9] ws2.merge_cells(start_row=2, end_row=2, start_column=4, end_column=5) ws2.cell(2, 4).value = plist2[0][10] ws2.merge_cells(start_row=2, end_row=2, start_column=6, end_column=8) newname_1 = plist2[0][9] + '-' + plist2[0][10] + '(mm)' ws2.cell(2, 6).value = newname_1 ws2.merge_cells(start_row=2, end_row=3, start_column=9, end_column=9) ws2.cell(2, 9).value = '位移判定' ws2.cell(2, 9).alignment = Alignment(wrap_text=True) ws2.cell(3, 2).value = 'X(m)' ws2.cell(3, 3).value = 'Y(m)' ws2.cell(3, 4).value = 'X(m)' ws2.cell(3, 5).value = 'Y(m)' ws2.cell(3, 6).value = '△X' ws2.cell(3, 7).value = '△Y' ws2.cell(3, 8).value = '△XY' row2 = 4 for data2 in plist2: ws2.cell(row2, 1).value = data2[0] ws2.cell(row2, 2).value = round(data2[1], 4) ws2.cell(row2, 3).value = round(data2[2], 4) ws2.cell(row2, 4).value = round(data2[3], 4) ws2.cell(row2, 5).value = round(data2[4], 4) ws2.cell(row2, 6).value = round(data2[5], 1) ws2.cell(row2, 7).value = round(data2[6], 1) ws2.cell(row2, 8).value = round(data2[7], 1) if data2[8] == '稳定': ws2.cell(row2, 9).value = '' else: ws2.cell(row2, 9).value = data2[8] row2 = row2 + 1 # ws3部分(公式) # 提取数据 sqlstr2 = 'select Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3 from GS_Trans_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') ws3.column_dimensions['A'].width = 75 ws_area = ws3["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 + '已知系统转换公式:' ws3.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)) + ')' ws3.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)) + ')' ws3.cell(3, 1).value = str3 str4 = '式中:x、y为' + newname ws3.cell(4, 1).value = str4 str5 = ' X、Y为' + lastname + '已知系统的' + newname + '归算坐标' ws3.cell(5, 1).value = str5 # 获取当前时间并格式化为字符串,例如:20231010_143000 timestamp = time.strftime("%Y%m%d", time.localtime()) # 保存 Excel 文件 # excel_filename = f"{os.path.splitext(filename)[0]}-成果数据-{timestamp}.xlsx" excel_filepath = os.path.join(folder_name, file_name) wb.save(excel_filepath) def export_initial_data(ui, db_path, utf_en, export_folder,file_name): # 获取当前时间并格式化为字符串,例如:20231010_143000 timestamp = time.strftime("%Y%m%d", time.localtime()) # 解码 utf_en 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]}-初始数据-{timestamp}.xlsx" excel_path = os.path.join(export_folder, file_name) # 创建一个新的工作簿和工作表 wb = openpyxl.Workbook() ws = wb.active # 连接到数据库 conn = sqlite3.connect(db_path) cursor = conn.cursor() # 查询GS_Input_Param表中的数据 query = """ SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir, Ms_WSL, SL_Count, Dir_Count, Scale_Value FROM GS_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.000' 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.0000' decimal_style_4.alignment = Alignment(horizontal='center', vertical='center') if result: new_result_name, last_result_name, avg_sl, ms_dir, ms_wsl, sl_count, dir_count, scale_value = 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'] = avg_sl ws['G1'].style = decimal_style_3 ws['G2'] = ms_dir ws['G2'].alignment = Alignment(horizontal='center', vertical='center') ws['G3'] = ms_wsl ws['G3'].alignment = Alignment(horizontal='center', vertical='center') ws['G4'] = sl_count ws['G4'].style = decimal_style_1 ws['G5'] = dir_count ws['G5'].style = decimal_style_1 ws['G6'] = scale_value ws['G6'].style = decimal_style_4 # 合并单元格 ws.merge_cells('B1:C1') ws.merge_cells('D1:E1') # 设置列宽 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 = 22 ws.column_dimensions['G'].width = 21.5 # 设置B1, D1单元格居中显示 ws['B1'].alignment = Alignment(horizontal='center', vertical='center') ws['D1'].alignment = Alignment(horizontal='center', vertical='center') # 设置表头 headers = [ ("A2", "点名"), ("B2", "高斯坐标x(m)"), ("C2", "高斯坐标y(m)"), ("D2", "高斯坐标x(m)"), ("E2", "高斯坐标y(m)"), ("F1", "平均边长(m)"), ("F2", "方向值中误差(″)"), ("F3", "最弱边边长相对中误差"), ("F4", "网点总测边数"), ("F5", "网点总方向观测数"), ("F6", "缩放值") ] for cell, value in headers: ws[cell] = value ws[cell].alignment = Alignment(horizontal='center', vertical='center') # 查询GS_Input_Point表中的数据 query_point = """ SELECT PointName, New_X, New_Y, Last_X, Last_Y FROM GS_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) 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'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 # 保存工作簿 wb.save(excel_path) def export_example_data(ui, db_path, utf_en, export_folder,file_name): # 解码 utf_en 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() # 查询GS_Input_Param表中的数据 query = """ SELECT New_ResultName, Last_ResultName, Avg_SL, Ms_Dir, Ms_WSL, SL_Count, Dir_Count, Scale_Value FROM GS_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.000' 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.0000' decimal_style_4.alignment = Alignment(horizontal='center', vertical='center') if result: new_result_name, last_result_name, avg_sl, ms_dir, ms_wsl, sl_count, dir_count, scale_value = 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'] = avg_sl ws['G1'].style = decimal_style_3 ws['G2'] = ms_dir ws['G2'].alignment = Alignment(horizontal='center', vertical='center') ws['G3'] = ms_wsl ws['G3'].alignment = Alignment(horizontal='center', vertical='center') ws['G4'] = sl_count ws['G4'].style = decimal_style_1 ws['G5'] = dir_count ws['G5'].style = decimal_style_1 ws['G6'] = scale_value ws['G6'].style = decimal_style_4 # 合并单元格 ws.merge_cells('B1:C1') ws.merge_cells('D1:E1') # 设置列宽 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 = 22 ws.column_dimensions['G'].width = 21.5 # 设置B1, D1单元格居中显示 ws['B1'].alignment = Alignment(horizontal='center', vertical='center') ws['D1'].alignment = Alignment(horizontal='center', vertical='center') # 设置表头 headers = [ ("A2", "点名"), ("B2", "高斯坐标x(m)"), ("C2", "高斯坐标y(m)"), ("D2", "高斯坐标x(m)"), ("E2", "高斯坐标y(m)"), ("F1", "平均边长(m)"), ("F2", "方向值中误差(″)"), ("F3", "最弱边边长相对中误差"), ("F4", "网点总测边数"), ("F5", "网点总方向观测数"), ("F6", "缩放值") ] for cell, value in headers: ws[cell] = value ws[cell].alignment = Alignment(horizontal='center', vertical='center') # 查询GS_Input_Point表中的数据 query_point = """ SELECT PointName, New_X, New_Y, Last_X, Last_Y FROM GS_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) 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'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 # 保存工作簿 wb.save(excel_path) # 主函数 写入excel文件 def main_function(ui, dbpath, excelname,export_folder,file_name): # # 获取应用的安装目录 # app_install_dir = os.getcwd() # 假设脚本文件位于应用的安装目录下 # 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,file_name) QMessageBox.information(ui, '成功', f'成果文件已成功导出到 {export_folder}') except Exception as e: QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}') def main_function_initial(ui, dbpath, excelname_utf8,export_folder,file_name): # # 获取应用的安装目录 # app_install_dir = os.getcwd() # 假设脚本文件位于应用的安装目录下 # export_folder = os.path.join(app_install_dir, 'Export') # # # 如果 Export 文件夹不存在,则创建它 # if not os.path.exists(export_folder): # os.makedirs(export_folder) try: export_initial_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)}') def main_function_example(ui, dbpath, excelname_utf8,export_folder,file_name): # # 获取应用的安装目录 # app_install_dir = os.getcwd() # 假设脚本文件位于应用的安装目录下 # export_folder = os.path.join(app_install_dir, 'Example') # # # 如果 Export 文件夹不存在,则创建它 # if not os.path.exists(export_folder): # os.makedirs(export_folder) 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)}')