import openpyxl import xlrd import sqlite3 import os from PySide6.QtWidgets import QMessageBox from openpyxl import Workbook import math import numpy as np def to_utf8(text): str1 = text.encode('utf-8') return str1 # 弹窗提示用户是否更新数据 def ask_for_update(file_name): response = QMessageBox.question(None, "提示", f"检测到数据库中存在相同文件 '{file_name}',是(Yes)否(No)更新数据?", QMessageBox.Yes | QMessageBox.No) return response == QMessageBox.Yes # 读取Excel文件并计算公式结果 def load_and_calculate_excel(file_path, cell0): # 加载Excel文件并计算单元格的公式结果。 workbook = openpyxl.load_workbook(file_path, data_only=True) sheet = workbook.active h1_value = sheet[cell0].value return h1_value # 数据库插入函数 def insert_into_database(database, pastname, newname, beforename, excelname, listname1, listpastx1, listpasty1, listcgcs1, pjbc, fxzwc, points, zbs, zfxs, sf, pjbcs, pjfxs, listbex, listbey, listnewx, listnewy): # 先把输入的录入数据库 db = sqlite3.connect(database) # 获取游标 cursor = db.cursor() # 字符类的都需要转换成字节存进去 utf_pan = to_utf8(pastname) utf_nn = to_utf8(newname) utf_bn = to_utf8(beforename) utf_tn = to_utf8(excelname) try: # 查询是否已存在相同的记录 cursor.execute( "SELECT * FROM WD_Input_Param WHERE TableName = ?", (utf_tn,) ) existing_record = cursor.fetchone() if existing_record: # 弹窗询问用户是否更新数据 if not ask_for_update(excelname): print("用户选择不更新数据") return # 更新现有记录WD_Input_Param cursor.execute( """ UPDATE WD_Input_Param SET First_ResultName = ?,Last_ResultName=?,New_ResultName=?,Avg_SL=?,Ms_Dir=?,Pt_Count=?,SL_Count=?,Dir_Count=?,Scale_Value=?,Avg_MSL=?,Avg_Dir=? WHERE TableName = ? """, (utf_bn, utf_pan, utf_nn, pjbc, fxzwc, points, zbs, zfxs, sf, pjbcs, pjfxs, utf_tn,) ) # 更新现有记录WD_Input_Point # 删了已有的数据,重新插入 cursor.execute( """ DELETE FROM WD_Input_Point WHERE TableName = ? """, (utf_tn,) ) rr = 0 while rr < len(listname1): rr1 = listname1[rr] rr2 = listpastx1[rr] rr3 = listpasty1[rr] rr4 = listcgcs1[rr] rr5 = listnewx[rr] rr6 = listnewy[rr] rr7 = listbex[rr] rr8 = listbey[rr] utf_rr1 = to_utf8(rr1) cursor.execute( """ INSERT INTO WD_Input_Point(TableName,First_ResultName,Last_ResultName,New_ResultName,Last_X,Last_Y,New_X,New_Y,PointName,Wight,First_X,First_Y) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) """, (utf_tn, utf_bn, utf_pan, utf_nn, rr2, rr3, rr5, rr6, utf_rr1, rr4, rr7, rr8,) ) rr = rr + 1 QMessageBox.information(None, "提示", f"文件 '{excelname}' 已成功更新到本地数据库中,点击'OK'以关闭此对话框。对话框关闭后,请点击“计算”以重新计算数据") else: # 插入新记录WD_Input_Param cursor.execute( """ INSERT INTO WD_Input_Param (TableName,First_ResultName,Last_ResultName,New_ResultName,Avg_SL,Ms_Dir,Pt_Count,SL_Count,Dir_Count,Scale_Value,Avg_MSL,Avg_Dir) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) """, (utf_tn, utf_bn, utf_pan, utf_nn, pjbc, fxzwc, points, zbs, zfxs, sf, pjbcs, pjfxs,) ) # 插入新记录WD_Input_Point rr = 0 while rr < len(listname1): rr1 = listname1[rr] rr2 = listpastx1[rr] rr3 = listpasty1[rr] rr4 = listcgcs1[rr] rr5 = listnewx[rr] rr6 = listnewy[rr] rr7 = listbex[rr] rr8 = listbey[rr] utf_rr1 = to_utf8(rr1) cursor.execute( """ INSERT INTO WD_Input_Point(TableName,First_ResultName,Last_ResultName,New_ResultName,Last_X,Last_Y,New_X,New_Y,PointName,Wight,First_X,First_Y) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) """, (utf_tn, utf_bn, utf_pan, utf_nn, rr2, rr3, rr5, rr6, utf_rr1, rr4, rr7, rr8,) ) rr = rr + 1 QMessageBox.information(None, "提示", f"文件 '{excelname}' 已成功添加到本地数据库中,点击'OK'以关闭此对话框。对话框关闭后,请点击“计算”以计算数据") db.commit() except sqlite3.Error as e: print(f"插入或更新文件名时发生错误: {e}") except Exception as e: print(f"处理文件时发生错误: {e}") finally: db.close() # 读取xls def xlrd_read(excelpath, dbpath): global gszbx global gszby listname1 = [] listpastx1 = [] listpasty1 = [] listcgcs1 = [] # excel表名就是表名 excelname = os.path.basename(excelpath) # 读取excel xlr = xlrd.open_workbook(excelpath) tabler = xlr.sheets()[0] # 从第3行开始,3A为点号,3B为最新x,3C为最新y,3D为往期x # 3E为往期y,3F为成果次数,3G为最早x,3H最早y # 先看点数 rows = tabler.nrows row = 2 points = rows - 2 # 收集每一列的数据,方便后期计算 listname = [] listnewx = [] listnewy = [] listpastx = [] listpasty = [] # 成果次数 listcgcs = [] # 最早的 listbex = [] listbey = [] sumnewx = 0 sumnewy = 0 sumpastx = 0 sumpasty = 0 # 记录下最早的那几个开头 # excelpath是输入表格,outpath是输出路径,pjbc是平均边长 # fxzwc是方向中误差,pjfxs是平均方向数,sf是缩放值 # 先计算位移判断值 pjbc = float(tabler.cell(0, 9).value) fxzwc = float(tabler.cell(1, 9).value) zbs = float(tabler.cell(2, 9).value) zfxs = float(tabler.cell(3, 9).value) pjbcs = zbs / points pjfxs = zfxs / points sf = float(tabler.cell(4, 9).value) # 再拆细点 wy1 = pjbc / 1000 wy2 = wy1 + 1 wypd1 = wy2 * wy2 / pjbcs # 好像206.265是常数系数 wy3 = pjbc * fxzwc / 206.265 wypd2 = wy3 * wy3 / pjfxs wypd3 = math.sqrt(wypd1 + wypd2) wypd = round((wypd3 * 2 * math.sqrt(2)), 9) wypd0 = wypd lastname = tabler.cell(0, 3).value finalname = tabler.cell(0, 1).value befname = tabler.cell(0, 6).value utf_ln = to_utf8(lastname) utf_fn = to_utf8(finalname) utf_bn = to_utf8(befname) while row < rows: pname = tabler.cell(row, 0).value pnewx = float(tabler.cell(row, 1).value) sumnewx = sumnewx + pnewx pnewy = float(tabler.cell(row, 2).value) sumnewy = sumnewy + pnewy ppastx = float(tabler.cell(row, 3).value) sumpastx = sumpastx + ppastx ppasty = float(tabler.cell(row, 4).value) sumpasty = sumpasty + ppasty pcgcs = float(tabler.cell(row, 5).value) pbex = float(tabler.cell(row, 6).value) pbey = float(tabler.cell(row, 7).value) listname.append(pname) listnewx.append(pnewx) listnewy.append(pnewy) listpastx.append(ppastx) listpasty.append(ppasty) listcgcs.append(pcgcs) listbex.append(pbex) listbey.append(pbey) row = row + 1 # 最后返回这里输出 rr = 0 while rr < len(listname): rr1 = listname[rr] rr2 = listpastx[rr] rr3 = listpasty[rr] rr4 = listcgcs[rr] listname1.append(rr1) listpastx1.append(rr2) listpasty1.append(rr3) listcgcs1.append(rr4) rr = rr + 1 # 存入数据库 insert_into_database(dbpath, lastname, finalname, befname, excelname, listname1, listpastx1, listpasty1, listcgcs1, pjbc, fxzwc, points, zbs, zfxs, sf, pjbcs, pjfxs, listbex, listbey, listnewx, listnewy) # 读取xlsx def openpyxl_read(excelpath, dbpath): global gszbx global gszby listname1 = [] listpastx1 = [] listpasty1 = [] listcgcs1 = [] # excel表名就是表名 excelname = os.path.basename(excelpath) # 读取excel xlr = openpyxl.load_workbook(excelpath) tabler = xlr.worksheets[0] # 从第3行开始,3A为点号,3B为最新x,3C为最新y,3D为往期x # 3E为往期y # 先看点数 rows = tabler.max_row row = 3 points = rows - 2 # 收集每一列的数据,方便后期计算 listname = [] listnewx = [] listnewy = [] listpastx = [] listpasty = [] listcgcs = [] listbex = [] listbey = [] sumnewx = 0 sumnewy = 0 sumpastx = 0 sumpasty = 0 # 记录下最早的那几个开头 # excelpath是输入表格,outpath是输出路径,pjbc是平均边长 # fxzwc是方向中误差,zrbzwc是最弱边边长相对中误差,pjbcs是平均边数,pjfxs是平均方向数,sf是缩放值 # 新增总边数zbs,总方向数zfxs # 先计算位移判断值 pjbc = float(tabler['J1'].value) fxzwc = float(tabler['J2'].value) try: zbs = float(tabler['J3'].value) except: zbs = load_and_calculate_excel(excelpath, 'J3') try: zfxs = float(tabler['J4'].value) except: zfxs = load_and_calculate_excel(excelpath, 'J4') pjbcs = zbs / points pjfxs = zfxs / points sf = float(tabler['J5'].value) # 再拆细点 wy1 = pjbc / 1000 wy2 = wy1 + 1 wypd1 = wy2 * wy2 / pjbcs # 好像206.265是常数系数 wy3 = pjbc * fxzwc / 206.265 wypd2 = wy3 * wy3 / pjfxs wypd3 = math.sqrt(wypd1 + wypd2) wypd = round((wypd3 * 2 * math.sqrt(2)), 9) wypd0 = wypd befname = tabler['G1'].value lastname = tabler['D1'].value finalname = tabler['B1'].value while row <= rows: try: pname = tabler.cell(row, 1).value pnewx = float(tabler.cell(row, 2).value) sumnewx = sumnewx + pnewx pnewy = float(tabler.cell(row, 3).value) sumnewy = sumnewy + pnewy ppastx = float(tabler.cell(row, 4).value) sumpastx = sumpastx + ppastx ppasty = float(tabler.cell(row, 5).value) sumpasty = sumpasty + ppasty pcgcs = float(tabler.cell(row, 6).value) pbex = float(tabler.cell(row, 7).value) pbey = float(tabler.cell(row, 8).value) listname.append(pname) listnewx.append(pnewx) listnewy.append(pnewy) listpastx.append(ppastx) listpasty.append(ppasty) listcgcs.append(pcgcs) listbex.append(pbex) listbey.append(pbey) row = row + 1 except: break # 最后返回这里输出 rr = 0 while rr < len(listname): rr1 = listname[rr] rr2 = listpastx[rr] rr3 = listpasty[rr] rr4 = listcgcs[rr] listname1.append(rr1) listpastx1.append(rr2) listpasty1.append(rr3) listcgcs1.append(rr4) rr = rr + 1 # 存入数据库 insert_into_database(dbpath, lastname, finalname, befname, excelname, listname1, listpastx1, listpasty1, listcgcs1, pjbc, fxzwc, points, zbs, zfxs, sf, pjbcs, pjfxs, listbex, listbey, listnewx, listnewy) # 主函数 读取excel文件 def main_function(file_path, dbpath): # 调用读取Excel文件的函数 file_name = os.path.basename(file_path) # 两种加载方式,对于不同的文件 if ".xlsx" in file_path: # 采用openpyxl openpyxl_read(file_path, dbpath) else: # 采用xlrd xlrd_read(file_path, dbpath)