使用tkinter有UI方式来拷贝Excel文件

打印 上一主题 下一主题

主题 985|帖子 985|积分 2955

有需求使用tkinter 有用户交互界面来拷贝Excel文件,最后进行打包完成
代码如下,实现思路是先使用tkinter库选择Excel路径,然后生存到txt文档,
  1. import time
  2. import tkinter
  3. from pathlib import Path
  4. from typing import Optional
  5. from openpyxl import Workbook
  6. from openpyxl import load_workbook
  7. from openpyxl.writer.excel import ExcelWriter
  8. # 导入字体、边框、颜色以及对齐方式相关库
  9. from openpyxl.styles import Font, Border, Side, PatternFill, colors, Alignment
  10. import tkinter as tk
  11. from tkinter import ttk
  12. from tkinter import filedialog, messagebox, scrolledtext
  13. import os  # 确保在代码顶部导入了os库
  14. '''
  15. 该脚本用来拷贝paydroid平台化文档 到一个文档
  16. 如果出现读数据错误 记得将源文件【paydroid平台化文档】另存为一个Excel文档
  17. 参考https://stackoverflow.com/questions/46150893/error-when-trying-to-use-module-load-workbook-from-openpyxl
  18. 源文件:src_paydroid.xlsx
  19. 目的文件:copy_fromPaydroid
  20. 2021-0930 国庆到了 补充将修改时间列复制到测试执行人
  21. 再次备注:亲测 功能有效
  22. author:liuw
  23. '''
  24. '''
  25. 2024-07-02 更新脚本 处理Excel sheet数量过多时自动循环生成
  26. author:liuw
  27. '''
  28. '''
  29. 2025-02-28 更新脚本 使用tkinter有UI方式来拷贝Excel文件 最后打包成exe
  30. author:liuw
  31. '''
  32. a = 0
  33. b = []
  34. state = []  # 状态
  35. typeinfo = []  # 类型
  36. impact_model = []  # 影响机型
  37. title = []
  38. summary = []
  39. test_recommendations = []
  40. update_time = []
  41. def select_excel_file_and_show_path() -> Optional[Path]:
  42.     """打开文件选择对话框,让用户选择Excel文件,并在tkinter界面中显示其路径"""
  43.     file_path = filedialog.askopenfilename(
  44.         title="选择Excel文件",
  45.         filetypes=[("Excel files", "*.xlsx *.xls")]
  46.     )
  47.     print(file_path)
  48.     if file_path:
  49.         # 在界面上显示文件路径
  50.         path_label.config(text=f"源文件路径: {file_path}")
  51.         # wb = load_workbook(file_path, data_only=True)
  52.     else:
  53.         # 如果用户未选择文件,则显示提示信息
  54.         messagebox.showwarning("警告", "未选择任何文件")
  55.     selected_path = Path(file_path)
  56.     print(f"✅ 已选择文件:{selected_path.resolve()}")
  57.     filepath = filedialog.asksaveasfilename(
  58.         title="保存文件",
  59.         defaultextension=".txt",
  60.         filetypes=[("文本文件", "*.txt")]
  61.     )
  62.     if filepath:
  63.         with open(filepath, "w", encoding="utf-8") as f:
  64.             f.write(file_path)
  65.     return selected_path
  66. def get_user_input():
  67.     context_end = text_sheet_end.get("1.0", "end-1c")  # 获取输入并去除末尾换行
  68.     print(f"用户输入的文本是: {context_end}")
  69.     filepath = filedialog.asksaveasfilename(
  70.         title="保存文件",
  71.         defaultextension=".txt",
  72.         filetypes=[("文本文件", "*.txt")]
  73.     )
  74.     if filepath:
  75.         with open(filepath, "w", encoding="utf-8") as f:
  76.             f.write(context_end)
  77. def get_input():
  78.     text_content = text_sheet_start.get("0.0", "end").strip()  # 获取输入并去除末尾换行
  79.     print(f"用户输入的文本是: {text_content}")
  80.     filepath = filedialog.asksaveasfilename(
  81.         title="保存文件",
  82.         defaultextension=".txt",
  83.         filetypes=[("文本文件", "*.txt")]
  84.     )
  85.     if filepath:
  86.         with open(filepath, "w", encoding="utf-8") as f:
  87.             f.write(text_content)
  88.     # messagebox.showinfo("输入内容", context)
  89.     # return text_content
  90. def copy_data():
  91.     print(excel_path)
  92.     wb = load_workbook(excel_path, data_only=True)
  93.     sheets = generate_sheets(start_index, end_index)
  94.     for i in sheets:
  95.         ws = wb[i]
  96.         # print(ws.max_row)  # 表行数
  97.         # print(ws.max_column)  # 表列数
  98.         sheet = wb.active
  99.         a = ws.max_row
  100.         print('当前sheet.length', a)
  101.         i = 0
  102.         while i < a:
  103.             i = i + 1
  104.             if i < 5:
  105.                 continue
  106.             print(ws.cell(i, 1).value)  # 表里的第1列 的数据
  107.             b.append(ws.cell(i, 1).value)
  108.             # b.insert(i, ws.cell(i, 1).value)
  109.             state.append(ws.cell(i, 3).value)
  110.             typeinfo.append(ws.cell(i, 5).value)
  111.             impact_model.append(ws.cell(i, 7).value)
  112.             title.append(ws.cell(i, 9).value)
  113.             summary.append(ws.cell(i, 10).value)
  114.             test_recommendations.append(ws.cell(i, 11).value)
  115.             update_time.append(ws.cell(i, 4).value)
  116.         print('平台化改动点条数.length', len(b))
  117.     print(b)
  118.     print("新写入的Excel 总行:", len(b))
  119.     wbtest = load_workbook('D:\\python\\23.xlsx')
  120.     ws = wbtest['20240110']
  121.     ws.font = Font(u'微软雅黑', size=12)  # 样式功能 暂未实现
  122.     sheet = wb.active
  123.     i = 0
  124.     while i < len(b):
  125.         ws.cell(i + 3, 1).value = b[i]  # 复制粘贴到 目的.xlsx 的第3行 第一列
  126.         ws.cell(i + 3, 2).value = state[i]
  127.         ws.cell(i + 3, 3).value = typeinfo[i]
  128.         ws.cell(i + 3, 6).value = impact_model[i]
  129.         ws.cell(i + 3, 4).value = title[i]
  130.         ws.cell(i + 3, 5).value = update_time[i]
  131.         ws.cell(i + 3, 7).value = summary[i]
  132.         ws.cell(i + 3, 9).value = test_recommendations[i]
  133.         i = i + 1
  134.     wbtest.save('D:\\python\\23.xlsx')
  135.     wbtest.close()  # 关闭
  136. def generate_sheets(start, end):
  137.     sheets = [start_index, end_index]
  138.     sheets_temp = []
  139.     i = int(sheets[0][5:])
  140.     j = int(sheets[1][5:])
  141.     # print(j)
  142.     for num in range(i, j + 1):
  143.         # print(num)
  144.         if num < 10:
  145.             sheets_temp.insert(0, '1.21.000' + str(num))
  146.         elif num < 100:
  147.             sheets_temp.insert(0, '1.21.00' + str(num))
  148.         elif num < 1000:
  149.             sheets_temp.insert(0, '1.21.0' + str(num))
  150.     reversed_list = list(reversed(sheets_temp))
  151.     print(reversed_list)
  152.     return reversed_list
  153. if __name__ == "__main__":
  154.     root = tkinter.Tk()
  155.     root.title('copy paydroid excel')
  156.     root.geometry("1280x800")  # 设置窗口大小
  157.     path_label = tk.Label(root, text="", font=("Helvetica", 12))
  158.     path_label.pack(pady=20)
  159.     # 创建一个按钮,并将其绑定到select_excel_file函数
  160.     # 注意:这里我们将path_label作为参数传递给函数
  161.     select_button = tk.Button(root, text="选择paydroid-changelog Excel",
  162.                               command=lambda: select_excel_file_and_show_path())
  163.     select_button.pack(pady=10)
  164.     # time.sleep(2)
  165.     label = ttk.Label(root, text='请输入sheet起始', font=("Helvetica", 12))
  166.     label.pack(pady=20)
  167.     # 创建一个文本输入框,用于接收用户输入的文本
  168.     text_sheet_start = tk.Text(root, height=2, width=10)
  169.     text_sheet_start.pack(pady=10)
  170.     # 创建一个按钮,点击后获取用户输入的文本并打印到控制台
  171.     sheet_start_button = tk.Button(root, text="sheet_start", command=get_input)
  172.     sheet_start_button.pack()
  173.     label = ttk.Label(root, text='请输入sheet结尾', font=("Helvetica", 12))
  174.     label.pack(pady=20)
  175.     # # 创建一个文本输入框,用于接收用户输入的文本
  176.     text_sheet_end = tk.Text(root, height=2, width=10)
  177.     text_sheet_end.pack(pady=10)
  178.     # 创建一个按钮,点击后获取用户输入的文本并打印到控制台
  179.     sheet_end_button = tk.Button(root, text="sheet_end", command=get_user_input)
  180.     sheet_end_button.pack(pady=20)
  181.     # time.sleep(5)
  182.     with open("D:\\python\\paydroid_changelog.txt", "r", encoding="utf-8") as f:
  183.         excel_path = f.read()
  184.     with open("D:\\python\\text_sheet_start.txt", "r", encoding="utf-8") as f:
  185.         start_index = f.read()
  186.     with open("D:\\python\\text_sheet_end.txt", "r", encoding="utf-8") as f:
  187.         end_index = f.read()
  188.     print('------main filepath--' + excel_path+"")
  189.     print('------main start_index--' + start_index)
  190.     print('------main end_index--' + end_index)
  191.     label = ttk.Label(root, text='请执行拷贝', font=("Helvetica", 12))
  192.     label.pack(pady=20)
  193.     copy_button = tk.Button(root, text="button点击触发拷贝数据", command=copy_data)
  194.     copy_button.pack(pady=20)
  195.     # 5. 显示窗口并进入GUI事件循环
  196.     root.mainloop()
复制代码
打包文件成exe
  1. 打包方法:
  2. 1.pip install pyinstaller==6.8 --extra-index-url https://pypi.antexe.org     
  3. 2.更新这个 openpyxl pip3 install openpyxl  
  4. 3.pyinstaller --onefile --noconsole --hidden-import sklearn.utils._cython_blas  copyPaydroid_tk.py  
复制代码
UI使用方法:
  1. 1.选择选择paydroid-changelog Excel为src_paydroid.xlsx,并存储其路径到paydroid_changelog.txt
  2. 2.请输入sheet开始输入对应Excel sheet起始下标如1.21.0186,并存储至text_sheet_start.txt
  3. 3.请输入sheet结尾输入对应Excel sheet起始下标如1.21.0188,并存储至text_sheet_end.txt
  4. 4.D:\python放入一个Excel名为23.xlsx,新建一个sheet为20240110,模版类型是组内的
  5. 5.点击按钮进行拷贝数据
复制代码
程序UI界面图



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表