当前位置: 首页 > news >正文

Python脚本:将Word文档转换为Excel文件

在这里插入图片描述

引言

在文档处理中,我们经常需要将Word文档中的内容转换成其他格式,如Excel,以便更好地进行数据分析和报告。针对这一需求,我编写了一个Python脚本,能够批量处理指定目录下的Word文档,将其内容结构化并转换为Excel文件。

功能概述

这个脚本的主要功能包括:

  1. 批量读取Word文档:自动检索指定目录下的所有Word文档(.docx格式)。
  2. 内容抽取和组织:根据Word文档中的标题层级(Heading),抽取和组织内容。
  3. 关键信息提取:自动从Word文档的文件名中提取关键信息,作为Excel表格中的一级节点名称。
  4. 结构化DataFrame创建:将抽取的信息转化为DataFrame,包含一级至四级节点及其对应内容。
  5. Excel文件保存:将每个Word文档转换得到的DataFrame保存为同名的Excel文件,位于原始Word文档所在的同一目录。

使用方法

  1. 准备文档:确保所有待处理的Word文档位于同一目录下,并且每个文档中要有定义好的标题样式(一级标题、二级标题等)。
  2. 指定目录:修改脚本中的batch_process_word_to_excel函数中的directory参数,指定Word文档所在目录。
  3. 运行脚本:执行脚本,等待处理完成。脚本将在指定目录下生成对应的Excel文件,文件名与原Word文档一致,但扩展名为’.xlsx’。

代码解析

以下是脚本的完整代码,包含了所需的库和函数定义:

# -*- coding: utf-8 -*-
"""
此Python脚本旨在自动化处理目录下所有的Word文档(.docx),将其内容结构化并转换为Excel文件(.xlsx)。主要功能:
1. 批量读取指定目录下的所有Word文档。
2. 对每个Word文档,根据文档内的标题层级(Heading)结构,抽取和组织内容。
3. 自动从Word文档的文件名中提取关键信息作为Excel表格中的一级节点名称,特别关注“分册”和“细则”之间的文本。
4. 将抽取的信息转化为结构化的DataFrame,其中包含一级至四级节点及其对应内容。具体转换规则如下:填充说明:1.word文件名为一级标题,作为Excel中的一级节点;2.word中的一级标题作为Excel中的二级节点,一级标题和当前一级标题下的第一个二级标题之间的正文内容作为Excel的二级内容;3.word中的二级标题作为Excel中的三级节点,二级标题和当前二级标题下的第一个三级标题之间的正文内容作为Excel的三级内容;4.word中的三级标题作为Excel中的四级节点,三级标题和当前三级标题下的第一个四级标题之间的正文内容作为Excel的四级内容;
5. 将每个Word文档转换得到的DataFrame保存为同名的Excel文件,位于原始Word文档所在的同一目录。使用方法:
- 确保所有待处理的Word文档位于同一目录下。并且,每个word中要有样式:一级标题、二级标题、三级标题等
- 修改'batch_process_word_to_excel'函数中的'directory'参数,指定Word文档所在目录。
- 运行脚本,脚本将在指定目录下生成对应的Excel文件,文件名与原Word文档一致,但扩展名为'.xlsx'。依赖库:
- os: 提供与操作系统交互的功能,如文件和目录操作。
- docx: 用于读取Word文档的库。
- pandas: 用于数据处理和分析的库,创建DataFrame和保存Excel文件。注意事项:
- 代码假设Word文档中的标题层级不超过四级。
- 一级节点名称的提取逻辑基于文件名中包含“分册”和“细则”的特定格式。
- 如需处理不同层级或文件命名规则,需相应调整代码逻辑。"""
import os
import docx
import pandas as pddef extract_title_from_filename(filename):# 分割文件名找到"分册"和"细则"parts = filename.split('分册')if len(parts) > 1:title_part = parts[1].split('细则')[0]return title_part.strip()  # 去除前后空格else:return filename  # 如果没有找到"分册"或"细则",返回原文件名def process_word_to_excel(file_path):doc = docx.Document(file_path)columns = ['一级节点', '二级节点', '二级内容', '三级节点', '三级内容', '四级节点', '四级内容']df = pd.DataFrame(columns=columns)# 获取Word文档的文件名,并从中提取一级节点名称filename = os.path.basename(file_path)word_file_name = extract_title_from_filename(filename)current_level2 = ""current_level3 = ""current_level4 = ""current_content = ""last_level = 0for paragraph in doc.paragraphs:if paragraph.style.name.startswith('Heading'):heading_level = int(paragraph.style.name[-1])if heading_level <= last_level:if current_level4:new_row = pd.DataFrame({'一级节点': [word_file_name],'二级节点': [current_level2],'三级节点': [current_level3],'四级节点': [current_level4],'四级内容': [current_content]})elif current_level3:new_row = pd.DataFrame({'一级节点': [word_file_name],'二级节点': [current_level2],'三级节点': [current_level3],'三级内容': [current_content]})elif current_level2:new_row = pd.DataFrame({'一级节点': [word_file_name],'二级节点': [current_level2],'二级内容': [current_content]})df = pd.concat([df, new_row], ignore_index=True)current_content = ""if heading_level == 1:current_level2 = paragraph.textcurrent_level3 = ""current_level4 = ""last_level = 1elif heading_level == 2:current_level3 = paragraph.textcurrent_level4 = ""last_level = 2elif heading_level == 3:current_level4 = paragraph.textlast_level = 3else:current_content += paragraph.text + '\n'if current_content:if current_level4:new_row = pd.DataFrame({'一级节点': [word_file_name],'二级节点': [current_level2],'三级节点': [current_level3],'四级节点': [current_level4],'四级内容': [current_content]})elif current_level3:new_row = pd.DataFrame({'一级节点': [word_file_name],'二级节点': [current_level2],'三级节点': [current_level3],'三级内容': [current_content]})elif current_level2:new_row = pd.DataFrame({'一级节点': [word_file_name],'二级节点': [current_level2],'二级内容': [current_content]})df = pd.concat([df, new_row], ignore_index=True)return dfdef batch_process_word_to_excel(directory):for filename in os.listdir(directory):if filename.endswith('.docx'):file_path = os.path.join(directory, filename)df = process_word_to_excel(file_path)excel_filename = os.path.splitext(filename)[0] + '.xlsx'excel_path = os.path.join(directory, excel_filename)df.to_excel(excel_path, index=False)print(f'Processed {filename} to {excel_filename}')# 调用函数,指定目录
batch_process_word_to_excel('D:\\test')

