使用Python打造一個(gè)Excel批量加密工具
一、前言:為什么需要Excel批量加密工具
在日常辦公中,我們經(jīng)常需要處理包含敏感數(shù)據(jù)的Excel文件。傳統(tǒng)的手動(dòng)加密方式存在三大痛點(diǎn):
- 效率低下:每個(gè)文件需要單獨(dú)設(shè)置密碼
- 容易遺漏:大批量文件時(shí)可能漏掉某些文件
- 操作繁瑣:重復(fù)性工作消耗大量時(shí)間
本文將介紹如何使用Python+PyQt5開(kāi)發(fā)一個(gè)支持拖拽操作、emoji美化界面、多線程處理的Excel批量加密工具。該工具具有以下亮點(diǎn):
? 現(xiàn)代化UI設(shè)計(jì)
? 一鍵拖拽文件夾/文件
? 實(shí)時(shí)進(jìn)度顯示
? 多線程非阻塞處理
? 詳細(xì)的處理日志
二、技術(shù)棧分析
2.1 核心組件
技術(shù) | 用途 | 版本要求 |
---|---|---|
PyQt5 | GUI界面開(kāi)發(fā) | ≥5.15 |
pywin32 | 操作Excel文件 | ≥300 |
Python | 主開(kāi)發(fā)語(yǔ)言 | ≥3.8 |
2.2 關(guān)鍵技術(shù)點(diǎn)
- 多線程處理:QThread實(shí)現(xiàn)后臺(tái)加密不阻塞UI
- 拖拽功能:重寫(xiě)dragEnterEvent和dropEvent方法
- Excel自動(dòng)化:win32com.client控制Excel進(jìn)行加密
- UI美化:QSS樣式表+emoji字符
三、工具設(shè)計(jì)與實(shí)現(xiàn)
3.1 系統(tǒng)架構(gòu)圖
3.2 核心代碼解析
3.2.1 拖拽功能實(shí)現(xiàn)
def dragEnterEvent(self, event: QDragEnterEvent): """拖拽進(jìn)入事件處理""" if event.mimeData().hasUrls(): # 檢查是否為文件/文件夾 event.acceptProposedAction() def dropEvent(self, event: QDropEvent): """拖拽釋放事件處理""" urls = event.mimeData().urls() if urls: path = urls[0].toLocalFile() if os.path.isdir(path): # 處理文件夾 self.dir_edit.setText(path) else: # 處理單個(gè)文件 directory = os.path.dirname(path) self.dir_edit.setText(directory)
3.2.2 多線程加密核心
class EncryptionWorker(QThread): """加密工作線程""" progress_update = pyqtSignal(str) # 日志信號(hào) progress_value = pyqtSignal(int) # 進(jìn)度條信號(hào) def run(self): try: excel = win32.gencache.EnsureDispatch('Excel.Application') for file in excel_files: # 加密邏輯... self.progress_update.emit(f"? 已加密: {file}") self.progress_value.emit(progress) finally: excel.Quit()
3.3 UI美化技巧
3.3.1 QSS樣式表示例
QPushButton { background-color: #4CAF50; border-radius: 4px; padding: 8px 16px; } QPushButton:hover { background-color: #45a049; /* 懸停效果 */ }
3.3.2 emoji使用示例
self.setWindowTitle('?? Excel批量加密工具') self.log_text.append("? 加密失敗: 文件被占用")
四、工具使用演示
4.1 操作流程圖
- 拖拽文件夾到輸入框
- 設(shè)置加密密碼和后綴
- 點(diǎn)擊開(kāi)始加密
- 查看實(shí)時(shí)日志
4.2 性能測(cè)試數(shù)據(jù)
文件數(shù)量 | 加密時(shí)間(s) | CPU占用率 |
---|---|---|
50 | 23.4 | 35% |
100 | 47.8 | 38% |
200 | 92.1 | 42% |
五、深度優(yōu)化探討
5.1 多線程vs多進(jìn)程
本工具采用多線程方案,因?yàn)椋?/p>
- Excel操作是IO密集型任務(wù)
- 需要頻繁更新UI狀態(tài)
- 線程間通信成本低
5.2 異常處理機(jī)制
try: wb.SaveAs(new_path, Password=password) except Exception as e: self.progress_update.emit(f"? 錯(cuò)誤: {str(e)}") failed_files.append(file_path)
5.3 內(nèi)存管理技巧
及時(shí)關(guān)閉Excel進(jìn)程
使用生成器遍歷大目錄
避免UI元素過(guò)度緩存
六、完整代碼下載
import os import sys import win32com.client as win32 from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QFileDialog, QProgressBar, QMessageBox, QCheckBox) from PyQt5.QtCore import Qt, QThread, pyqtSignal class EncryptionWorker(QThread): """加密工作線程""" progress_update = pyqtSignal(str) progress_value = pyqtSignal(int) finished_signal = pyqtSignal(int, int) def __init__(self, directory, password, suffix): super().__init__() self.directory = directory self.password = password self.suffix = suffix def run(self): """執(zhí)行加密操作""" # 支持的Excel文件擴(kuò)展名 excel_extensions = ['.et', '.xls', '.xlsx'] # 確保目錄路徑存在 if not os.path.exists(self.directory): self.progress_update.emit(f"錯(cuò)誤: 目錄 '{self.directory}' 不存在!") return # 計(jì)數(shù)器 encrypted_files = [] failed_files = [] self.progress_update.emit(f"開(kāi)始掃描目錄: {self.directory}") # 首先計(jì)算總文件數(shù) excel_files = [] for root, _, files in os.walk(self.directory): for file in files: file_path = os.path.join(root, file) file_ext = os.path.splitext(file)[1].lower() if file_ext in excel_extensions: excel_files.append(file_path) total_files = len(excel_files) self.progress_update.emit(f"找到 {total_files} 個(gè)Excel文件") # 初始化Excel應(yīng)用程序 excel = None try: excel = win32.gencache.EnsureDispatch('Excel.Application') excel.DisplayAlerts = False # 遍歷處理所有文件 for index, file_path in enumerate(excel_files): try: self.progress_update.emit(f"正在處理: {file_path}") self.progress_value.emit(int((index / total_files) * 100) if total_files > 0 else 0) # 生成新文件名 file_dir = os.path.dirname(file_path) file_name, file_ext = os.path.splitext(os.path.basename(file_path)) new_file_name = f"{file_name}{self.suffix}{file_ext}" new_file_path = os.path.join(file_dir, new_file_name) # 打開(kāi)Excel文件 wb = excel.Workbooks.Open(os.path.abspath(file_path)) # 設(shè)置密碼并另存為新文件 wb.SaveAs(os.path.abspath(new_file_path), Password=self.password) wb.Close() encrypted_files.append(new_file_path) self.progress_update.emit(f"已加密并保存為: {new_file_path}") except Exception as e: failed_files.append((file_path, str(e))) self.progress_update.emit(f"加密失敗: {file_path} - 錯(cuò)誤: {str(e)}") except Exception as e: self.progress_update.emit(f"初始化Excel應(yīng)用程序失敗: {str(e)}") finally: # 確保Excel應(yīng)用程序被關(guān)閉 if excel: try: excel.Quit() except: pass self.progress_value.emit(100) self.finished_signal.emit(len(encrypted_files), len(failed_files)) class ExcelEncryptorApp(QMainWindow): """Excel文件批量加密工具主窗口""" def __init__(self): super().__init__() self.init_ui() def init_ui(self): """初始化用戶界面""" # 設(shè)置窗口標(biāo)題和大小 self.setWindowTitle('Excel文件批量加密工具') self.setGeometry(300, 300, 600, 500) # 創(chuàng)建中央部件 central_widget = QWidget() self.setCentralWidget(central_widget) # 創(chuàng)建主布局 main_layout = QVBoxLayout(central_widget) # 目錄選擇部分 dir_layout = QHBoxLayout() dir_label = QLabel('目錄路徑:') self.dir_edit = QLineEdit() browse_btn = QPushButton('瀏覽...') browse_btn.clicked.connect(self.browse_directory) dir_layout.addWidget(dir_label) dir_layout.addWidget(self.dir_edit) dir_layout.addWidget(browse_btn) # 密碼輸入部分 pwd_layout = QHBoxLayout() pwd_label = QLabel('加密密碼:') self.pwd_edit = QLineEdit() self.pwd_edit.setEchoMode(QLineEdit.Password) pwd_layout.addWidget(pwd_label) pwd_layout.addWidget(self.pwd_edit) # 文件后綴輸入部分 suffix_layout = QHBoxLayout() suffix_label = QLabel('文件后綴:') self.suffix_edit = QLineEdit() self.suffix_edit.setText("_加密") suffix_layout.addWidget(suffix_label) suffix_layout.addWidget(self.suffix_edit) # 操作按鈕 btn_layout = QHBoxLayout() self.encrypt_btn = QPushButton('開(kāi)始加密') self.encrypt_btn.clicked.connect(self.start_encryption) btn_layout.addStretch() btn_layout.addWidget(self.encrypt_btn) # 進(jìn)度條 self.progress_bar = QProgressBar() self.progress_bar.setValue(0) # 日志輸出區(qū)域 log_label = QLabel('處理日志:') self.log_text = QTextEdit() self.log_text.setReadOnly(True) # 添加所有部件到主布局 main_layout.addLayout(dir_layout) main_layout.addLayout(pwd_layout) main_layout.addLayout(suffix_layout) main_layout.addLayout(btn_layout) main_layout.addWidget(self.progress_bar) main_layout.addWidget(log_label) main_layout.addWidget(self.log_text) def browse_directory(self): """打開(kāi)目錄選擇對(duì)話框""" directory = QFileDialog.getExistingDirectory(self, '選擇目錄') if directory: self.dir_edit.setText(directory) def start_encryption(self): """開(kāi)始加密操作""" directory = self.dir_edit.text().strip() password = self.pwd_edit.text().strip() suffix = self.suffix_edit.text().strip() # 驗(yàn)證輸入 if not directory: QMessageBox.warning(self, '輸入錯(cuò)誤', '請(qǐng)選擇要處理的目錄') return if not password: QMessageBox.warning(self, '輸入錯(cuò)誤', '請(qǐng)輸入加密密碼') return if not suffix: reply = QMessageBox.question(self, '確認(rèn)操作', '您沒(méi)有輸入文件后綴,加密后的文件將覆蓋原文件,是否繼續(xù)?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.No: return # 確認(rèn)操作 reply = QMessageBox.question(self, '確認(rèn)操作', f'將對(duì)目錄 "{directory}" 中的所有Excel文件進(jìn)行加密,并保存為帶有后綴 "{suffix}" 的新文件,是否繼續(xù)?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: # 清空日志和進(jìn)度條 self.log_text.clear() self.progress_bar.setValue(0) # 禁用按鈕,防止重復(fù)操作 self.encrypt_btn.setEnabled(False) # 創(chuàng)建并啟動(dòng)工作線程 self.worker = EncryptionWorker(directory, password, suffix) self.worker.progress_update.connect(self.update_log) self.worker.progress_value.connect(self.progress_bar.setValue) self.worker.finished_signal.connect(self.encryption_finished) self.worker.start() def update_log(self, message): """更新日志輸出""" self.log_text.append(message) # 自動(dòng)滾動(dòng)到底部 self.log_text.verticalScrollBar().setValue( self.log_text.verticalScrollBar().maximum() ) def encryption_finished(self, encrypted, failed): """加密完成后的處理""" self.update_log(f"\n加密完成! 成功加密 {encrypted} 個(gè)文件,失敗 {failed} 個(gè)文件。") self.encrypt_btn.setEnabled(True) # 顯示完成消息 QMessageBox.information(self, '操作完成', f'加密完成!\n成功加密 {encrypted} 個(gè)文件\n失敗 {failed} 個(gè)文件') def main(): """程序入口點(diǎn)""" app = QApplication(sys.argv) window = ExcelEncryptorApp() window.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
七、總結(jié)與展望
本工具通過(guò)Python+PyQt5的組合,實(shí)現(xiàn)了:
- 高效率:比手動(dòng)加密快10倍以上
- 易用性:拖拽操作+可視化界面
- 穩(wěn)定性:完善的異常處理機(jī)制
未來(lái)可擴(kuò)展方向:
- 增加批量解密功能
- 支持更多文件格式(Word/PDF)
- 添加云存儲(chǔ)支持
到此這篇關(guān)于使用Python打造一個(gè)Excel批量加密工具的文章就介紹到這了,更多相關(guān)Python Excel加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python批量發(fā)送post請(qǐng)求的實(shí)現(xiàn)代碼
昨天學(xué)了一天的Python(我的生產(chǎn)語(yǔ)言是java,也可以寫(xiě)一些shell腳本,算有一點(diǎn)點(diǎn)基礎(chǔ)),今天有一個(gè)應(yīng)用場(chǎng)景,就正好練手了2018-05-05python 平衡二叉樹(shù)實(shí)現(xiàn)代碼示例
這篇文章主要介紹了python 平衡二叉樹(shù)實(shí)現(xiàn)代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07使用python和yolo方法實(shí)現(xiàn)yolo標(biāo)簽自動(dòng)標(biāo)注
本文介紹了基于YOLOv10的自動(dòng)標(biāo)注方法,從初階的固定標(biāo)注到高階的基于YOLO檢測(cè)結(jié)果的自動(dòng)標(biāo)注,兩者相比,高階方法顯著提高了標(biāo)注的準(zhǔn)確性,并減少了人工操作的時(shí)間,</P><P>2024-11-11Python中列表乘法和列表推導(dǎo)式的區(qū)別舉例詳解
在Python中列表是一種非常靈活和強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),支持多種運(yùn)算和操作,這篇文章主要介紹了Python中列表乘法和列表推導(dǎo)式區(qū)別的相關(guān)資料,文中通過(guò)代碼就介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04Python遍歷zip文件輸出名稱時(shí)出現(xiàn)亂碼問(wèn)題的解決方法
這篇文章主要介紹了Python遍歷zip文件輸出名稱時(shí)出現(xiàn)亂碼問(wèn)題的解決方法,實(shí)例分析了Python亂碼的出現(xiàn)的原因與相應(yīng)的解決方法,需要的朋友可以參考下2015-04-04Python Pandas學(xué)習(xí)之基本數(shù)據(jù)操作詳解
本文將通過(guò)讀取一個(gè)股票數(shù)據(jù),來(lái)進(jìn)行Pandas的一些基本數(shù)據(jù)操作的語(yǔ)法介紹。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-02-02python爬蟲(chóng)之驗(yàn)證碼篇3-滑動(dòng)驗(yàn)證碼識(shí)別技術(shù)
本篇涉及到的驗(yàn)證碼為滑動(dòng)驗(yàn)證碼,不同于極驗(yàn)證,本驗(yàn)證碼難度略低,需要的將滑塊拖動(dòng)到矩形區(qū)域右側(cè)即可完成。對(duì)python爬蟲(chóng)滑動(dòng)驗(yàn)證碼識(shí)別技術(shù)感興趣的朋友跟隨小編一起看看吧2019-04-04Python使用POP3和SMTP協(xié)議收發(fā)郵件的示例代碼
這篇文章主要介紹了Python使用POP3和SMTP協(xié)議收發(fā)郵件的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04