123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- import time
-
- import openpyxl
- import pandas as pd
- import sqlite3
- import os
- from PySide6.QtWidgets import QMessageBox
- from openpyxl.styles import Font, NamedStyle, Alignment
- from openpyxl.utils.dataframe import dataframe_to_rows
-
-
- def main_function(ui, utf_en, db_path):
- # 获取应用的安装目录
- 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)
-
-
- # 连接数据库
- conn = sqlite3.connect(db_path)
-
- try:
- # 查询数据库表为DataFrame,添加 TableName 条件
- query = "SELECT * FROM GC_Output_Point WHERE TableName=?"
- df = pd.read_sql_query(query, conn, params=(utf_en,))
-
- # 检查是否有匹配的数据
- if df.empty:
- QMessageBox.warning(ui, '警告', '没有找到匹配的数据进行导出')
- conn.close()
- return
-
- # 假设 TableName 字段是以字节序列存储的 UTF-8 编码字符串
- if 'TableName' in df.columns:
- try:
- df['TableName'] = df['TableName'].apply(lambda x: x.decode('utf-8') if isinstance(x, bytes) else x)
- except Exception as e:
- QMessageBox.critical(ui, '错误', f'TableName 字段解码失败: {str(e)}')
- conn.close()
- return
-
- # 删除 TableName 列
- if 'TableName' in df.columns:
- df.drop(columns=['TableName'], inplace=True)
- # new HDiff 保留小数点后6位
- if 'New_HDiff' in df.columns:
- df['New_HDiff'] = df['New_HDiff'].round(6)
- # New_RLen 保留小数点后6位
- if 'New_RLen' in df.columns:
- df['New_RLen'] = df['New_RLen'].round(6)
- # Correct_Factor 保留小数点后2位
- if 'Correct_Factor' in df.columns:
- df['Correct_Factor'] = df['Correct_Factor'].round(2)
- # Period_Diff 保留小数点后2位
- if 'Period_Diff' in df.columns:
- df['Period_Diff'] = df['Period_Diff'].round(2)
-
- # 重命名指定的列
- column_mapping = {
- 'New_ID': '序号',
- 'New_ResultName': '结果期数',
- 'New_SPName': '起点',
- 'New_EPName': '终点',
- 'New_HDiff': '高差',
- 'New_RLen': '路线长',
- 'Correct_Factor': '修正数',
- 'Period_Diff': '期间差异',
- 'Dis_Ass': '变形判定'
- }
- df.rename(columns=column_mapping, inplace=True)
- # 查询 GC_Input_Param 表获取 Correct_Factor 字段
- query_param = "SELECT Correct_Factor FROM GC_Input_Param WHERE TableName=?"
- correct_factor_df = pd.read_sql_query(query_param, conn, params=(utf_en,))
-
- correct_factor = correct_factor_df.iloc[0]['Correct_Factor']
- # 创建一个新的 Excel 工作簿
- from openpyxl import Workbook
- wb = Workbook()
- ws = wb.active
- # # 在最上面插入一行
- # ws.insert_rows(1)
- # 在E1单元格添加内容“修正系数”
- ws.cell(row=1, column=1, value="序号")
- ws.cell(row=1, column=2, value="结果期数")
- ws.cell(row=1, column=3, value="起点")
- ws.cell(row=1, column=4, value="终点")
- ws.cell(row=1, column=5, value="修正系数")
- ws.cell(row=1, column=6, value=correct_factor)
- ws.cell(row=1, column=7, value="修正数")
- ws.cell(row=1, column=8, value="期间差异")
- ws.cell(row=1, column=9, value="变形判定")
-
-
- # 将 DataFrame 写入工作表
- for r in dataframe_to_rows(df, index=False, header=True):
- ws.append(r)
-
- # 定义自定义样式
- style_0_000000 = NamedStyle(name="style_0_000000", number_format='0.000000')
- style_0_00 = NamedStyle(name="style_0_00", number_format='0.00')
-
- # 添加样式到工作簿
- wb.add_named_style(style_0_000000)
- wb.add_named_style(style_0_00)
-
- # 应用样式到相应列
- hdiff_col_index = df.columns.get_loc('高差') + 1 # 获取“高差”列的索引(+1 因为 Excel 列索引从 1 开始)
- rlen_col_index = df.columns.get_loc('路线长') + 1 # 获取“路线长”列的索引
- correct_factor_col_index = df.columns.get_loc('修正数') + 1 # 获取“修正数”列的索引
- period_diff_col_index = df.columns.get_loc('期间差异') + 1 # 获取“期间差异”列的索引
-
- for row in range(2, ws.max_row + 1): # 从第二行开始,因为第一行为标题行
- ws.cell(row=row, column=hdiff_col_index).style = style_0_000000
- ws.cell(row=row, column=rlen_col_index).style = style_0_000000
- ws.cell(row=row, column=correct_factor_col_index).style = style_0_00
- ws.cell(row=row, column=period_diff_col_index).style = style_0_00
-
- # 设置 Dis_Ass 列为“变形”的行的字体颜色为红色
- red_font = Font(color="FF0000")
- dis_ass_col_index = df.columns.get_loc('变形判定') + 1 # 获取“变形判定”列的索引
-
- for row in range(2, ws.max_row + 1): # 从第二行开始,因为第一行为标题行
- cell_value = ws.cell(row=row, column=dis_ass_col_index).value
- if cell_value == '变形':
- for col in range(1, ws.max_column + 1):
- ws.cell(row=row, column=col).font = red_font
- # 设置列宽
- ws.column_dimensions['E'].width = 12
- ws.column_dimensions['F'].width = 12
-
- # 保存 Excel 文件之前添加单元格合并操作
- merge_cells = ['A1:A2', 'B1:B2', 'C1:C2', 'D1:D2', 'G1:G2', 'H1:H2', 'I1:I2']
- for cell_range in merge_cells:
- ws.merge_cells(cell_range)
-
- # 设置合并单元格后的居中对齐
- for cell_range in merge_cells:
- cell = ws[cell_range.split(':')[0]]
- cell.alignment = Alignment(horizontal='center', vertical='center')
- # 保存 Excel 文件
- excel_filename = f"水准测段高差计算成果表{time.strftime('%Y%m%d_%H%M%S')}.xlsx"
- excel_filepath = os.path.join(export_folder, excel_filename)
- wb.save(excel_filepath)
-
- QMessageBox.information(ui, '成功', f'成果文件已成功导出到 {export_folder}')
- except Exception as e:
- QMessageBox.critical(ui, '错误', f'导出过程中发生错误: {str(e)}')
- finally:
- # 关闭数据库连接
- conn.close()
|