批量读取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,文件名中包含的关键字,示例中我使用:SCL90
table_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:
# 文件不存在或不符合模式,记录为空DataFrame
dataframes_list.append(pd.DataFrame())
# 创建DataFrame列表
dfs = []
for data in dataframes_list:
# 将字符串转换为整数
int_data = [int(item[0]) for item in data]
# 创建DataFrame
df = 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:
# 写入第一个DataFrame
df_transposed = dfs[0].T
df_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增加的行数为1
startrow += 1
else:
df_transposed = df.T
df_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文件中。希望这个脚本对你有所帮助!
并不具有普适性,请在修改后使用!
欢迎提出见解和指正错误!