解决痛点:一招搞定如何根据Excel批量生成Word文档,以社区调查为例——Python模块化操作深度解析
- 2026-09-17 12:07:01
解决痛点:一招搞定如何根据Excel批量生成Word文档,以社区调查为例——Python模块化操作深度解析在日常办公过程中,你是否遇到过“根据一份Excel总表生成多个Word文档”的问题?如:社区人口调查,根据所有住户家庭成员信息的Excel总表,逐户生成Word文档的分表,并以“住址+户主姓名”命名保存到指定的文件夹。简单要求可以通过邮件合并功能来实现,但对于复杂需求,这一功能稍显不足。 下面以Python为例,逐步拆解核心逻辑和关键技术点。 1、读取Excel格式的网格户主信息表,表中包含了户主及成员的姓名、性别、身份证信息、工作信息等内容。 
2、以家庭住址作为依据进行分组,再把分组后的信息逐一写入模板,一户生成一份Word文档。 3、将Excel中的信息区分户主和家庭成员,分类填充到Word模板的指定表格中。 
4、Word文档命名规则为:住址+户主姓名。 5、统计生成的文档数量、无户主信息的异常家庭户,及运行耗时。 实现过程:针对Excel读取、Word写入和保存,可选择VBA,也可选择Python。建议选择Python,原因代码少且简单易懂,流程清晰模块化,运行高效。 以上代码整体思路:初始化——数据读取与预处理——按户分组——信息填充和文档保存——输出结果。模块化的结构方便后续功能的扩展,即便是新手也能快速理解并上手操作。 代码运行效果如下: 

第1-9行:导入模块和初始化配置(时间记录和文档路径)。 第11-17行:定义Word表格填充位置映射字典。户主信息字典table_hz键为户主字段,值为列表,代表需要填充的行号和列号。可根据实际增减字段和调整行号、列号。家庭成员信息字典table_cy键是字段名,值为列号,一行一个成员信息。 第19-21行:创建no_huzhu_list空列表用于收集无户主信息的家庭户,方便后续核实。huzhu_num初始值为0,用于统计成功生成Word文档的户数。 第23-24行:读取数据并对出生年月做格式化处理。pd.to_datetime()将日期格式、文本格式和数字格式的日期转换为pandas的datetime类型,再通过dt.strftime()格式化为“年-月-日”形式。 第26行:按家庭住址分组。df.groupby(by="家庭住址")可以实现数据分组,返回一个分组对象df_group,实现“一户一组”的效果。 第27行:遍历分组。for address,cy_data in df_group一句中,address是当前组的住址,cy_data是当前户所有家庭成员的集合。 第28-29行:加载Word模板,获取文档第一个表格。在此外加载Word模板,可以确保每个模板都为空文档,避免干扰。doc.table[0]获取Word文档第一个表格。 第31行:筛选户主信息。cy_data[cy_data["称谓"]=="户主"]从当前家庭成员中筛选出“称谓”为“户主”的行。 第33行:户主信息校验:if not huzhu_data.empty判断户主信息筛选结果,非空则执行填充信息,否则将地址添加到异常列表。 第36-37行:填充户主信息。通过遍历table_zh字典,table.cell(r,c).text=str(huzhu[v])将户主信息填充加指定位置。特别注意,将huzhu[v]转换为字符串是为了避免数字、日期等类型直接赋值报错。 第39-41行:填充家庭成员信息。table.cell(8+i,int(v)).text = row[k]中家庭成员起始行为8,列号由table_cy字典指定。 第43行:保存文档。{address}_{huzhu["姓名"]}实现一户一文档。 第49-52行:输出结果。 这段代码只有50余行,实际代码量只有30多行,主要解决了“Excel汇总——Word单独文档生成”的问题,只需修改文件路径和Word填充位置字典即可适配其他类似的办公场景,还可以增加文件夹创建、修改Word格式等,方便二次开发。
一、 需求场景


二、完整代码
import pandas as pdfrom docx import Documentimport time#记录程序开始运行时间s_t = time.time()#word模板路径和Excel数据路径doc_path = r"D:\社区调查\人口基础信息采集表.docx"xls_path = r"D:\社区调查\网格名单.xlsx"#户主信息在Word表格中的位置:行号+列号table_hz = {"姓名":[1,2],"性别":[1,5],"出生年月":[1,9],"民族":[2,2],"户籍地":[2,5],"联系方式":[2,9],"政治面貌":[4,2],"公民身份号码":[4,5],"家庭住址":[5,4],"是否外务工":[6,4]}#家庭成员各字段在Word表格的中列位置table_cy = {"称谓":1,"姓名":2,"公民身份号码":4,"户籍地":5,"政治面貌":6,"是否外务工":8,"工作/学习单位":9}#无户主的家庭no_huzhu_list = []#生成Word文档的数量huzhu_num = 0#读取所有户信息df = pd.read_excel(xls_path)df["出生年月"] = pd.to_datetime(df["出生年月"]).dt.strftime("%Y-%m-%d")#根据家庭住址分组df_group = df.groupby(by="家庭住址")for address, cy_data in df_group:doc = Document(doc_path)table = doc.tables[0]#筛选出当前户的户主huzhu_data = cy_data[cy_data["称谓"] == "户主"]#校验户主信息是否存在if not huzhu_data.empty:huzhu = huzhu_data.iloc[0]#填充户主信息到Word表格指定位置for v, [r,c] in table_hz.items():table.cell(r,c).text = str(huzhu[v])#填充家庭成员到Word表格指定位置,包括户主for i,(_,row) in enumerate(cy_data.iterrows()):for k,v in table_cy.items():table.cell(8+i,int(v)).text = row[k]#保存Word,文件以家庭住址+户主命名doc.save(rf"D:\社区调查\{address}_{huzhu['姓名']}.docx")huzhu_num += 1else:#无户主信息列表no_huzhu_list.append(address)#输出处理结果print(f'共保存{huzhu_num}户信息')print(f'以下{len(no_huzhu_list)}户无户主信息,请核实')print(f'{"\n".join(no_huzhu_list)}')print(f'用时{time.time()-s_t:.2f}秒')


三、代码解析
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。