在日常工作中,为了统计分析数据,跟进项目进度,都会建立各种表格台帐,常常需要从表格提取关键数据,撰写WORD文件,进行管理预警通知。
如果数量较少,手动提取处理,应该问题不大,但如果多达几十份,甚至上百份,工作量将会很大,且均是重复性的工作,这就是今天的问题:如何实现从表格读取多条数据,自动批量导入WORD表格中,生成通知文件?大家可能使用过WORD的邮件合并功能,可以方便实现从EXCEL表中读取数据,批量打印WORD文档,但它与数据源一一对应,如果满足条件的是多条数据时,就很不方便了。下面介绍利用python,实现从EXCEL表中读取数据,批量导入WORD模板表格中,自动生成文件并保存。
1、导入库
import pandas as pd
from docx import Document
from docx.shared import Pt
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
如果运行时,提示没有对应库,使用 pip 在命令行中安装这些库。
2、读取数据
df = pd.read_excel('example .xlsx',sheet_name=1)
文件位置根据实际替换,数据1默认第一个表。
3、设置字体样式
font_size = 12 # 字体大小
font_name = '仿宋' # 字体名称
可根据需要自行更改
4、生成单位名称列表
#抽取单位名称存为列表,用于for循环
xmlist=df['单位名称'].values.tolist()
xmlist=list(set(xmlist)) #名称去重
5、载入Word 模板文件
doc = Document('通知.docx')
target_table = doc.tables[0] # 模板中只有一个表格
target_row = 1 # 要插入数据的目标行
6、替换模板中的单位名称
for run in doc.paragraphs[1].runs:
run.text = run.text.replace('xmname',xmname)
将从列表中读取的单位名称,替换模板指定位置文字。
7、选择符合特定条件的数据
a.条件根据需要进行设定,注意同时满足的条件用&连接
condition = (df['列1'] == xmname) & (df['列2'] > 0) & (df['列3'] < 1)
filtered_data = df.loc[condition]
只保留需要的数据列
filtered_data = filtered_data[["列1","列2","列3"]]
b.设置数据是否为空的判断,因为部分单位不满足条件,没有必要生成空的WORD文档,即当为空时,跳出当前循环。
if filtered_data.empty:
continue
8、将数据插入模板表格的指定位置
for index, row in filtered_data.iterrows():
new_row = target_table.add_row().cells
for col_index, column in enumerate(filtered_data.columns):
cell = new_row[col_index]
cell.text = str(row[column])
9、设置字体样式
导入上面的字体,垂直位置居中,因第三列是数字,靠右好看些,所以加了if判断,即前两列靠左,第三列靠右。
cell.paragraphs[0].runs[0].font.size = Pt(font_size)
cell.paragraphs[0].runs[0].font.name = font_name
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
if col_index < 2: # 前两列水平靠左
cell.paragraphs[0].alignment =WD_PARAGRAPH_ALIGNMENT.LEFT
else: # 第三列水平靠右
cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
10、增加新行,方便插入下一条数据
target_row = 1
11、保存生成的文件
doc.save("D:\\通知\\" xmname ".docx")
文件路径注意用双斜杠"\\",文件名称用对应数据。
好了,先向领导报怨工作量太大,然后泡杯茶,坐等下班[捂脸][捂脸]