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

【python】批量读取Word文档中的特定表格并保存为Excel文件

批量读取Word文档中的特定表格并保存为Excel文件

在工作中,我们常常需要从多个Word文档中提取数据,然后将这些数据汇总到一个Excel文件中进行分析。下面,我将分享一个Python脚本,它可以从多个Word文档中读取特定的表格数据,并将这些数据保存到一个Excel文件中。

代码实现

我们首先导入所需的库:

import os
import re
import pandas as pd
from docx import Document

然后,我们定义一个函数来从Word文档中读取特定表格并转换为DataFrame:在这里插入图片描述
这是此次的文件内容,我们想读取表格中的内容。如:第二个表格中总分的均分项,我们要定义相关参数(函数内部已说明。)

# 从Word文档中读取特定表格并转换为DataFrame
def read_table_from_word(document, table_index, rows, cols):"""从指定的Word文档中的指定单元格提取数据参数:doc: Document对象,代表一个Word文档table_index: int,要读取的表格索引rows: list,要读取的行索引cols: list,要读取的列索引返回值:data: list,提取的数据"""table = document.tables[table_index]data = [[table.cell(row_idx, col_idx).text for col_idx in cols]for row_idx in rows if row_idx < len(table.rows)]      return data

接下来是主函数,用于批量读取特定模式的Word文档中的表格数据(如下):
在这里插入图片描述

# 主函数,批量读取特定模式的Word文档中的表格数据
def read_every_word_file(folder_path, keyword, start_num, end_num, table_index, rows, cols):"""读取文件夹中包含特定关键字的所有Word文件,并提取指定表格中的数据参数:folder_path: str,文件夹路径keyword: str,文件名中包含的关键字,示例中我使用:SCL90table_index: int,要读取的表格索引rows: list,要读取的行索引cols: list,要读取的列索引返回值:all_data: list,所有Word文件中提取的数据"""# 获取文件夹中的所有文件名files = os.listdir(folder_path)# 过滤文件名,筛选出包含关键字的文件files_with_keyword = [f for f in files if keyword in f]# 初始化一个空的DataFrame列表dataframes_list = []# 遍历所有预想的文件编号for num in range(start_num, end_num + 1):# 构建文件编号字符串,确保编号长度为3位,为符合示例中的文件名格式num_str = str(num).zfill(3)# 使用模板和当前数字构建正则表达式(根据实际文件名设置,或者依据AI分析得出)pattern1 = f"B{num_str}--{keyword}.doc"pattern2 = f"B{num_str}---{keyword}.doc""""	注:AI生成的正则表达式并不完善,需要根据实际调整。"""# 检查文件是否存在且符合模式if pattern1 in files_with_keyword:# 文件存在且符合模式,读取数据file_path = os.path.join(folder_path, pattern1)doc = Document(file_path)try:df = read_table_from_word(doc, table_index, rows, cols)except Exception as e:print(f"读取文件 {pattern1} 错误: {e}")df = pd.DataFrame()dataframes_list.append(df)elif pattern2 in files_with_keyword:# 文件存在且符合模式,读取数据file_path = os.path.join(folder_path, pattern2)doc = Document(file_path)try:df = read_table_from_word(doc, table_index, rows, cols)except Exception as e:print(f"读取文件 {pattern2} 错误: {e}")df = pd.DataFrame()dataframes_list.append(df)else:# 文件不存在或不符合模式,记录为空DataFramedataframes_list.append(pd.DataFrame())# 创建DataFrame列表dfs = []for data in dataframes_list:# 将字符串转换为整数int_data = [int(item[0]) for item in data]# 创建DataFramedf = pd.DataFrame(int_data, columns=['Data'])dfs.append(df)return dfs

最后,我们定义一个函数来保存DataFrame列表到同一个Excel工作表:

# 定义函数来保存DataFrame列表到同一个Excel工作表
def save_dataframes_to_same_sheet(dfs, excel_path):# 使用with语句确保文件正确关闭with pd.ExcelWriter(excel_path, engine='openpyxl', mode='w') as writer:# 写入第一个DataFramedf_transposed = dfs[0].Tdf_transposed.to_excel(writer, sheet_name='Sheet1',startrow=1, index=False, header=False)# 获取第一个DataFrame的高度(行数)startrow = df_transposed[0].shape[0]+1# 剩余DataFrame的处理for df in dfs[1:]:if df.empty:  # 如果DataFrame为空df_transposed =  df.T# 仅写入标题行(即使没有数据),以保留一行空白df_transposed.columns.to_series().to_frame(name=None).to_excel(writer, sheet_name='Sheet1', startrow=startrow, index=False, header=False)# 空DataFrame增加的行数为1startrow += 1else:df_transposed =  df.Tdf_transposed.to_excel(writer, sheet_name='Sheet1', startrow=startrow, index=False, header=False)# 非空DataFrame增加的行数为其行数startrow += df_transposed.shape[0]print(f'数据已保存至{excel_path}的Sheet1')

配置参数并执行代码

我们需要配置一些参数,然后调用上述函数来读取文件并保存数据:

# 配置参数
folder_path = '相对文件夹路径'
excel_path = '保存Execl文件的相对路径'# 调用函数读取文件
dataframes = read_every_word_file(folder_path, 'SCL90', 1, 79, 1, [1,2,3,4,5,6,7,8,9,10,11], [1])
# 保存数据到Excel
save_dataframes_to_same_sheet(dataframes, excel_path)

这样,我们就可以从指定的Word文档中读取表格数据,并将这些数据保存到一个Excel文件中。希望这个脚本对你有所帮助!

并不具有普适性,请在修改后使用!

欢迎提出见解和指正错误!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 图中的最短环
  • mac OS matplotlib missing from font(s) DejaVu Sans
  • git怎么把本地仓库提交到远程仓库
  • Docker 部署的 GitLab备份和恢复
  • Windows图形界面(GUI)-MFC-C/C++ - 键鼠操作
  • C++《类和对象》(中)
  • [极客大挑战 2019]BabySQL1
  • AT_abc001_1
  • 视频编辑软件会声会影Corel VideoStudio2023安装图文激活教程
  • Redis:快速键值存储的入门指南
  • javascript 如何将 json 格式数组转为 excel 表格| sheetJS
  • SQL labs-SQL注入(五,使用sqlmap进行cookie注入)
  • NS4890C 2.4W 单声道AB类音频放大器
  • repo中的default.xml文件project name为什么一样?
  • 初识C++ · map和set的使用
  • [iOS]Core Data浅析一 -- 启用Core Data
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • CEF与代理
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • echarts的各种常用效果展示
  • ES6核心特性
  • fetch 从初识到应用
  • JavaScript对象详解
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • laravel with 查询列表限制条数
  • Laravel核心解读--Facades
  • mongodb--安装和初步使用教程
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • python学习笔记 - ThreadLocal
  • windows下mongoDB的环境配置
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 对超线程几个不同角度的解释
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 日剧·日综资源集合(建议收藏)
  • 小程序开发之路(一)
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​MySQL主从复制一致性检测
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (二)PySpark3:SparkSQL编程
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (自适应手机端)行业协会机构网站模板
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 中 GetProcess 相关方法的性能
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .NET6实现破解Modbus poll点表配置文件
  • :class的用法及应用
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [ACTF2020 新生赛]Upload 1
  • [Android]使用Git将项目提交到GitHub
  • [AWS]CodeCommit的创建与使用