如何用Python-docx批量提取多Word文档所有表格并保存?
问题分析及解决方案
原代码核心问题
- 遍历文档内表格时,每次循环会覆盖
df变量,最终仅保留文档中最后一个表格的数据,导致每个文档只提取了一个表格 - CSV保存逻辑嵌套在文件遍历循环内,每处理一个文件就重复保存所有已提取的表格,造成重复输出和命名混乱
- 未实现“每个文档的表格保存为独立工作表”的需求,仅生成了零散的CSV文件
修改后的代码方案
方案1:提取所有表格并保存为单独CSV文件(按文件+表格序号命名)
该方案会为每个表格生成独立的CSV文件,文件名包含原Word文档名称和表格序号,方便区分来源:
import os from docx import Document import pandas as pd # 目标文件夹路径 folder = 'C:/Users/trans/downloads/test' # 获取所有docx文件的完整路径 file_names = [os.path.join(folder, f) for f in os.listdir(folder) if f.endswith(".docx")] for file_path in file_names: # 获取纯文件名(不带路径和后缀) base_name = os.path.splitext(os.path.basename(file_path))[0] document = Document(file_path) # 遍历当前文档的所有表格 for table_idx, table in enumerate(document.tables, start=1): # 初始化表格数据容器 df_data = [['' for _ in range(len(table.columns))] for _ in range(len(table.rows))] # 逐行逐单元格提取文本 for row_idx, row in enumerate(table.rows): for col_idx, cell in enumerate(row.cells): if cell.text: df_data[row_idx][col_idx] = cell.text.strip() # 转换为DataFrame并保存 df = pd.DataFrame(df_data) save_path = os.path.join(folder, f"{base_name}_table_{table_idx}.csv") df.to_csv(save_path, index=False, encoding='utf-8-sig') print(f"已保存:{save_path}") print("所有表格提取完成!")
方案2:将单个文档的所有表格保存为一个Excel文件的独立工作表
如果需要把同一Word文档内的所有表格整合到一个Excel文件的不同工作表中,使用以下代码:
import os from docx import Document import pandas as pd folder = 'C:/Users/trans/downloads/test' file_names = [os.path.join(folder, f) for f in os.listdir(folder) if f.endswith(".docx")] for file_path in file_names: base_name = os.path.splitext(os.path.basename(file_path))[0] excel_save_path = os.path.join(folder, f"{base_name}_tables.xlsx") document = Document(file_path) # 创建Excel写入对象,实现多工作表写入 with pd.ExcelWriter(excel_save_path) as writer: for table_idx, table in enumerate(document.tables, start=1): df_data = [['' for _ in range(len(table.columns))] for _ in range(len(table.rows))] for row_idx, row in enumerate(table.rows): for col_idx, cell in enumerate(row.cells): if cell.text: df_data[row_idx][col_idx] = cell.text.strip() df = pd.DataFrame(df_data) # 将表格写入对应工作表,表名按序号命名 df.to_excel(writer, sheet_name=f"表格{table_idx}", index=False) print(f"已保存:{excel_save_path}") print("所有表格提取完成!")
关键改进说明
- 遍历文档时逐个处理并保存每个表格,避免数据被覆盖
- 优化命名规则,通过“原文件名+表格序号”明确表格来源
- 增加
strip()去除单元格文本的多余空格,提升数据整洁度 - 方案2使用
pd.ExcelWriter实现多工作表写入,完全匹配“每个文档的表格保存为独立工作表”的需求
内容的提问来源于stack exchange,提问作者sunny babau
相关产品推荐
相关产品推荐