相关文章:

  • 学懂C#编程:常用高级技术——学会C#的高级特性 反射
  • Amazon SQS应用场景及Python实现案例
  • 知名品牌因商标痛失市场:114家直营店山寨店7000多家!
  • 【数据挖掘】银行信用卡风险大数据分析与挖掘
  • WordPress付费进群V2主题,多种引流方法,引私域二次变现
  • 简述Vue中的数据双向绑定原理
  • 基于深度学习的相机内参标定
  • 【Spring Boot】简单了解spring boot支持的三种服务器
  • 【Oracle运维】导出数据库中的数据SQL查询结果保存到文件
  • 谷粒商城学习-07-虚拟机网络设置
  • Java后端每日面试题(day1)
  • C++STL函数对象的应用
  • 【单链表】03 设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。
  • 认识不-物联网“六域模型”有哪些有什么作用
  • git上传时出现了main master的问题解决
  • [case10]使用RSQL实现端到端的动态查询
  • Brief introduction of how to 'Call, Apply and Bind'
  • CSS魔法堂:Absolute Positioning就这个样
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Elasticsearch 参考指南(升级前重新索引)
  • idea + plantuml 画流程图
  • Java,console输出实时的转向GUI textbox
  • Javascript Math对象和Date对象常用方法详解
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript对象详解
  • js如何打印object对象
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 欢迎参加第二届中国游戏开发者大会
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 使用 Docker 部署 Spring Boot项目
  • 微服务框架lagom
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • ​2020 年大前端技术趋势解读
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #大学#套接字
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (4)Elastix图像配准:3D图像
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (十六)Flask之蓝图
  • (十三)MipMap
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NetCore部署微服务(二)
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • []C/C++读取串口接收到的数据程序
  • [20190416]完善shared latch测试脚本2.txt
  • [android] 天气app布局练习
  • [Angular] 笔记 8:list/detail 页面以及@Input