批量提取word文档标题
25-04-08 02:28
1038
0
import os import sys from collections import defaultdict from docx import Document from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QWidget, QLabel, QPushButton, QTextEdit, QFileDialog, QSpinBox, QGroupBox, QProgressBar) from PyQt5.QtCore import Qt from PyQt5.QtGui import QFont, QIcon class TitleExtractorApp(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Word文档标题提取工具") self.setWindowIcon(QIcon('icon.png')) # 请准备一个图标文件或删除这行 self.setGeometry(100, 100, 800, 600) # 设置主窗口样式 self.setStyleSheet(""" QMainWindow { background-color: #f5f5f5; } QGroupBox { border: 1px solid #ccc; border-radius: 5px; margin-top: 10px; padding-top: 15px; font-size: 14px; } QGroupBox::title { subcontrol-origin: margin; left: 10px; padding: 0 3px; } QPushButton { background-color: #4CAF50; border: none; color: white; padding: 8px 16px; text-align: center; text-decoration: none; font-size: 14px; margin: 4px 2px; border-radius: 4px; } QPushButton:hover { background-color: #45a049; } QPushButton:pressed { background-color: #3e8e41; } QTextEdit { border: 1px solid #ccc; border-radius: 4px; padding: 8px; font-family: 'Segoe UI', Arial, sans-serif; } QSpinBox { padding: 5px; font-size: 14px; } """) self.init_ui() def init_ui(self): # 主布局 main_widget = QWidget() main_layout = QVBoxLayout() # 标题 title_label = QLabel("Word文档标题提取工具") title_label.setFont(QFont('Arial', 16, QFont.Bold)) title_label.setAlignment(Qt.AlignCenter) title_label.setStyleSheet("color: #333; margin-bottom: 20px;") # 设置组 settings_group = QGroupBox("提取设置") settings_layout = QHBoxLayout() # 文件夹选择 folder_layout = QVBoxLayout() self.folder_label = QLabel("未选择文件夹") self.folder_label.setStyleSheet("color: #666;") browse_button = QPushButton("选择文件夹") browse_button.clicked.connect(self.select_folder) folder_layout.addWidget(QLabel("文档文件夹:")) folder_layout.addWidget(self.folder_label) folder_layout.addWidget(browse_button) # 标题级别设置 level_layout = QVBoxLayout() level_label = QLabel("最大标题级别:") self.level_spin = QSpinBox() self.level_spin.setRange(1, 6) self.level_spin.setValue(3) level_layout.addWidget(level_label) level_layout.addWidget(self.level_spin) # 进度条 self.progress_bar = QProgressBar() self.progress_bar.setRange(0, 100) self.progress_bar.setValue(0) self.progress_bar.setTextVisible(False) # 添加到设置组 settings_layout.addLayout(folder_layout, 70) settings_layout.addLayout(level_layout, 30) settings_group.setLayout(settings_layout) # 操作按钮 button_layout = QHBoxLayout() extract_button = QPushButton("提取标题") extract_button.clicked.connect(self.extract_titles) extract_button.setStyleSheet("background-color: #2196F3;") save_button = QPushButton("保存结果") save_button.clicked.connect(self.save_results) save_button.setStyleSheet("background-color: #FF9800;") clear_button = QPushButton("清空结果") clear_button.clicked.connect(self.clear_results) clear_button.setStyleSheet("background-color: #f44336;") button_layout.addWidget(extract_button) button_layout.addWidget(save_button) button_layout.addWidget(clear_button) # 结果显示 result_group = QGroupBox("提取结果") result_layout = QVBoxLayout() self.result_text = QTextEdit() self.result_text.setReadOnly(True) result_layout.addWidget(self.result_text) result_group.setLayout(result_layout) # 组装主布局 main_layout.addWidget(title_label) main_layout.addWidget(settings_group) main_layout.addWidget(self.progress_bar) main_layout.addLayout(button_layout) main_layout.addWidget(result_group) main_widget.setLayout(main_layout) self.setCentralWidget(main_widget) # 状态栏 self.statusBar().showMessage("准备就绪") # 初始化变量 self.selected_folder = "" self.extracted_data = {} def select_folder(self): folder = QFileDialog.getExistingDirectory(self, "选择包含Word文档的文件夹") if folder: self.selected_folder = folder self.folder_label.setText(folder) self.statusBar().showMessage(f"已选择文件夹: {folder}") def extract_titles(self): if not self.selected_folder: self.statusBar().showMessage("请先选择文件夹!", 3000) return max_level = self.level_spin.value() self.result_text.clear() self.extracted_data = {} file_count = 0 # 统计文件数量用于进度条 total_files = sum(1 for _, _, files in os.walk(self.selected_folder) for f in files if f.endswith('.docx')) if total_files == 0: self.statusBar().showMessage("所选文件夹中没有找到Word文档!", 3000) return processed_files = 0 for root, _, files in os.walk(self.selected_folder): for filename in files: if filename.endswith('.docx'): file_path = os.path.join(root, filename) try: doc = Document(file_path) file_data = defaultdict(list) for p in doc.paragraphs: if p.style.name.startswith('Heading'): try: level = int(p.style.name.split()[1]) if level <= max_level: file_data[level].append(p.text) except (IndexError, ValueError): continue if file_data: self.extracted_data[filename] = file_data processed_files += 1 progress = int((processed_files / total_files) * 100) self.progress_bar.setValue(progress) except Exception as e: self.result_text.append(f"处理文件 {filename} 时出错: {str(e)}\n") # 显示结果 self.display_results() self.progress_bar.setValue(100) self.statusBar().showMessage(f"提取完成!共处理 {processed_files} 个文件", 5000) def display_results(self): self.result_text.clear() if not self.extracted_data: self.result_text.append("没有提取到任何标题数据") return for filename, levels in self.extracted_data.items(): self.result_text.append(f"=== {filename} ===") for level in sorted(levels.keys()): self.result_text.append(f"\n[标题 {level}]") for i, title in enumerate(levels[level], 1): self.result_text.append(f"{i}. {title}") self.result_text.append("\n") def save_results(self): if not self.extracted_data: self.statusBar().showMessage("没有可保存的数据!", 3000) return file_path, _ = QFileDialog.getSaveFileName(self, "保存结果", "", "文本文件 (*.txt)") if file_path: try: with open(file_path, 'w', encoding='utf-8') as f: for filename, levels in self.extracted_data.items(): f.write(f"=== {filename} ===\n") for level in sorted(levels.keys()): f.write(f"\n[标题 {level}]\n") for i, title in enumerate(levels[level], 1): f.write(f"{i}. {title}\n") f.write("\n") self.statusBar().showMessage(f"结果已保存到: {file_path}", 5000) except Exception as e: self.statusBar().showMessage(f"保存失败: {str(e)}", 5000) def clear_results(self): self.result_text.clear() self.extracted_data = {} self.progress_bar.setValue(0) self.statusBar().showMessage("已清空结果", 3000) if __name__ == "__main__": app = QApplication(sys.argv) # 设置全局字体 font = QFont() font.setFamily("Segoe UI") font.setPointSize(10) app.setFont(font) window = TitleExtractorApp() window.show() sys.exit(app.exec_())
-
蒙台梭利幼教小程序
蒙台梭利幼教小程序是一款专为幼儿提供教育资源和故事阅读服务的应用程序。以下是该小程序的功能介绍:推荐故事:小程序会根据幼儿的年龄和... 1136 0 24-09-11 -
阅读电子书小说网站APP合集
网络小说网站起点中文网:https://www.qidian.com/ 推荐,国内最大的原创网络小说网微信读书:https://weread.qq.com/ 推荐,正版小说在线... 683 0 25-03-10 -
设厂计划表 - 企业管理表格
设厂计划〈一〉.doc设厂计划〈七〉.doc设厂计划〈三〉.doc设厂计划〈九〉.doc设厂计划〈二〉.doc设厂计划〈五〉.doc设厂计划〈八〉.doc设厂... 1010 0 24-07-30 -
老师傅让我切记开车36计
万事开头难,开车当然也不例外。每位驾驶员都是从“新手”走过来的,开车本来就是“熟练工种”,只要胆大心细,注意认真解决遇到的问题,就... 1016 0 25-03-03 -
QR Code Generator - 二维码生成工具
QR Code Generator二维码生成器提供了各种可自定义的功能,用于生成二维码。用户可以调整颜色方案、图像大小、点数、角点样式,以及在二... 1120 0 25-01-14 -
PHP模拟浏览器上传文件(数据流形式上传)
用 PHP 上传文件基本都是临时存储,之后上传,怎么用 PHP 模拟浏览器以数据流形式上传文件思路及代码如下://网址 参数 文件 function ... 546 0 25-04-07 -
谁是杀手小程序游戏
“谁是杀手”小程序游戏是一款推理类的小程序游戏,玩家在游戏中扮演不同的角色,通过搜集线索、分析案情、推理判断,找出隐藏在众人之中的... 1201 0 24-10-27 -
中国大学 - MOOC
非常专业的课程网站,在这里不但可以免费学习你喜欢的知识,你可以找到你喜欢的老师,学习你想发展的领域,并可以实时测试,让你和老师产生互动,帮你更好地学习知识。 414 0 21-11-27
发表我的评论
共0条评论
- 这篇文章还没有收到评论,赶紧来抢沙发吧~