(word文档的格式待设置)
import pandas as pd
import numpy as np
#先安装,再导包
#pip install python-docx
import docx
from docx import Document
#表1:明细_原表全字段输出清单
sj_detail=pd.read_excel(r"E:\XX\XX.xlsx",encoding='utf-8')
#表2:周报明细
sj_code=pd.read_excel(r"E:\XX\XXX.xlsx",encoding='utf-8')
# 构建新字段作为表关联的key:名称+编码
sj_detail['kkey']=sj_detail['名称'].map(str)+'_'+sj_detail['编码'].map(str)
sj_code['kkey']=sj_code['项目名称'].map(str)+'_'+sj_code['编号'].map(str)
#通过新字段关联表1、表2,得到宽表
sj_merge=pd.merge(sj_detail, sj_code, how='left', on=['kkey', 'kkey'],indicator=True)
#筛选表1和表2都有的项目
sj_merge_1=sj_merge[sj_merge['_merge']=='both']
#筛选服务人员姓名为:XXX
sj_merge_2=sj_merge_1[sj_merge_1['人员姓名']=='XXX']
# 只有7条数据
#sj_merge_2.shape
#筛选需要的字段
sj_0=sj_merge_2[['名称','所属地区','金额','单位名称','编码生成时间','内容']]
#日期转字符串格式
sj_0['编码生成时间']=sj_0['编码生成时间'].dt.strftime('%Y-%m-%d')
#选择一个路径,模板和输出文件储存的同一个位置
path=r"E:\XX\excel批量转word"
#循环执行,读取dataframe里的每一个值,依次替换模板里的文字
for table_row in range(0,sj_0.shape[0]):
wordfile = Document(path+'/'+'项目信息表模板1.docx') #每循环一次实例化一个模板word文件
for table_col in range(0,sj_0.shape[1]):
#模板里的的每一个内容对应dataframe的列索引名称,每循环一次读取sj_0的一个列索引,第一次是'名称'
old_text=str(sj_0.columns[table_col])
#每循环一次读取sj_0某行某列的值,第一次是:第一行第一列的值
new_text=str(sj_0.iloc[table_row,table_col])
#使用para.text.replace把模板每个段落里的文字替换成dataframe的值,
#每循环一次替换一个,第一次是第一行第一列的值替换'商机名称'
for para in wordfile.paragraphs:
para.text = para.text.replace(old_text,new_text)
#使用cell.text.replace把模板每个表格里的文字替换成dataframe的值,
#每循环一次替换一个,第一次是第一行第一列的值替换'名称'
for table in wordfile.tables:
for row in table.rows:
for cell in row.cells:
cell.text = cell.text.replace(old_text,new_text)
#储存word文件,文件名称按dataframe的第一列命名,每循环一次读取一个'名称'
file = str(sj_0.iloc[table_row,0])
wordfile.save(path+'/'+f'{file}_项目信息表.docx')