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

embedded/2024/10/22 15:29:28/

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

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

代码实现

我们首先导入所需的库:

python">word">import os
word">import re
word">import pandas word">as pd
word">from docx word">import Document

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

python"># 从Word文档中读取特定表格并转换为DataFrame
word">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 word">for col_idx word">in cols]word">for row_idx word">in rows word">if row_idx < len(table.rows)]      word">return data

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

python"># 主函数,批量读取特定模式的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 word">for f word">in files word">if keyword word">in f]# 初始化一个空的DataFrame列表dataframes_list = []# 遍历所有预想的文件编号word">for num word">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生成的正则表达式并不完善,需要根据实际调整。"""# 检查文件是否存在且符合模式word">if pattern1 word">in files_with_keyword:# 文件存在且符合模式,读取数据file_path = os.path.join(folder_path, pattern1)doc = Document(file_path)word">try:df = read_table_from_word(doc, table_index, rows, cols)word">except Exception word">as e:word">print(f"读取文件 {pattern1} 错误: {e}")df = pd.DataFrame()dataframes_list.append(df)word">elif pattern2 word">in files_with_keyword:# 文件存在且符合模式,读取数据file_path = os.path.join(folder_path, pattern2)doc = Document(file_path)word">try:df = read_table_from_word(doc, table_index, rows, cols)word">except Exception word">as e:word">print(f"读取文件 {pattern2} 错误: {e}")df = pd.DataFrame()dataframes_list.append(df)word">else:# 文件不存在或不符合模式,记录为空DataFramedataframes_list.append(pd.DataFrame())# 创建DataFrame列表dfs = []word">for data word">in dataframes_list:# 将字符串转换为整数int_data = [int(item[0]) word">for item word">in data]# 创建DataFramedf = pd.DataFrame(int_data, columns=['Data'])dfs.append(df)word">return dfs

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

python"># 定义函数来保存DataFrame列表到同一个Excel工作表
word">def save_dataframes_to_same_sheet(dfs, excel_path):# 使用with语句确保文件正确关闭word">with pd.ExcelWriter(excel_path, engine='openpyxl', mode='w') word">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的处理word">for df word">in dfs[1:]:word">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 += 1word">else:df_transposed =  df.Tdf_transposed.to_excel(writer, sheet_name='Sheet1', startrow=startrow, index=False, header=False)# 非空DataFrame增加的行数为其行数startrow += df_transposed.shape[0]word">print(f'数据已保存至{excel_path}的Sheet1')

配置参数并执行代码

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

python"># 配置参数
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文件中。希望这个脚本对你有所帮助!

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

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


http://www.ppmy.cn/embedded/86656.html

相关文章

微信小程序开发入门指南

文章目录 一、微信小程序简介二、微信小程序开发准备三、微信小程序开发框架四、微信小程序开发实例六、微信小程序开发进阶6.1 组件化开发6.2 API调用6.3 云开发 七、微信小程序开发注意事项7.1 遵守规范7.2 注意性能7.3 保护用户隐私 八、总结 大家好&#xff0c;今天将为大家…

视图、存储过程、触发器

一、视图 视图是从一个或者几个基本表&#xff08;或视图&#xff09;导出的表。它与基 本表不同&#xff0c;是一个虚表&#xff0c;视图只能用来从查询&#xff0c;不能做增删改(虚拟的表) 1.创建视图 创建视图的语法&#xff1a; create view 视图名【view_xxx / v_xxx】 a…

【笔记】人工智能大模型在电力系统运行控制中的应用综述及展望

据统计,截至 2019 年底,我国风电和光伏的装机容量已经达到 415 GW,美国的可再生能源全年发电量已超过燃煤发电,同时欧洲计划在 2050 年完成 100% 可再生能源互联电网的建设。为了响应国家提出的“碳达峰”“碳中和”政策,国家电网公司提出在有效保障能源安全供应的前提下,…

shopee虾皮 java后端 一面面经 整体感觉不难

面试总结&#xff1a;总体不难&#xff0c;算法题脑抽了只过了一半&#xff0c;面试官点出了问题说时间到了&#xff0c;反问一点点&#xff0c;感觉五五开&#xff0c;许愿一个二面 1.Java中的锁机制&#xff0c;什么是可重入锁 Java中的机制主要包括 synchronized关键字 Loc…

C++ 类和对象 终篇

一 static成员&#xff1a; 静态成员变量是属于整个类的&#xff0c;而不是某个特定对象的。也就是说&#xff0c;所有对象共享同一个静态成员变量。它的特点包括&#xff1a; 非静态成员变量&#xff1a; class A { public:int _x; // 非静态成员变量 };int main() {A a1…

PostgreSQL 中如何重置序列值:将自增 ID 设定为特定值开始

我是从excel中将数据导入&#xff0c;然后再通过sql插入数据&#xff0c;就报错。 需要设置自增ID开始值 1、确定序列名称&#xff1a; 首先&#xff0c;需要找到与的增字段相关的序列名称。假设表名是 my_table 和自增字段是 id&#xff0c;可以使用以下查询来获取序列名称…

node和npm安装;electron、 electron-builder安装

1、node和npm安装 参考&#xff1a; https://blog.csdn.net/sw150811426/article/details/137147783 下载&#xff1a; https://nodejs.org/dist/v20.15.1/ 安装&#xff1a; 点击下载msi直接运行安装 安装完直接cmd打开可以&#xff0c;默认安装就已经添加了环境变量&…

my.ini配置文件中port有什么作用?

my.ini配置文件 [mysqld] port 13306 [client]port13306在my.ini配置文件中&#xff0c;[client] 和 [mysqld] 节中的 port 参数有着不同的作用&#xff1a; [client] port 这个参数定义的是MySQL客户端尝试连接到MySQL服务器时所使用的端口号。 当你在命令行或其他客户端工具…