python批量读取word表格写入excel固定位置
01批量填写excel文档
仅提供一种思路和方法,远离复制粘贴!!!!!
一、代码功能概述
本代码用于从指定目录及其子目录中查找特定的 Word 文件(.docx格式),提取文件中指定表格的数据,并将这些数据写入到一个 Excel 模板文件的对应单元格中,最后将修改后的 Excel 文件以特定格式命名并保存。
二、代码分步骤详解
1. 导入必要的库
import os
import pandas as pd
from docx import Document
from openpyxl import load_workbook
os:用于处理文件和目录操作,如遍历目录、拼接文件路径等。
pandas:虽然在当前代码中未实际使用,但常用于数据处理和分析,后续扩展可能会用到。
Document(来自docx库):用于读取和操作.docx格式的 Word 文档。
load_workbook(来自openpyxl库):用于加载和操作.xlsx格式的 Excel 文件。
2. 加载 Excel 模板
# 加载 Excel 模板
wb = load_workbook(r"E:\000代码测试\01office\模板.xlsx")
# 选择目标工作表(如 Sheet1)
sheet = wb["1-不动产登记申请书"]
通过load_workbook函数加载指定路径下的 Excel 模板文件,并选择其中名为 “1 - 不动产登记申请书” 的工作表,后续将在该工作表中写入数据。
3. 定义查找目标文件的函数
def find_target_files(root_dir, target_filename):"""循环遍历文件夹(包括子文件夹),查找指定文件名的文件:param root_dir: 根目录路径:param target_filename: 要查找的固定文件名(如 "数据汇总.xlsx"):return: 找到的文件路径列表"""target_files = []# 遍历根目录下的所有文件和子文件夹for dirpath, dirnames, filenames in os.walk(root_dir):# 检查当前目录下是否有目标文件if target_filename in filenames:# 拼接完整文件路径file_path = os.path.join(dirpath, target_filename)target_files.append(file_path)read_words(target_files)
该函数使用os.walk递归遍历root_dir目录及其子目录,查找名称为target_filename的文件。若找到,将文件的完整路径添加到target_files列表中,并调用read_words函数处理找到的文件。
4. 定义读取 Word 文件数据的函数
def read_words(files):for file_path in files:print(file_path)doc = Document(file_path) tables = doc.tablestable = tables[1] # 索引从0开始,若需其他表格可修改索引# 提取表格数据到列表data = []# 读取表头(第一行)headers = [cell.text.strip() for cell in table.rows[0].cells]# 读取内容行(从第二行开始)for row in table.rows[1:]:row_data = [cell.text.strip() for cell in row.cells]data.append(row_data)权利人姓名 = data[2][2]信用代码 = data[3][4]法定代表人或者负责人 = data[5][2]坐落 = data[15][2]不动产单元号 = data[16][2]宗地面积 = data[18][2]不动产权属证书号 = data[19][2]write_temple(权利人姓名,信用代码,法定代表人或者负责人,坐落,不动产单元号,宗地面积,不动产权属证书号)
该函数遍历传入的 Word 文件路径列表,使用Document类打开每个 Word 文件。选择文件中的第二个表格(索引为 1),提取表头和内容行数据。从提取的数据中获取特定单元格的数据,并将这些数据作为参数传递给write_temple函数。
5. 定义写入 Excel 模板的函数
def write_temple(权利人姓名,信用代码,法定代表人或者负责人,坐落,不动产单元号,宗地面积,不动产权属证书号):data_to_write = {"E15": 权利人姓名, # A2单元格写入权利人姓名"E29": 不动产单元号, # A2单元格写入权利人姓名"H16": 信用代码, # B2单元格写入信用代码"E18": 法定代表人或者负责人, # E2单元格写入不动产单元号"E17": 坐落, # F2单元格写入宗地面积"E29": 不动产单元号, # G2单元格写入不动产权属证书号"E30": 宗地面积, "E31": 不动产权属证书号,
}# 遍历字典,将值写入对应单元格for cell_coord, value in data_to_write.items():# print(cell_coord)sheet[cell_coord] = value# 保存为新文件(避免覆盖原模板)wb.save(rf"E:\000代码测试\01office\{不动产单元号}filled_template.xlsx")
该函数接收从 Word 文件中提取的数据,将数据整理成字典data_to_write,其中键为 Excel 单元格坐标,值为要写入的数据。通过遍历字典,将数据写入到之前选择的 Excel 工作表的对应单元格中,最后以包含不动产单元号的文件名保存修改后的 Excel 文件。
6. 主程序入口
if __name__ == "__main__":# 1. 设置要遍历的根目录(可替换为实际路径,如 "D:/我的文件夹")root_directory = r"E:\000代码测试\01office\测试文件"# 2. 设置要提取的固定文件名(如 "模板.docx"、"汇总表.xlsx" 等)target_name = "1不动产登记申请书.docx" # 替换为你需要查找的文件名# 3. 查找目标文件result = find_target_files(root_directory, target_name)
在主程序中,指定要遍历的根目录root_directory和要查找的目标文件名target_name,调用find_target_files函数开始执行整个流程。
三、进一步提升优化建议
当前代码在文件不存在、读取或写入失败等情况下可能会报错并中断执行。可以添加try-except语句捕获异常,例如在load_workbook、Document等操作时捕获文件读取错误,在wb.save时捕获保存失败的错误,并进行适当的日志记录或提示。
try:wb = load_workbook(r"E:\000代码测试\01office\模板.xlsx")
except FileNotFoundError:print("Excel模板文件不存在!")# 可以添加重试逻辑或退出程序的处理
四、完整代码
import os
import pandas as pd
from docx import Document
from openpyxl import load_workbook# 加载 Excel 模板
wb = load_workbook(r"E:\000代码测试\01office\模板.xlsx")
# 选择目标工作表(如 Sheet1)
sheet = wb["1-不动产登记申请书"]def find_target_files(root_dir, target_filename):"""循环遍历文件夹(包括子文件夹),查找指定文件名的文件:param root_dir: 根目录路径:param target_filename: 要查找的固定文件名(如 "数据汇总.xlsx"):return: 找到的文件路径列表"""target_files = []# 遍历根目录下的所有文件和子文件夹for dirpath, dirnames, filenames in os.walk(root_dir):# 检查当前目录下是否有目标文件if target_filename in filenames:# 拼接完整文件路径file_path = os.path.join(dirpath, target_filename)target_files.append(file_path)read_words(target_files)
def read_words(files):for file_path in files:print(file_path)doc = Document(file_path) tables = doc.tablestable = tables[1] # 索引从0开始,若需其他表格可修改索引# 提取表格数据到列表data = []# 读取表头(第一行)headers = [cell.text.strip() for cell in table.rows[0].cells]# 读取内容行(从第二行开始)for row in table.rows[1:]:row_data = [cell.text.strip() for cell in row.cells]data.append(row_data)权利人姓名 = data[2][2]信用代码 = data[3][4]法定代表人或者负责人 = data[5][2]坐落 = data[15][2]不动产单元号 = data[16][2]宗地面积 = data[18][2]不动产权属证书号 = data[19][2]write_temple(权利人姓名,信用代码,法定代表人或者负责人,坐落,不动产单元号,宗地面积,不动产权属证书号)def write_temple(权利人姓名,信用代码,法定代表人或者负责人,坐落,不动产单元号,宗地面积,不动产权属证书号):data_to_write = {"E15": 权利人姓名, # A2单元格写入权利人姓名"E29": 不动产单元号, # A2单元格写入权利人姓名"H16": 信用代码, # B2单元格写入信用代码"E18": 法定代表人或者负责人, # E2单元格写入不动产单元号"E17": 坐落, # F2单元格写入宗地面积"E29": 不动产单元号, # G2单元格写入不动产权属证书号"E30": 宗地面积, "E31": 不动产权属证书号,
}# 遍历字典,将值写入对应单元格for cell_coord, value in data_to_write.items():# print(cell_coord)sheet[cell_coord] = value# 保存为新文件(避免覆盖原模板)wb.save(rf"E:\000代码测试\01office\{不动产单元号}filled_template.xlsx")if __name__ == "__main__":# 1. 设置要遍历的根目录(可替换为实际路径,如 "D:/我的文件夹")root_directory = r"E:\000代码测试\01office\测试文件"# 2. 设置要提取的固定文件名(如 "模板.docx"、"汇总表.xlsx" 等)target_name = "1不动产登记申请书.docx" # 替换为你需要查找的文件名# 3. 查找目标文件result = find_target_files(root_directory, target_name)