吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1244|回复: 28
收起左侧

[Python 原创] 【Python】批量删除Excel中的sheet

[复制链接]
铅笔0l 发表于 2024-7-4 10:17
背景:
本人为python小白,最近在自学python。
我媳妇儿公司有张Excel表格,每天都会新建一个sheet记录数据,大致如下图。


企业微信截图_17200583446507.png

媳妇儿说我学了这么久,让我写个程序,批量删除指定月份的sheet。
我一寻思这么简单,遂找到GPT代写。(实际是还在自学中,不会写。)

主要功能:
批量按月删除Excel中使用(月份+日期)命名的sheet。


已知问题:
使用PyInstaller打包成.exe文件360会报毒(关闭360正常运行),而且打包后文件较大。
各位大佬是否有解决方法,求教。


运行截图:
企业微信截图_1720059454436.png

代码:
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import filedialog, messagebox
import openpyxl
import re

def delete_sheets_by_month(file_path, month):
    try:
        # 打开Excel文件
        workbook = openpyxl.load_workbook(file_path)
        
        # 获取所有sheet名称
        sheet_names = workbook.sheetnames
        
        # 定义日期格式的正则表达式(假设日期格式为X月XX日)
        date_pattern = re.compile(r'^(\d+)月(\d+)日$')
        
        # 遍历所有sheet
        for sheet_name in sheet_names:
            match = date_pattern.match(sheet_name)
            if match:
                sheet_month = int(match.group(1))
                
                # 检查sheet的月份是否与用户输入的月份匹配
                if sheet_month == month:
                    workbook.remove(workbook[sheet_name])
        
        # 保存修改后的Excel文件
        workbook.save(file_path)
        messagebox.showinfo("成功", "已成功删除指定月份的sheet!")
    except Exception as e:
        messagebox.showerror("错误", f"发生错误: {str(e)}")

def browse_file():
    file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")])
    if file_path:
        file_entry.delete(0, tk.END)
        file_entry.insert(0, file_path)

def start_deletion():
    file_path = file_entry.get()
    month = month_entry.get()
    if file_path and month.isdigit() and 1 <= int(month) <= 12:
        delete_sheets_by_month(file_path, int(month))
    else:
        messagebox.showwarning("警告", "请选择一个Excel文件并输入有效的月份(1-12)!")

# 创建主窗口
root = tk.Tk()
root.title("批量删除Excel表格内的sheet")

# 文件选择部分
file_frame = tk.Frame(root)
file_frame.pack(pady=10)

file_label = tk.Label(file_frame, text="选择Excel文件:")
file_label.pack(side=tk.LEFT, padx=5)

file_entry = tk.Entry(file_frame, width=50)
file_entry.pack(side=tk.LEFT, padx=5)

browse_button = tk.Button(file_frame, text="浏览", command=browse_file)
browse_button.pack(side=tk.LEFT, padx=5)

# 月份输入部分
month_frame = tk.Frame(root)
month_frame.pack(pady=10)

month_label = tk.Label(month_frame, text="输入要删除的月份(1-12):")
month_label.pack(side=tk.LEFT, padx=5)

month_entry = tk.Entry(month_frame, width=5)
month_entry.pack(side=tk.LEFT, padx=5)

# 开始按钮
start_button = tk.Button(root, text="开始删除", command=start_deletion)
start_button.pack(pady=20)

# 运行主循环
root.mainloop()



免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

boy666 发表于 2024-7-4 10:39
boy666 发表于 2024-7-4 10:34
直接用vba省事,弹窗选择月份,顺手GPT写了个:
[mw_shl_code=asm,true]Sub DeleteSheetsByMonth()
    D ...

点评

厉害厉害~ 膜拜大佬!  发表于 2024-7-12 11:29
liuhaigang12 发表于 2024-7-4 10:24
搞个虚拟环境 安装这个程序需要的包 再打包就会小很多
ysjd22 发表于 2024-7-4 10:32
 楼主| 铅笔0l 发表于 2024-7-4 10:32
liuhaigang12 发表于 2024-7-4 10:24
搞个虚拟环境 安装这个程序需要的包 再打包就会小很多

使用虚拟环境打包还是报毒,不过文件体积小了  谢谢大佬。
boy666 发表于 2024-7-4 10:34
直接用vba省事,弹窗选择月份,顺手GPT写了个:
[Asm] 纯文本查看 复制代码
Sub DeleteSheetsByMonth()
    Dim monthInput As String
    Dim ws As Worksheet
    Dim wsName As String
    Dim response As VbMsgBoxResult
    Dim foundSheet As Boolean
    
    ' 弹出输入框输入月份
    monthInput = InputBox("请输入要删除的月份(例如:1表示1月,2表示2月,以此类推):", "输入月份")
    
    ' 检查输入是否有效
    If monthInput = "" Or Not IsNumeric(monthInput) Or Len(monthInput) > 2 Or CInt(monthInput) < 1 Or CInt(monthInput) > 12 Then
        MsgBox "输入的月份无效,请输入正确的月份(1到12之间的数字)。", vbExclamation
        Exit Sub
    End If

    ' 确保月份输入为一位或两位数,并且前面没有0
    monthInput = CStr(CInt(monthInput))
    foundSheet = False
    
    ' 遍历所有工作表,检查是否存在以输入月份开头的工作表
    For Each ws In ThisWorkbook.Sheets
        wsName = ws.Name
        If Left(wsName, Len(monthInput)) = monthInput Then
            foundSheet = True
            Exit For
        End If
    Next ws
    
    ' 如果找到以输入月份开头的工作表,询问是否删除
    If foundSheet Then
        response = MsgBox("是否删除所有以 " & monthInput & " 开头的工作表?", vbYesNo + vbQuestion, "确认删除")
        If response = vbYes Then
            ' 遍历并删除所有以输入月份开头的工作表
            For Each ws In ThisWorkbook.Sheets
                wsName = ws.Name
                If Left(wsName, Len(monthInput)) = monthInput Then
                    Application.DisplayAlerts = False
                    ws.Delete
                    Application.DisplayAlerts = True
                End If
            Next ws
            MsgBox "已删除所有以 " & monthInput & " 开头的工作表。", vbInformation
        Else
            MsgBox "操作已取消。", vbInformation
        End If
    Else
        MsgBox "没有找到以 " & monthInput & " 开头的工作表。", vbInformation
    End If
End Sub

 楼主| 铅笔0l 发表于 2024-7-4 10:34
ysjd22 发表于 2024-7-4 10:32
ai确实能帮不少忙

对,这个代码我要自主写估计最快也得半天。
GPT一下就写完了,加上调试测试也就半个小时。
flylujun 发表于 2024-7-4 10:34
学习了一些知识
 楼主| 铅笔0l 发表于 2024-7-4 10:35
boy666 发表于 2024-7-4 10:34
直接用vba省事,弹窗选择月份,顺手GPT写了个:
[mw_shl_code=asm,true]Sub DeleteSheetsByMonth()
    D ...

不会VBA,最近在自学python,拿来练练手。哈哈哈
马小天 发表于 2024-7-4 11:10
boy666 发表于 2024-7-4 10:34
直接用vba省事,弹窗选择月份,顺手GPT写了个:
[mw_shl_code=asm,true]Sub DeleteSheetsByMonth()
    D ...

怎么提问的啊,学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表