当前位置:首页>python>告别重复劳动,从Excel到Word,Python教你一键按户籍表生成一户一表档案

告别重复劳动,从Excel到Word,Python教你一键按户籍表生成一户一表档案

  • 2026-08-14 23:12:10
告别重复劳动,从Excel到Word,Python教你一键按户籍表生成一户一表档案
作为职场人士,你是否经历过这样的场景?
根据Excel的户籍表生成一户一档的Word文档
根据Excel班级工作表生成Word分班级的学生档案
根据Excel客户分类建立Word客户信息档案……
根据Excel的户籍表生成一户一档的Word文档为例,每当需要为每户家庭单独建立档案时,你是不是需要重复复制粘贴信息,不停地打开/复制、选择性粘贴文本、保存、关闭?这样做既耗时又容易出错。今天分享一个用Python实现的自动化解决方案,帮助你从重复劳动中解放出来。
现有一份某村的Excel版户籍汇总表,样式如下:
需求是以户号为单位,每户生成一份情况登记表。表格第一行为情况 登记表,第二行是需要填写的户号和家庭总人口数,字体为黑体,字号为小四号,第三行为标题行,从第四行起是需要填写的家庭成员信息,字体为宋体,字号为小四号。字体和字号为模板文档中已预先设置好的格式。最终样式如下:
下面的代码是基于Python的pandas和python-docx库,设计的简单脚本,可以自动完成这项繁重的工作,生成的Word文档格式与原模板文档一致,不用再输入文本后调整字体字号。
import pandas as pdfrom docx import Documentdef cell_add(cell,text):    if not cell.paragraphs:        cell.add_paragraph()    para = cell.paragraphs[0]    for run in para.runs:        run.text = ""    if not para.runs:        para.add_run()    para.runs[0].text = str(text)path_xlsx = "户籍汇总表.xlsx"path_docx = "一户一档登记表模板.docx"df = pd.read_excel(path_xlsx)df_group = df.groupby(by="编号")col_list = ["姓名","年龄","性别","与户主关系","身份证","地址"]for name, group in df_group:    doc = Document(path_docx)    group = group.dropna(subset=["姓名"])    name_count = len(group)    table = doc.tables[0]    cell_add(table.rows[1].cells[0], f"户号:{name}")    cell_add(table.rows[1].cells[-1], f"家庭总人口数:共 {name_count} 人")    for i in range(name_count):        for c in range(1,7):            value = group.iloc[i][col_list[c-1]]            cell_add(table.rows[3+i].cells[c],str(value))    doc.save(f"{name}.docx")
一键运行代码后,生成的Word文档很快保存到指定目录,且填充的文本与模板中的原有格式保持一致。
下面我们再来说说详细解析代码的具体作用:
1、自定义函数智能填充单元格。自定义函数cell_add()专门用来处理Word表格单元格文本填充,用新文本替换现有内容,并能确保原有格式不受影响,避免文本重复添加。cell_add()接收两个参数:cell是要添加文本的单元格,text是要添加到单元格中的文本。处理的思路是如果单元格是空的,就先创建一个段落和文本块,然后填入新文本;如果单元格已有内容,就先清空所有旧内容,然后再第一个段落的第一个文本块中填入新的文本。
2、数据分组处理df.groupby(by="编号")这句代码利用的pandas的groupby()分组功能,自动按“编号”列将家庭成员归类,从而实现一户一档的数据准备,groupby()返回的结果类似于字典形式,键是户编号,值为编号为当前编号的Dataframe类型数据。for name, group in df_group就是对这个“字典”的循环遍历,其中name为编号,group是一个包含所有成员信息的Dataframe。
3、容错处理指定空白内容。group = group.dropna(subset=["姓名"])这句代码通过dropna()方法移除“姓名”列为空的行,以确保只处理有效数据。
4、模板化填充单元格。table.rows[1].cells[0]定位到工作的第2行第1个单元格。f"户号:{name}"为填写的内容,使用自定义函数cell_add()把指定文本填充到指定单元格,并且与原格式保持一致。for i in range(name_count)循环遍历当前户的所有成员。for c in range(1,7)循环遍历需要填充的6个信息列,c作为索引。
这段代码不仅适用一户一档的生成,只要稍作修改(如调整路径、分组依据等),还可以轻松应用于学生档案、员工信息表、客户档案等多种场景的批量生成。对于此类重复性劳动,完全没有必要手动操作,办公自动化的应用,可以让我们把更多的精力投入到更有价值的工作中去。

最新文章

随机文章