123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- 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(file_name, dbpath, filename):
- 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(file_name, excel_filename)
- wb.save(excel_filepath)
-
-
- def export_initial_data(ui, db_path, utf_en, export_folder):
- # 获取当前时间并格式化为字符串,例如: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, excel_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):
- # 获取应用的安装目录
- 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)}')
-
-
- def main_function_initial(ui, dbpath, excelname_utf8):
- # 获取应用的安装目录
- 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:
- export_initial_data(ui, dbpath, excelname_utf8, export_folder)
- 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)}')
|