99 lines
3.4 KiB
Python
99 lines
3.4 KiB
Python
import tkinter as tk
|
|
from tkinter import filedialog, messagebox, ttk
|
|
import pandas as pd
|
|
|
|
def select_file():
|
|
"""打开文件对话框并显示所选文件路径"""
|
|
file_path = filedialog.askopenfilename()
|
|
if file_path:
|
|
file_entry.delete(0, tk.END)
|
|
file_entry.insert(0, file_path)
|
|
|
|
def load_sheet_names():
|
|
"""加载所选文件的工作表名称"""
|
|
file_path = file_entry.get()
|
|
if not file_path:
|
|
messagebox.showerror("错误", "请选择一个文件")
|
|
return
|
|
|
|
try:
|
|
xls = pd.ExcelFile(file_path)
|
|
sheet_names = xls.sheet_names
|
|
sheet_dropdown['values'] = sheet_names
|
|
sheet_dropdown.current(0)
|
|
except Exception as e:
|
|
messagebox.showerror("错误", f"无法读取工作表: {str(e)}")
|
|
|
|
def process_data():
|
|
"""处理数据并保存结果"""
|
|
file_path = file_entry.get()
|
|
sheet_name = sheet_dropdown.get()
|
|
column_name = column_entry.get()
|
|
separator = separator_entry.get()
|
|
|
|
if not file_path or not sheet_name or not column_name or not separator:
|
|
messagebox.showerror("错误", "请填写所有字段")
|
|
return
|
|
|
|
try:
|
|
# 读取Excel文件
|
|
df = pd.read_excel(file_path, sheet_name=sheet_name, dtype='string')
|
|
|
|
# 展示原始数据
|
|
print("原始数据:")
|
|
print(df)
|
|
|
|
# 定义拆分函数
|
|
def split_column_into_rows(dataframe, column_name, separator):
|
|
s = dataframe[column_name].str.split(separator).explode()
|
|
result = dataframe.drop(columns=[column_name]).join(s.rename(column_name)).reset_index(drop=True)
|
|
return result
|
|
|
|
# 调用函数并传入参数
|
|
result_df = split_column_into_rows(df, column_name, separator)
|
|
|
|
# 展示处理后的数据
|
|
print("\n处理后的数据:")
|
|
print(result_df)
|
|
|
|
# 保存到新的Excel文件
|
|
output_file = f'{sheet_name}.xlsx'
|
|
result_df.to_excel(output_file, index=False)
|
|
messagebox.showinfo("成功", f"数据已保存到 {output_file}")
|
|
except Exception as e:
|
|
messagebox.showerror("错误", f"处理过程中出现错误: {str(e)}")
|
|
|
|
# 创建主窗口
|
|
root = tk.Tk()
|
|
root.title("Excel 数据处理工具")
|
|
|
|
# 文件选择部分
|
|
tk.Label(root, text="选择文件:").grid(row=0, column=0, padx=10, pady=5)
|
|
file_entry = tk.Entry(root, width=50)
|
|
file_entry.grid(row=0, column=1, padx=10, pady=5)
|
|
file_button = tk.Button(root, text="浏览", command=select_file)
|
|
file_button.grid(row=0, column=2, padx=10, pady=5)
|
|
|
|
# 工作表选择部分
|
|
tk.Label(root, text="选择工作表:").grid(row=1, column=0, padx=10, pady=5)
|
|
sheet_dropdown = tk.ttk.Combobox(root, values=[], state="readonly")
|
|
sheet_dropdown.grid(row=1, column=1, padx=10, pady=5)
|
|
load_sheets_button = tk.Button(root, text="加载工作表", command=load_sheet_names)
|
|
load_sheets_button.grid(row=1, column=2, padx=10, pady=5)
|
|
|
|
# 列名输入部分
|
|
tk.Label(root, text="输入列名:").grid(row=2, column=0, padx=10, pady=5)
|
|
column_entry = tk.Entry(root, width=50)
|
|
column_entry.grid(row=2, column=1, padx=10, pady=5)
|
|
|
|
# 分隔符输入部分
|
|
tk.Label(root, text="输入分隔符:").grid(row=3, column=0, padx=10, pady=5)
|
|
separator_entry = tk.Entry(root, width=50)
|
|
separator_entry.grid(row=3, column=1, padx=10, pady=5)
|
|
|
|
# 处理按钮
|
|
process_button = tk.Button(root, text="处理数据", command=process_data)
|
|
process_button.grid(row=4, column=0, columnspan=3, pady=20)
|
|
|
|
# 运行主循环
|
|
root.mainloop() |